求助风速测速的程序解决办法(补充了整套系统的设计思路,给大家参考)
本帖最后由 shenhaiyu 于 2012-10-9 22:54 编辑RT,由于研究需要,本人想在一块Arduino UNO上实现测风速的功能,遇到点问题,哪位高手能帮助解决一下呢。
在TB上搜寻风速传感器的结果是:
电压输出的风杯式传感器并不理想,启动风速要求很高,但是我却要测量小风的风速,精度要求也并不高。于是我购买了一款便宜的测风仪器:
打算拆开后把传感器部分组装到我的电路中。拆开后发现里面测风速的部分就是一个光耦,风杯每旋转一周光耦会输出四个脉冲信号。
本来这样就能解决我测风速的功能需求了,但是新的问题又来了:
我的 Arduino UNO 要同时实现时间功能,测量温湿度、重量和风速,还要LCD输出,还要SD卡记录,基本上端口都占用了,只剩下模拟3,4,5可用。更重要的是不能使用外部中断,怕影响时间部分的工作,而且loop中使用了ProtoThreads,时间轮片是1ms,不方便在这里测量风速,大家有没有什么好办法在某个函数中就实现测风速的功能呢?
难道只能用另一块Arduino板子实现测风速功能以电压方式传递给主板吗?
补充的系统需求:
感觉我要做的东西太复杂,貌似快超出arduino的能力了。
首先是输入输出:
1.测量部分:
测量重量(主要是拉力,配合变送器已经实现了单接口数据实时接收,不存在时间问题。但却要使用一个舵机实现称量,具体机械上的设计我就不解释了,总之一定要用舵机),
温度湿度(使用了AM2305,每次数据采集不能小于2s,第一个在时间上的需求),
风速(目前来看再来块nano单独采集比较好,想准确测量必须要有外部中断,一但外部中断了就影响别的部分了)
2.时间部分:使用了DS1302
3.显示部分:使用了LCD5110
4.记录部分:使用了SD卡记录
我的 Arduino UNO 端口使用:
02-04:DS1302时钟
05-09:LCD 5110
10-13:SD卡
14(A0)重量便送器
15(A1)AM2305温湿度传感器
16(A2)舵机信号
17(A3)功能设置按钮
所以目前仅剩18(A4)-19(A5)空闲,一个还要用来测风速,我还在考虑舵机是不是需要个继电器来断电,于是最后一个口也用了。
然后是功能部分:
要实现的功能是每隔一定时间(比如5分钟,10分钟等,可设置)记录温湿度和风速数据到SD卡中,然后每隔一定时间(半小时或者1小时)记录一次重量(这里解释一下,我的系统用的是吊秤称量方式,而且称量的物件平时必须接触地面,称量时提起),于是就用到了舵机,到时间起吊,称量,放下,这样就又造成了程序上的时间滞后,要等待舵机响应。
总结一下,时间要至少每秒更新,测风速要外部中断,温湿度要2s以上采集一次,要等待舵机动作,要每隔一定时间读数据写SD卡,液晶屏更新又不能太快,否则显示会滞留,于是各种冲突都来了。目前别的问题我都用ProtoThreads解决了,唯独测风速把程序全打乱了,这才来这里求助大家的。 问题是,你要做的这些个事情,真的需要这么高的实时性么? 本帖最后由 shenhaiyu 于 2012-10-7 13:31 编辑
飞翔的红猪 发表于 2012-10-7 13:15 static/image/common/back.gif
问题是,你要做的这些个事情,真的需要这么高的实时性么?
需要的啊,但不要求太精确,我可以再详细描述一下:我测量重量的时候是要配合风速的,而且重量是间隔一定时间测量的,比如每半小时测量一次。重量受风速影响,风大的时候不测重,等待风小到阈值以内马上记录重量。所以程序不能被中断,一中断就影响别的部分正常工作了 路过,貌似我不太会,帮顶个{:soso_e130:} 既然速度低,那可以测脉冲周期,估计能达到20转/s的精度,潜在的问题就是转速高了错过了电压跳变,如果不用中断 Tim 发表于 2012-10-7 13:50 static/image/common/back.gif
路过,貌似我不太会,帮顶个
谢谢帮顶,有什么别的好思路不吝指教啊 本帖最后由 shenhaiyu 于 2012-10-7 14:25 编辑
Malc 发表于 2012-10-7 14:12 static/image/common/back.gif
既然速度低,那可以测脉冲周期,估计能达到20转/s的精度,潜在的问题就是转速高了错过了电压跳变,如果不用 ...
错过了跳变没问题,不在乎这点误差。关键是这样的话,程序岂不是又停在了测脉冲周期这里了,别的部分都暂停工作了。比如LCD上显示的实时更新,重量变化的测量等等,而且loop里用了ProtoThreads,1ms才循环一次…… 我觉得,端口不够问题,可以外接扩展芯片(比如595之类的);还有关于实时性,我觉得有点顾头不顾尾,你要的实现的功能占用了好多的时间,是用中断,还是自己写个函数放在loop()里?可以试下,慢慢调,我就会这了:'( shenhaiyu 发表于 2012-10-7 14:21 static/image/common/back.gif
错过了跳变没问题,不在乎这点误差。关键是这样的话,程序岂不是又停在了测脉冲周期这里了,别的部分都 ...
测周期花不了多少时间的,也不会影响其他代码
在检测开始,读取电平,设置一个时间点
然后每个时间片这个函数不断检测电平,如果电平变化了,记下当前时间
两个时间相减就是周期了 本帖最后由 shenhaiyu 于 2012-10-7 20:11 编辑
Malc 发表于 2012-10-7 16:01 static/image/common/back.gif
测周期花不了多少时间的,也不会影响其他代码
在检测开始,读取电平,设置一个时间点
然后每个时间片这 ...
关键是我用了ProtoThreads,loop里时间片是1ms........这么长时间测风速太长了吧
忘记说了,测风速的部分我是放在ProtoThreads的一个进程里的,一旦程序进入到这个进程里,别的进程不会继续执行的啊 很多老东西的方式可以借鉴
比如用老款鼠标(光电式鼠标----滚轮的那种啊)的方式
1个塑料拨盘+1对红外发射和接收管作为数据发生装置。
关于管脚,其实你可以考虑328的加强版 2560 它脚够多
当然,比较简便的解决方式就是 再弄个NANO做数据采集并且IIC通讯发送给你的主板处理
综上所述 实际采样精度可以做到非常高
楼主您要求的实时性体现在哪儿呢?是最多1秒钟更新一次的时间,还是半小时测量一次的风速?我觉得楼主完全被ProtoThreads捆住了手脚,为了用ProtoThreads而ProtoThreads,应该再好好考虑一下您的系统需求。
既然选择了以arduino为主控,单片机的某些特性就不要想多了,简单、快速、有效地实现自己的目标才是正道~~~ darkorigin 发表于 2012-10-8 00:59 static/image/common/back.gif
很多老东西的方式可以借鉴
比如用老款鼠标(光电式鼠标----滚轮的那种啊)的方式
1个塑料拨盘+1对红外发射 ...
嗯,我也开始考虑再来块nano专门测风速了~~这样两块板子还能扩展更多的功能 本帖最后由 shenhaiyu 于 2012-10-8 12:38 编辑
飞翔的红猪 发表于 2012-10-8 08:38 static/image/common/back.gif
楼主您要求的实时性体现在哪儿呢?是最多1秒钟更新一次的时间,还是半小时测量一次的风速?我觉得楼主完全被 ...
谢谢指教~~倒不是纯为了ProtoThreads,只是突然感觉我要做的东西太复杂,貌似快超出arduino的能力了。
我再LZ详细描述一下我的系统需求,劳烦您再看看吧
你这个实时性要求不高嘛,测速的时候就暂停其他任务,测完以后把中断关了,更新显示啥的
页:
[1]
2