16“万里”树莓派小车——光电编码器学习(转速的获取)
本帖最后由 lb8820265 于 2021-12-7 00:16 编辑<p style="text-indent:21.0000pt; text-align:justify"><span style="font-size:16px;"><span style="font-family:Arial;">前面介绍了光电编码器的正反转的判断,也发现了树莓派无法准确的获取到正反转的坑,我想到为何要判断正反转呢?正反转完全是我控制的,我只需要知道转速就好了,因此,只需要每出现一个跳变将全局变流自加就好了,然后在定时器中用全局变量除以时间间隔就是转速了。当然,这定时器也是个坑,无法精确定时,也没关系,只要时间差是准的就可以了。</span></span></p>
<p style="text-align:justify"><span style="font-size:16px;"><span style="font-family:Arial;"><b><span style="font-weight:bold">代码编写</span></b></span></span></p>
<p style="text-indent:21.0000pt; text-align:justify"><span style="font-size:16px;"><span style="font-family:Arial;"><span style="font-weight:normal">AB相的中断都可以统一使用一个,然后中断函数中就只有一个全局变量的自加。弄一个100ms的定时器,在定时器中输出定时期间内AB合计的脉冲数,时间差,和算出的速度值。</span></span></span></p>
<pre>
<code class="language-cpp">#include <stdio.h>
#include <wiringPi.h>
long Cnt;
int A_pin=21;
int B_pin=22;
float Speed=0;
long int Cha;
long now,pre_time;
void Interrupt (void) {
Cnt++;
}
PI_THREAD (timer)
{
for (;;)
{
now=micros();
Cha=(now-pre_time);
Speed=(float)Cnt/Cha;
printf ("%ld,%ld,%f\n",Cnt,Cha,Speed);
pre_time=micros();
Cnt=0;
delay(100);
}
}
int main (void)
{
wiringPiSetup () ;
wiringPiISR (A_pin, INT_EDGE_BOTH, &Interrupt) ;
wiringPiISR (B_pin, INT_EDGE_BOTH, &Interrupt) ;
piThreadCreate (timer) ;
for(;;){
}
return 0 ;
}
</code></pre>
<p><b style="font-family: Arial; font-size: 16px;"> 运行结果</b></p>
<p><span style="font-size:16px;"><span style="font-family:Arial;"> </span></span><span style="font-size:16px;"><span style="font-family:Arial;">误差在3%以内,这个结果算是可以接受了。</span></span></p>
<p><strong><span style="font-size:16px;"><span style="font-family:Arial;">问题</span></span></strong></p>
<p> <span style="font-size:16px;"><span style="font-family:Arial;">现在速度回馈有了,如何随心所欲的控制车速呢?</span></span></p>
<p><strong><span style="font-size:16px;"><span style="font-family:Arial;">源码</span></span></strong></p>
<p style="text-indent:21.0000pt; text-align:justify"><span style="font-size:16px;"><span style="font-family:Arial;">GitHub:<a href="https://github.com/wanli-car/Examples/blob/master/C++/Encoder/Encoder_Speed.c" target="_blank">https://github.com/wanli-car/Examples/blob/master/C++/Encoder/Encoder_Speed.c</a></span></span></p>
<p style="text-indent:21.0000pt; text-align:justify"><span style="font-size:16px;"><span style="font-family:Arial;">Gitee:GitHub链接中的github改为gitee。</span></span></p>
<p>d</p>
<p>定时器为什不嫩精确定时呢</p>
<p>为什么会有这种坑</p>
<p><a href="https://bbs.eeworld.com.cn/thread-1187606-1-1.html" target="_blank">汇总(已更新16篇):lb8820265的“万里”树莓派小车开源分享</a></p>
Jacktang 发表于 2021-12-7 07:18
定时器为什不嫩精确定时呢
为什么会有这种坑
<p>Linux是非实时系统,定时器就不可能准的,详细可以看我的这篇帖子<a href="https://bbs.eeworld.com.cn/thread-1187298-1-1.html">5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器) - 创新实验室 - 电子工程世界-论坛 (eeworld.com.cn)</a></p>
<p>这是C和py混合编程?</p>
freebsder 发表于 2021-12-8 11:23
这是C和py混合编程?
<p>这篇帖子介绍的是纯C的编程,不过可以用py编写</p>
电机转速的正反,怎么获取了? nicklgw 发表于 2024-5-12 19:06
电机转速的正反,怎么获取了?
<p>由于编码器是有AB相的,可以通过相位获取,Pico的PIO编码器接口可以自动的获取电机的正反转</p>
页:
[1]