测速器这几天做了几个版本,有一些心得:
1、最稳定和速度的方式是线圈采集,但是必须在最后一级加速关闭后开通采集功能,要不线圈的信号全是的加速磁场感应出来的数据,这种方式需要远离线圈炮出口一段距离,主要为了增加加速信号的时间差,我现在用线圈采集的数据主要用简易示波器观察,用来检查下面光槽方案数据的准确性。
2、光槽的方式能做到很小型话,我的几个测试版都是20mm间距布置两个光槽,出来的数据准确性蛮高的。
a、这个方案一定要稳压!!!!
b、要给发光管提高20ma以上的电流(比较耗电),用来降低环境光信号的干扰
c、光电管上拉电阻不能看厂家推荐的值,调整阻值设定在电源中值即可
d、不可直接提供信号给MCU的IO脚,因为变化的电压值不足够区分电平高低值,需要加一级电压比较器。
程序设计需要先用定时器模拟光电管通断,读出正常计数值对应的时间消耗,我的方案里面E_Count增加到1537需要5ms时间,这样计算距离20mm光槽的对应速度值 6148/E_Count就出来了。后面的delay值是提示经过多少延时到达下级加速点用来帮助设定下级的开启时间和关闭时间范围(一般出口速度低于线圈中的速度,所以超出这个值一定回拉)
E_Count = 0;
while(E1 == 1 && E_Count<0xfff0){
E_Count++;
}
if ( E_Count < 0xfff0 ){
E_Count = 0;
//Timer0Start();
while(E2 == 1 && E_Count<0xfff0){
E_Count++;
}
if ( E_Count < 0xfff0 ){
sprintf(turnarray,"count: %u ",E_Count); //5毫秒计数 1537
rem(10,210,turnarray,0xff00,0);
speed = 6148;
speed /= E_Count;
sprintf(turnarray,"speed: %5.2f m/s",speed); //5毫秒计数 1537
rem(10,226,turnarray,0xff00,0);
speed = E_Count;
speed = speed * 2500 / 1537;
sprintf(turnarray,"delay: %4u ",(unsigned int )speed); //5毫秒计数 1537
rem(10,242,turnarray,0x00ff,0);
}
else
rem(10,210,"Too slow ! ",0xff00,0);
}
else
rem(10,210,"empty ! ",0xff00,0);
。。。。。。
其实我的方案也有缺陷,至少需要稳态化,这样就能避免两个钢珠通过弹速超百的问题。
78m05前后需要加电容,图中省事没话
200字以内,仅用于支线交流,主线讨论请采用回复功能。