lb8820265 发表于 2021-12-7 00:28

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 &lt;stdio.h&gt;
#include &lt;wiringPi.h&gt;
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, &amp;Interrupt) ;
  wiringPiISR (B_pin, INT_EDGE_BOTH, &amp;Interrupt) ;
  piThreadCreate (timer) ;
  for(;;){
  }
  return 0 ;
}
</code></pre>

<p><b style="font-family: Arial; font-size: 16px;">&nbsp;运行结果</b></p>

<p><span style="font-size:16px;"><span style="font-family:Arial;">&nbsp; &nbsp; &nbsp;</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>&nbsp; &nbsp; &nbsp;&nbsp;<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>

okhxyyo 发表于 2022-3-21 13:39

<p>d</p>

Jacktang 发表于 2021-12-7 07:18

<p>定时器为什不嫩精确定时呢</p>

<p>为什么会有这种坑</p>

nmg 发表于 2021-12-7 15:52

<p><a href="https://bbs.eeworld.com.cn/thread-1187606-1-1.html" target="_blank">汇总(已更新16篇):lb8820265的&ldquo;万里&rdquo;树莓派小车开源分享</a></p>

lb8820265 发表于 2021-12-7 21:50

Jacktang 发表于 2021-12-7 07:18
定时器为什不嫩精确定时呢

为什么会有这种坑

<p>Linux是非实时系统,定时器就不可能准的,详细可以看我的这篇帖子<a href="https://bbs.eeworld.com.cn/thread-1187298-1-1.html">5&ldquo;万里&rdquo;树莓派小车&mdash;&mdash;wiringPi学习(延时与线程模拟定时器) - 创新实验室 - 电子工程世界-论坛 (eeworld.com.cn)</a></p>

freebsder 发表于 2021-12-8 11:23

<p>这是C和py混合编程?</p>

lb8820265 发表于 2021-12-8 21:55

freebsder 发表于 2021-12-8 11:23
这是C和py混合编程?

<p>这篇帖子介绍的是纯C的编程,不过可以用py编写</p>

nicklgw 发表于 2024-5-12 19:06

电机转速的正反,怎么获取了?

lb8820265 发表于 2024-5-13 19:01

nicklgw 发表于 2024-5-12 19:06
电机转速的正反,怎么获取了?

<p>由于编码器是有AB相的,可以通过相位获取,Pico的PIO编码器接口可以自动的获取电机的正反转</p>
页: [1]
查看完整版本: 16“万里”树莓派小车——光电编码器学习(转速的获取)