8560|19

2144

帖子

3

TA的资源

五彩晶圆(中级)

楼主
 

【TI首届低功耗设计大赛】PM2.5传感器驱动+测试 [复制链接]

 
恩,中午吃过饭,花了点时间写了一下DSM501A的驱动,蛮简单,说白了还是msp430好用,寄存器清晰,头文件定义好,都不要怎么看UG的。

先来看下这个传感器,集成度很高,用户接口也比较简单,看起来像数字传感器,其实很有模拟的味道。
1)电气参数


2)内部结构



3)数据输出接口和曲线


恩基本上比较清晰了,对了这个传感器默认可以测量2.5um和1um的颗粒个数,有两个PWM输出端,其中有一个端可以调节测量颗粒的大小。
看输出波形的图可知,测量主要在传感器稳定工作后在任意的30s内测量到输出波形的低电平时间对这个时间进行累计,最后计算出低脉冲率即可换算成粒子数,这里调试我选择比较简单的曲线也就是MIN这条曲线,便于计算。

顺便说一下,这个传感器是5V供电的,所以我在我的扩展板上面添加了5V电源接口,也通过LDO转换到3.3v供板子使用,因为我的WIFI用板载电源起不来。
所以这里也需要注意传感器出来的波形参考电压高电平时5V基准,默认和msp430通讯是需要做点平转换的ti有蛮多这种芯片,当然用两个三极管搭个电路也简单或者电阻分压。其实通过对PWM输出信号的分析可以用更简单的方式来做,串联一个10k的限流电阻就行了,根据实际情况而定,灵活应对。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

好了,继续说说驱动如何写,很简单,没做什么接口函数,基本上寄存器操作,涉及到两个定时器,一个用于定时30s一个用于捕获输入测量时间。
这里说一下捕获低电平的时间测量方法吧,认为默认的捕获点评为高,需要捕获到低的那一部分。需要设置两次捕获的条件,分别为下降沿和上升沿,当然也可以采用IO中断配合的方式。我这里采用两次设置捕获条件。

---------------           -------------------------       ---------
                 ----------                            ------
               1            2

我采用P1.3为捕获引脚,这个是TA1的CCR2通道

看我上面的草图吧,设置两个捕获点分别为1和2,具体设置
1)默认是采用fall edge捕获中断
2)在1的位置fall edge捕获到,这时候改变为rise edge捕获中断,同时清除CCR2的值,需要清除TA1的计数器
3)在2的位置rise edge捕获到,这时候记录CCR2的值,并再次切换为fall edge捕获中断,一直这样就行了

整个测量周期受30s定时控制,细节的我贴个程序,有兴趣的可以看下。
  1. /**
  2. * @brief  Timer1_A1_ISR
  3. * @note   Timer1_A1中断
  4. * @param  none
  5. * @retval none
  6. */
  7. #pragma vector = TIMER1_A1_VECTOR
  8. __interrupt void Timer1_A1_ISR(void)
  9. {
  10.         switch ( __even_in_range(TA1IV, TA0IV_TAIFG) )
  11.         {
  12.         case TA1IV_TA1CCR1:
  13.                 break;

  14.         case TA1IV_TA1CCR2:
  15.         {
  16.                 /* 判断是否为下降沿捕获中断,切换到上升沿捕获中断,并清除CCR2 */
  17.                 if ( (TA1CCTL2&0xC000) == CM_2 ) {
  18.                         TA1CCTL2 = CM_1 | CCIS_0 | SCS | CAP | CCIE;
  19.                         TA1CCR2  = 0;
  20.                         TA1CTL  |= TACLR;
  21.                 } else if ( (TA1CCTL2&0xC000) == CM_1 ) {
  22.                         TA1CCTL2 = CM_2 | CCIS_0 | SCS | CAP | CCIE;
  23.                         DSM501A_LOW_PULSE_TIME += (TA1CCR2/32);
  24.                 }
  25.         } break;

  26.         case TA1IV_TA1IFG:
  27.                 break;

  28.         default:
  29.                 break;
  30.         }
  31. }
复制代码

  1. /**
  2. * @brief  Timer0_A0_ISR
  3. * @note   Timer0_A0中断
  4. * @param  none
  5. * @retval none
  6. */
  7. #pragma vector = TIMER0_A1_VECTOR
  8. __interrupt void Timer0_A1_ISR(void)
  9. {
  10.         switch(__even_in_range(TA0IV, TA0IV_TAIFG))
  11.         {
  12.         case TA0IV_NONE:
  13.                 break;               // No interrupt

  14.         case TA0IV_TACCR1:
  15.                 DSM501A_Measu_Cycle++;

  16.                 /* 一次DSM501测量结束,转换为百分比 ,
  17.                  * 低脉冲率:RT=LT/UTx100%
  18.                  */
  19.                 if (DSM501A_Measu_Cycle >= 30) {
  20.                         DSM501A_Measu_Cycle    = 0;
  21.                         DSM501A_PM2P5_VALUE    = DSM501A_LOW_PULSE_TIME/300.0;
  22.                         DSM501A_LOW_PULSE_TIME = 0;
  23.                         DSM501A_PM2P5_SENS     = (DSM501A_PM2P5_VALUE/2.0)*1000;

  24.                         DHT_Read(DHT11_Measu_Data);
  25.                 }
  26.                 break;               // CCR1 not used

  27.         case TA0IV_TACCR2:
  28.                 DHT11_Measu_Cycle++;
  29.                 if (DHT11_Measu_Cycle >= 10) {
  30.                         DHT11_Measu_Cycle = 0;
  31.                         DHT_Read(DHT11_Measu_Data);
  32.                 }
  33.                 break;               // CCR2 not used

  34.         case TA0IV_3:
  35.                 break;               // reserved

  36.         case TA0IV_4:
  37.                 break;               // reserved

  38.         case TA0IV_5:
  39.                 break;               // reserved

  40.         case TA0IV_6:
  41.                 break;               // reserved

  42.         case TA0IV_TAIFG:
  43.                 break;                    // overflow

  44.         default: break;
  45.         }
  46. }
复制代码
暂时没有做功耗控制的思想,我也只能说是低功耗控制的思想了,因为我的外设很费电,不过不影响,低功耗还是要做的。

一些定时器配置:
  1. /**
  2. * brief  Timer0_A0_Init
  3. * note   Timer0_A0初始化---led闪烁freq定时器
  4. * param  None
  5. * retval None
  6. */
  7. void Timer0_A0_Init(void)
  8. {
  9.         TA0CCTL0 = CCIE;                                                          // TACCR0 interrupt enabled
  10.         TA0CCR0  = 32768;
  11.         TA0CTL   = TASSEL__ACLK | MC__UP | TACLR;                   // ACLK, up mode, clear TAR
  12. }


  13. /**
  14. * brief  Timer0_A1_Init
  15. * note   Timer0_A1初始化---DSM501A测量周期
  16. * param  None
  17. * retval None
  18. */
  19. void Timer0_A1_Init(void)
  20. {
  21.         TA0CCR1  = 32768;
  22.         TA0CTL   = TASSEL__ACLK | MC__UP | TACLR;                   // ACLK, up mode, clear TAR
  23.         TA0CCTL1 = CCIE;                                                                                // TACCR1 interrupt enabled
  24. }

  25. /**
  26. * brief  Timer0_A2_Init
  27. * note   Timer0_A2初始化---DHT11测量周期
  28. * param  None
  29. * retval None
  30. */
  31. void Timer0_A2_Init(void)
  32. {
  33.         TA0CCR2  = 32768;
  34.         TA0CTL   = TASSEL__ACLK | MC__UP | TACLR;                   // ACLK, up mode, clear TAR
  35.         TA0CCTL2 = CCIE;
  36. }


  37. /**
  38. * brief  Timer1_A2_Init
  39. * note   Timer1_A2初始化---CCR2捕获DSM501A传感器
  40. * param  None
  41. * retval None
  42. */
  43. void Timer1_A2_Init(void)
  44. {
  45.         P1SEL0 |= BIT3;
  46.         P1SEL1 &= ~BIT3;
  47.         P1DIR  &= ~BIT3;
  48.         TA1CCTL2 = CM_2 | CCIS_0 | SCS | CAP | CCIE;                        // Fall edge, CCI2A, Sync capture, Capture mode, Capture interrupt
  49.         TA1CTL   = TASSEL__ACLK | MC__CONTINUOUS | TACLR;                // ACLK, up mode, clear TAR
  50. }
复制代码

这里需要注意对端口的设置,这个不能凭感觉拉,要看数据手册



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PM2.5测试:

数据1


数据2


数据3


关于PM2.5单位问题不做解释,有兴趣的可以关注一下相关资料,贴一个百度知道的问答。

  1. x pcs=x particles  意思是x个粒子
  2. /283ml=每283毫升
  3. 用283ml是因为国内的标准都是在追逐美国的标准,而美国一般用ft3作为体积单位,也就是立方英尺,一个立方英尺=28.3L  283ml=0.01ft3,美国人用起来得心应手,我们就会觉得别扭了。
  4. x pcs/283ml的意思是每283毫升里面有多少个粒子
  5. 而毫克/立方的单位是指每立方里的粒子有多重。
  6. 这两个单位的换算,除非是单分散的粒子(所有的粒子大小基本相当),否则需要根据粒子大小,所占比例等情况,结合粒子重量,才能计算出x pcs/283ml 的毫克/立方的值。
  7. 目前,市面上好像还没有一款仪器能同时测量粒子数浓度和粒子质量浓度的,原因就是计算太麻烦。
  8. 如果要得到毫克/立方的数,推荐选择能够直接测量毫克/立方的仪器。
  9. 计算关系可参考资料:http://wenku.baidu.com/view/1de7f4f77c1cfad6195fa715.html
复制代码


最新回复

请问这个DSM501A最后的测量数值怎么和PM2.5对应起来  详情 回复 发表于 2016-4-19 16:44
 
点赞 关注
个人签名电工

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
再啰嗦一句,wifi采用sta连接的方式便于解决穿透性问题。便于后面扩展连接到公共平台交互
 
个人签名电工
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

板凳
 
我在想有没有必要做一个FRAM_log这样数据展现就是个问题,要曲线啊,难道还得弄下qt+qwt。不太想折腾了,涉及蛮多东西的
 
个人签名电工
 
 

回复

222

帖子

0

TA的资源

一粒金砂(高级)

4
 
请问上位机是用什么软件编写的

点评

那个图片不是上位机哦 杭州市的实时PM2.5值,web上的  详情 回复 发表于 2014-10-18 22:28
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
这个模块多少钱啊

点评

很便宜30块左右的人民币  详情 回复 发表于 2014-10-18 22:28
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

6
 
jishuaihu 发表于 2014-10-18 21:54
这个模块多少钱啊

很便宜30块左右的人民币

点评

淘宝买的?给个链接  详情 回复 发表于 2014-10-18 22:51
 
个人签名电工
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

7
 
luooove 发表于 2014-10-18 21:16
请问上位机是用什么软件编写的

那个图片不是上位机哦
杭州市的实时PM2.5值,web上的

点评

嗯,还以为是做的  详情 回复 发表于 2014-10-18 22:44
 
个人签名电工
 
 

回复

222

帖子

0

TA的资源

一粒金砂(高级)

8
 
lyzhangxiang 发表于 2014-10-18 22:28
那个图片不是上位机哦
杭州市的实时PM2.5值,web上的

嗯,还以为是做的
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

9
 
lyzhangxiang 发表于 2014-10-18 22:28
很便宜30块左右的人民币

淘宝买的?给个链接

点评

淘宝搜索dsm501a很多 基本都是30块左右 随便选个  详情 回复 发表于 2014-10-19 13:18
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

10
 
jishuaihu 发表于 2014-10-18 22:51
淘宝买的?给个链接

淘宝搜索dsm501a很多 基本都是30块左右
随便选个
 
个人签名电工
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼主高人啊,你的程度是用什么编的,Python么,能移植到树莓派里边么
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
你好 可以加下QQ695562628么?我有些问题想询问你 关于2.5模块的  现在等级不够发送不了消息

点评

没问题,。  详情 回复 发表于 2015-7-3 22:45
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
麻烦楼主了谢谢了 好人一生平安啊
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

14
 
JOHUANGLU 发表于 2015-7-3 21:13
你好 可以加下QQ695562628么?我有些问题想询问你 关于2.5模块的  现在等级不够发送不了消息

没问题,。
 
个人签名电工
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主有打印过PM2.5测量数据么,连续采集几百组,绘制成曲线,数据跳变大么
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

16
 
,作为新人,好好学些,天天向上!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 
544917044可以加个扣扣交流一下吗?大神求回复

点评

遇到技术性的问题,可以单独开贴提问!  详情 回复 发表于 2015-11-19 11:29
 
 
 

回复

6066

帖子

92

TA的资源

裸片初长成(初级)

18
 
乔小米 发表于 2015-11-19 11:27
544917044可以加个扣扣交流一下吗?大神求回复

遇到技术性的问题,可以单独开贴提问!
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

19
 
dsm501a是一款红外粉尘传感器,你应该用一款激光的,那样才显得高端,大气,上档次
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

20
 
请问这个DSM501A最后的测量数值怎么和PM2.5对应起来
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表