打印

哪位大神用过空气质量传感器dsm501啊

[复制链接]
2605|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
电子过客|  楼主 | 2014-7-19 21:04 | 只看该作者
做过这个项目的大师 指点下吧呵呵

使用特权

评论回复
板凳
zhangmangui| | 2014-7-20 17:42 | 只看该作者
具体没用过    周期是不是一定的呢    高电平能采不
不行就取反吧   关于采集的方法   如单片机中有带捕获单元就采集比较准确了

使用特权

评论回复
地板
电子过客|  楼主 | 2014-7-20 20:46 | 只看该作者
zhangmangui 发表于 2014-7-20 17:42
具体没用过    周期是不是一定的呢    高电平能采不
不行就取反吧   关于采集的方法   如单片机中有带捕获 ...

采样周期一定,是30s采集一次,传感器要的就电平时间的总和,所以采高电平就算麻烦了吧
您的说的捕获单元 方法没太明白能给点提示吗

使用特权

评论回复
5
zhangmangui| | 2014-7-20 20:53 | 只看该作者
电子过客 发表于 2014-7-20 20:46
采样周期一定,是30s采集一次,传感器要的就电平时间的总和,所以采高电平就算麻烦了吧
您的说的捕获单元 ...

捕获单元就是   单片机的捕获引脚可以做到检测上升沿或下降沿
检测到沿之后会自动触发一个计数器去计数    通过两次的触发可以知道引脚电平持续的时间长短

使用特权

评论回复
6
电子过客|  楼主 | 2014-7-20 21:14 | 只看该作者
zhangmangui 发表于 2014-7-20 20:53
捕获单元就是   单片机的捕获引脚可以做到检测上升沿或下降沿
检测到沿之后会自动触发一个计数器去计数   ...

我也想过不过这种计算好几挺麻烦的,
把计数器计算的个数都加起来,在转换成时间 好像程序有点麻烦,所以没敢多想
这里表示感谢:lol

使用特权

评论回复
7
fp123123| | 2014-7-20 23:07 | 只看该作者
#define SampleCount 300000

uint32 dsmStatTimes,sumTimeofLow10,sumTimeofLow25;
float Low10,Low25;

for(;;)
{
  dsmStatTimes++;
  if((PINB & _BV(PB0))==0) sumTimeofLow10++;
  if((PINB & _BV(PB1))==0) sumTimeofLow25++;
   
  if(dsmStatTimes>=SampleCount)
  {
    Low10 = sumTimeofLow10 / (float)dsmStatTimes;
    Low25 = sumTimeofLow25 / (float)dsmStatTimes;

    dsmStatTimes = 0;
    sumTimeofLow10 = 0;
    sumTimeofLow25 = 0;
  }
}

使用特权

评论回复
评论
suyuxing 2018-5-30 11:31 回复TA
可以来份关于这个传感器的参考程序吗,谢谢! 
8
电子过客|  楼主 | 2014-7-21 08:37 | 只看该作者
fp123123 发表于 2014-7-20 23:07
#define SampleCount 300000

uint32 dsmStatTimes,sumTimeofLow10,sumTimeofLow25;

大侠,小弟愚笨没看懂 请明示下
您的#define SampleCount 300000 是不是吧30s内分成1ms采集的次数啊?
在30s内采集每1ms采集PINB电平 如果是低电平就进行相加,
最后低电平ratio=低电平次数/300000 对吗
Low10,Low25; 为什么采集俩个管脚,难到是DSM 的VOUT1 ,和VOUT2的两个输出端吗


使用特权

评论回复
9
fp123123| | 2014-7-21 12:13 | 只看该作者
电子过客 发表于 2014-7-21 08:37
大侠,小弟愚笨没看懂 请明示下
您的#define SampleCount 300000 是不是吧30s内分成1ms采集的次数啊?
在 ...

这个是主程序的循环,不带时间控制,以能够达到的最高速度运行,所以如果samplecount太小,可能1ms都不到就运行完了,失去采样意义,你要自己测试一下300000会运行多久,修改这个参数达到你需要的刷新率,例如你希望3秒更新一次,就把这个参数调节到3秒刚好跑完

使用特权

评论回复
10
fp123123| | 2014-7-21 12:15 | 只看该作者
采集两个端口,分别是1.0 2.5微米的颗粒数,你可以不采集1.0的,就只需要一个端口

使用特权

评论回复
11
fp123123| | 2014-7-21 12:16 | 只看该作者
相对于单片机的速度,DSM501的高低电平更新速度很慢的,印象中只有几十Hz,所以用这个采样方法足够了

使用特权

评论回复
12
电子过客|  楼主 | 2014-7-21 13:27 | 只看该作者
fp123123 发表于 2014-7-21 12:16
相对于单片机的速度,DSM501的高低电平更新速度很慢的,印象中只有几十Hz,所以用这个采样方法足够了 ...

谢谢你的解答,看了我把dsm501手册没活用,
开始我还认为您把30s分成30000分等分,这样正好每1ms采集单片机管脚的电平,就采集30000次,:)
您这样设置samplecoun大小不受时间控制,能解决更新周期
随着环境变化30s更新太慢,显的传感器不灵活

使用特权

评论回复
13
fp123123| | 2014-7-21 21:52 | 只看该作者
你先用这个方法做一个版本,然后继续优化,做一个30单元的32位整数数组,每次采样1秒,然后把结果按先进先出的顺序送入数组,等数组里有30个有效数据后,全部加起来就可以得到过去30秒的测量值,这样就可以做到1秒更新一次最近30秒的测量值

使用特权

评论回复
14
电子过客|  楼主 | 2014-7-21 22:56 | 只看该作者
fp123123 发表于 2014-7-21 21:52
你先用这个方法做一个版本,然后继续优化,做一个30单元的32位整数数组,每次采样1秒,然后把结果按先进先 ...

高人,这个办法妙,长知识了,不断用数字30个有效数值去出30的计算,但是一秒钟采用一次数
会不是影响准确性,因为采集的不频繁
我第一次接触还没用过,您说过他更新太慢,有几十HZ,  但是不敢尝试了
谢谢您的指点

使用特权

评论回复
15
fp123123| | 2014-7-21 23:09 | 只看该作者
不是一秒钟采样一次,而是把一秒里连续采样得到的统计数字记录下来放到数组

使用特权

评论回复
16
电子过客|  楼主 | 2014-7-22 08:42 | 只看该作者
fp123123 发表于 2014-7-21 23:09
不是一秒钟采样一次,而是把一秒里连续采样得到的统计数字记录下来放到数组 ...

那您的意思是定时1s钟,在1s钟内采集dsm501输出的高低电平,放入数组中,先进先出的原则,计算时候是1s钟内采集最后30个有效数值,的计算吗, 刚接手项目,让您费心了,

使用特权

评论回复
17
fp123123| | 2014-7-22 22:10 | 只看该作者
电子过客 发表于 2014-7-22 08:42
那您的意思是定时1s钟,在1s钟内采集dsm501输出的高低电平,放入数组中,先进先出的原则,计算时候是1s钟 ...

不是这样,按下面的流程:

无限循环
{
  dsmStatTimes和sumTimeofLow25清零
  连续采集1S,2个统计结果保存到2个数组最后一个单元:dsmStatTimes[29],sumTimeofLow25[29]
  2个数组分别累加0 - 29单元,累加结果就是最近30秒的统计结果,输出结果
  数组前移:1->0 2->1 ... 29->28  
}

使用特权

评论回复
18
电子过客|  楼主 | 2014-7-22 22:28 | 只看该作者
非常感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

205

帖子

2

粉丝