一、小车底盘—霍尔编码器数据采集

一、小车底盘—霍尔编码器数据采集使用 JGB37 520 直流减速电机 霍尔编码器 磁式 通过代码获取到电机旋转的数值 霍尔编码器

大家好,欢迎来到IT知识分享网。

一、霍尔编码器
一、小车底盘---霍尔编码器数据采集

这里博主采用的是JGB37-520直流减速电机 ,霍尔编码器(磁式)。

1.什么是编码器

编码器是把角位移或直线位移转换成电信号的一种装置。编码器按照工作原理,可以分为增量式编码器绝对式编码器

绝对式编码器的每一个位置对应一个确定的数字码(二进制数)。

增量式编码器就是每转过单位的角度就发出一个脉冲信号。

从编码器检测原理上来分,还可以分为光学式磁式感应式电容式。我们常见的是光电编码器(光学式)和我们要介绍的主角霍尔编码器(磁式)。一般来说光电编码器是霍尔编码器精度的几十倍。

2.编码器的作用。

了解了什么是编码器,那么我们用编码器有什么实际作用呢?通常我们会使用编码器来检测电机的转速和旋转方向。那我们常用的控制算法PID算法来说,PID算法是为了实现闭环控制,要想实现闭环控制,就需要有一个反馈。我们的编码器测得的转速就可以作为反馈,搭配PID算法,实现转速的闭环控制。

3.霍尔编码器的工作原理。

其实从上面的介绍就能大概了解到编码器的工作原理。我们这次主要介绍对象是霍尔编码器。霍尔编码器由码盘和霍尔元件组成。霍尔码盘与电机主轴同轴,码盘上等分的分布有多个磁极,电机转动时,霍尔元件会输出若干个脉冲信号,我们正是利用这些脉冲信号实现电机的测速和电机转向的判断。

4.霍尔编码器的线数。

什么是霍尔编码器的线数?转动一圈我们会产生几个脉冲,取决于编码器的线数。比如我们的霍尔编码器线数为11。那么霍尔编码器的码盘旋转一圈,会产生11个脉冲。

5.霍尔编码器判断旋转方向和转速

1.方向:通过A相出现脉冲时检测B相电平来判断电机旋转方向。(或者B相出现检测A相)

当然,正转或者反转是可以相互变换的,A由低电平变为高电平,B的高低电平可以决定电机正反转

一、小车底盘---霍尔编码器数据采集

一、小车底盘---霍尔编码器数据采集

2.转速:通过检测单位时间内产生的脉冲数来确定电机转速。

为什么可以这么做?因为电机转动一圈产生的脉冲数是确定的。比如我们有一个减速比为1:30的减速电机,霍尔编码器的线数为11。那么霍尔码盘旋转一圈,产生11个脉冲,霍尔码盘旋转30圈,电机主轴旋转一圈。综上所述,电机主轴旋转一圈会产生11 * 30 = 330个脉冲。注意,这里是只检测A相的上升沿脉冲,电机旋转一圈有330个脉冲。

有的小伙伴可能会疑问,是转一圈A和B一共产生330个脉冲,还是A和B都产生330个脉冲?答案是后者。

接下来我们只需要检测单位时间内A相或者B相输出的脉冲数,就可以计算电机转速了。

二、测速程序设计

1.接线图 

一、小车底盘---霍尔编码器数据采集 

2.代码 

from machine import Pin import time # 定义编码器A相和B相的引脚 encoder_a = Pin(17, Pin.IN, Pin.PULL_UP) encoder_b = Pin(5, Pin.IN, Pin.PULL_UP) # 用于记录编码器状态的变量 last_a_state = encoder_a.value() position = 0 # 编码器中断处理函数(仅针对A相的上升沿) def encoder_interrupt(pin): global last_a_state, position current_a_state = encoder_a.value() current_b_state = encoder_b.value() # 如果A相状态从低到高变化(上升沿) if current_a_state == 1 and last_a_state == 0: # 根据A相上升沿时B相的状态确定方向 if current_b_state: # B相为高,正方向 position += 1 else: # B相为低,反方向 position -= 1 # 打印位置和方向(可选) print("Position: {}, Direction: {}".format(position, "Forward" if position > 0 else "Backward" if position < 0 else "Stopped")) last_a_state=0 # 设置引脚中断(仅针对A相的上升沿) encoder_a.irq(trigger=Pin.IRQ_RISING, handler=encoder_interrupt) # 注意:我们不再为encoder_b设置中断,因为它在这个例子中不被直接使用 # 主循环(可以在这里添加其他任务) while True: # 在这里可以添加其他逻辑或任务 time.sleep_ms(100) # 休眠以减少CPU使用率 

3.测试结果

当我们运行代码,旋转轮胎就可以看到输出编码器的数据

一、小车底盘---霍尔编码器数据采集

4.结论 

正交编码器通常有两个输出,(它们之间的相位差为90度。这种设计使得通过同时监测这两个输出信号,可以准确地确定编码器的旋转方向和步数。

在代码中,选择仅使用A相的上升沿(从低电平到高电平的变化)来触发中断,并根据B相的信号状态来确定旋转方向。

5.以下是该代码的主要原理

  1. 引脚配置encoder_aencoder_b分别连接到编码器的A相和B相输出。它们都被配置为输入模式,并启用内部上拉电阻。
  2. 中断设置:仅为encoder_a设置上升沿中断。当A相从低电平变为高电平时,会触发中断并执行encoder_interrupt函数。
  3. 中断处理:在encoder_interrupt函数中,首先读取A相和B相的当前状态。然后,检查A相是否从低电平变为高电平(即上升沿)。如果是,则根据B相的状态来确定旋转方向:
    • 如果B相为高电平,则编码器向正方向旋转,位置计数加1。
    • 如果B相为低电平,则编码器向反方向旋转,位置计数减1。
  4. 位置和方向输出:在每次中断处理后,都会打印当前的位置和方向。注意,由于位置计数是整数,因此当计数为0时,表示编码器已停止或处于初始位置。
  5. 主循环:主循环中的time.sleep_ms(100)用于减少CPU的使用率。您可以在此处添加其他任务或逻辑。

3 码盘测速原理

3.1 编码器倍频

编码器倍频是什么意思呢,比如某光栅编码器一圈有N个栅格,理论上电机带动编码器转一圈,只能输出N个信号,通过倍频技术,可以实现转一圈,却能输出N*n个信号,这里的n为倍频数。

增量式编码器输出的脉冲波形一般为占空比50% 的方波,通道A 和B 相位差为90°。

  • 如果只使用通道A计数,并且只捕获通道A的上升沿,则一圈的计数值=码盘的栅格数,即为1倍频(没有倍频)
  • 如果只使用通道A计数,并且捕获了通道A的上升沿和下降沿,则编码器转一圈的计数值翻倍,实现2倍频
  • 如果既使用通道A计数,又使用通道B计数,且都捕获了上升沿和下降沿,则实现了4倍频

一、小车底盘---霍尔编码器数据采集

假设某个增量式编码器它的分辨率是600PPR,能分辨的最小角度是0.6°,对它进行4 倍频之后就相当于把分辨率提高到了600*4=2400PPR,此时编码器能够分辨的最小角度为0.15°。

3.2 M法测速

又叫做频率测量法。该方法是在一个固定的时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。M法适合测量高速

假设:

  • 编码器单圈总脉冲数为C(常数)
  • 统计时间为T0 (固定值,单位秒)
  • 该时间内统计到的编码器脉冲数为 M0 (测量值)

则:转速n (圈/秒)的计算公式为:

一、小车底盘---霍尔编码器数据采集

如何理解这个公式:

M0 /C 即统计时间内有多少个编码器脉冲,再除以统计时间 T0 ,即1s(单位时间)内转了多少圈

例如:统计时间 T0 为3s,在3s内测得的脉冲数 M0 为60,而编码器的单圈脉冲数C为20,则转速n=60/(20*3)=1圈每秒

由于C 是常数,所以转速n 跟 M0 成正比。这就使得:

  • 在高速时,测量时 M0 变大,可以获得较好的测量精度和平稳性
  • 但在低速时(低到每个 T0 内只有少数几个脉冲),此时算出的速度误差就会比较大,并且很不稳定。

如下图,方波为编码器某一通道输出的脉冲。

当转速较高时,每个统计时间 T0 内的计数值较大,可以得到较准确的转速测量值。

当转速较低时,每个统计时间 T0 内的计数值较小,由于统计时间的起始位置与编码器脉冲的上升沿不一定对应,当统计时间的起始位置不同时,会有一个脉冲的误差(只统计上升沿时,最多会有1个脉冲误差,统计上升沿和下降沿时,最多会有2个脉冲的误差)。

一、小车底盘---霍尔编码器数据采集

通过倍频提高单位时间测得的脉冲数可以改善M 法在低速测量的准确性(比如原本捕获到的脉冲 M0 只有4 个,经过4 倍频后,相同电机状态 M0 变成了16 个),但也不能从根本上改变低速时的测量问题。

3.3 T法测速

又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数。T法适合测量低速

假设:

  • 编码器单圈总脉冲数为C(常数)
  • 高频脉冲的频率为 F0 (固定值,单位Hz)
  • 捕获到编码器相邻两个脉冲的间隔时间为 TE ,其间的计数值为 M1 (测量值)

则:转速n 的计算公式为:

一、小车底盘---霍尔编码器数据采集

如何理解这个公式:

1/$T_E$ 即1s内有多少个编码器脉冲,再除以一圈的脉冲数C,即1s内转了多少圈

$F_0$/$M_1$ 即1s内的高频脉冲数除以两编码器脉冲间的高频脉冲数,也即1s内有多少个编码器脉冲,再除以一圈的脉冲数C,即1s内转了多少圈

例如:高频脉冲的周期是1ms,即频率 F0 为1000Hz,在编码器的两个脉冲之间,产生的高频脉冲数 M1 为50个(即两个编码器脉冲的间隔 TE 为0.05s),编码器一圈的脉冲数C为20,则转速 n=1000/(50∗20)=1 圈每秒。

由于C 和 F0 是常数,所以转速n 跟 M1 成反比。这就使得:

  • 在高速时,编码器脉冲间隔时间TE 很小,使得测量周期内的高频脉冲计数值 M1 也变得很少,导致测量误差变大
  • 在低转速时, TE 足够大,测量周期内的 M1 也足够多,所以T 法和M 法刚好相反,更适合测量低速。

如下图,黑色方波为编码器某一通道输出的脉冲,黄色方波为高频测量脉冲。

当转速较低时,高频测量脉冲数 M1 较大,可以得到较准确的转速测量值。

当转速较高时,编码器两脉冲间的时间间隔变短,导致高频测量脉冲数 M1 较小,由于高频脉冲的上升沿位置与编码器脉冲的上升沿不一定对应,当两波的上升沿位置不同时,会有一个脉冲的误差

一、小车底盘---霍尔编码器数据采集

3.5 M/T法测速

这种方法综合了M 法和T 法各自的优势,既测量编码器脉冲数又测量一定时间内的高频脉冲数

在一个相对固定的时间内,假设:

  • 编码器脉冲数产生 M0 个 (测量值)
  • 计数一个已知频率为 F0 (固定值,单位Hz)的高频脉冲,计数值为 M1 (测量值),计算速度值
  • 码器单圈总脉冲数为C(常数)

则转速n 的计算公式为:

一、小车底盘---霍尔编码器数据采集

例如:在一个相对固定的时间内,编码器脉冲数 M0 为3个;高频脉冲的周期是1ms,即频率 F0 为1000Hz,产生的高频脉冲数 M1 为150个;编码器一圈的脉冲数C为20,则转速 n=1000∗3/(150∗20)=1 圈每秒。

由于M/T 法公式中的 F0 和C 是常数,所以转速n 就只受 M0 和 M1 的影响。

  • 高速时, M0增大, M1 减小,相当于M 法
  • 低速时, M1 增大, M0 减小,相当于T 法。

一、小车底盘---霍尔编码器数据采集

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/112833.html

(0)
上一篇 2024-11-17 12:45
下一篇 2024-11-17 13:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信