本帖最后由 茕兔 于 2012-11-27 16:02 编辑
前几天老板提出要做一个测纱线速度的小工具,于是很华丽丽的把这个任务给了我!这几天都在想办法,因为刚接触arduino不久,写一些程序还是很有压力啊。当然带给我思考也很多,学习了不少,不过还是有很多疑问,特来向各位前辈求教下。
首先来讲下我的设计思路吧,机械方面很简单,通过摩擦轮传动给一个码盘,然后给光电传感器信号,通过arduino计算后把数据显示到LCD屏上。参考了各类帖子后,计算方法我设想有如下:
1,使用 pulseIn函数 获得传感器信号脉冲间隔 进而计算出数值传递给LCD(1602)显示
2,读取码盘累加数,求1S内变化数 得出数值传递给LCD
这两种是我能够想到的,不过实验过程中遇到很多疑难,第一种方法呢,pulseIn函数精度太低,我用两块板子相互做了下实验,发现效果并不是很好,可能也是我的代码写的不怎么好吧,希望大家指点下
第一种设想的测试代码
int pin = 7;
unsigned long duration;
void setup()
{
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);
Serial.print("time=" );
Serial.println(duration );
}
结果端口显示出来的数值很不稳定,恳请各位帮忙写个能稳定读取IO口频率变化的程序,对各位来说肯定是小意思啦。
还有如果要加入显示实时数据的LCD部分该怎么加呢?会不会对程序有影响,
第二种方法的话,我看了很多帖子,我的疑问就是怎么来计算这个时间,arduino有定时器吗? 还有就是外部中断的,对LCD显示有没有影响呢,下面给大家看一个例子
float sCode = 0; // 码盘计数(即状态跳变次数) 代码来自shenhaiyu
float ws = 0; // 1s 平均(瞬时)速度
unsigned long t1 = 0, t2 = 0; // 时间标记
void setup()
{
Serial.begin(9600); // 初始化串口通信
attachInterrupt(0, Code, CHANGE); // 设置码盘外部中断
}
void loop()
{
t1 = millis();
if(abs(t1 - t2) >= 1000) // 1000ms 时间间隔
{
detachInterrupt(0) // 关闭中断
t2 = t1; // 更新时间标记
ws = 3.14159*0.0115*sCode// 计算风速 u=2πRbn
Serial.println(ws); // 输出 1s 平均速度
sCode = 0; // 码盘计数归零
delay(1);
attachInterrupt(0, Code, CHANGE); // 重新设置外部中断
}
}
// 风速码盘计数
void Code()
{
sCode += 1; // 码盘计数加一
}
如果我想加入LCD显示,显示部分应该加到哪里,万分感谢能看完我帖子的前辈们!
LCD模块是1602,8线接法
|