【E1222】带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)

2021-09-17 16:03:11      索炜达电子      1657     

项目编号:E1222

文件大小:16M

源码说明:带中文注释

开发环境:C编译器

简要概述:

通俗的讲下带编码器的直流减速电机测速原理。首先我们得明白一个东西,电机旋转一圈会产生脉冲,而一圈究竟能产生多少个脉冲,这是由电机的编码器线数决定,线数越高,精度就越高。至于为什么会产生脉冲,这个就是编码器这个传感器的原理,这个我不讲。

既然电机旋转一圈能产生脉冲,那么我们就能记录一段时间产生的脉冲数来计算速度。而单片机怎么去检测脉冲并且记录脉冲的个数则是我们的重点。在这里我想提一个东西——定时器。我们是如何用定时器定相应的时间的?首先就是设置预分频系数把主频时钟分频,假设主频时钟168MHZ,你预分频系数为168,则分频后的时钟频率就为1MHZ(频率的倒数就是周期,这里即1us),此时TIMx_CNT 寄存器,即定时器的计数器就是按照这个频率(也就是10us)递增的。假如你重装载值为10,则你定时器最终定的时间就为10us。

从上面的例子可以看出,此时TIMx_CNT 寄存器的值递增是由内部时钟频率造成的,而时钟频率无非就是脉冲。好,那我们岂不是可以用这个寄存器去记录编码器产生的脉冲了?的确就是这样,但是怎么把原本是因为内部时钟递增的TIMx_CNT 寄存器改为是因为外部时钟递增呢?这就是我们为什么需要用到正交编码模式了。至于为什么用了正交编码模式就可以了,这个我就不知道了,反正我就知道用了正交编码模式就可以实现这样的过程。

以前我讲了重装载值对我们的影响,那现在你们是否就清楚了预分频系数的我们的影响了?原来预分频系数分的内部时钟,现在分频系数分的就是外部时钟。那我代码里为何预分频系数是为1?为其他数可不可以?当然可以,但是没必要。因为你现在就是要记录电机旋转一圈产生的真实的脉冲数,如果你预分频系数为2,假设电机旋转一圈产生200个脉冲,则此时你单片机只能记录100个脉冲了。

实际啊,其实直流减速电机测速度的本质很简单,以前我们定时器初始化设置重装载值和与分频系数时是基于内部时钟而定的。而现在是基于外部时钟而定的,这个外部时钟就是编码器产生的脉冲。

顺带提下,我这份代码只能测正转或者反转,如果想正反转都能测(当然实际工程就需要这样),去看下17楼,那里我讲了下思路。这是其中一个思路,这里我还想说下另外一个思路,通过定时器的TIMx_CR寄存器的第四位DIR标志位来判断。  

【E1222】带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)

而我目前修改后的代码用的就是这个思路。

我修改后的代码也会传上来,但是由于我没有实物,我无法测试,我不知道我修改的代码究竟实际能不能成功,所以这个代码只供参考用。

目录│文件列表:

 │ 带编码器的直流减速电机.zip

 └ 带编码器的直流减速电机代码(正反转版).zip

TAG霍尔传感器
  • 10 次
  • 1 分