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

一、霍尔编码器

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

1.什么是编码器

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

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

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

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

2.编码器的作用。

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

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

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

4.霍尔编码器的线数。

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

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

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

A检测到上升沿脉冲时(由低电平变为高电平),B为高电平,正转;
A检测到上升沿脉冲时(由低电平变为高电平),B为低电平,反转; 

当然,正转或者反转是可以相互变换的,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的使用率。您可以在此处添加其他任务或逻辑。
  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UWB是一种无线通信技术,DWM1000是一种UWB模块,可以用于测距、定位等应用。在跟随小车应用中,通常使用两个DWM1000模块,一个放在小车上,一个放在地面上。下面是UWB DWM1000跟随小车的原理和代码解析。 1. 原理 UWB DWM1000跟随小车的原理如下: 1)通过UWB模块测量小车与地面的距离,得到距离数据。 2)将距离数据传输给控制器,控制器计算小车与地面的相对位置和方向。 3)根据相对位置和方向,控制器调整小车的速度和方向,使小车跟随地面。 2. 代码解析 UWB DWM1000跟随小车的代码如下: ```c++ #include <DWM1000.h> // 定义UWB模块对象 DWM1000 uwb; // 定义小车位置、速度、方向变量 float car_x, car_y, car_v, car_h; void setup() { // 初始化UWB模块 uwb.setup(); // 初始化小车位置、速度、方向 car_x = 0; car_y = 0; car_v = 0; car_h = 0; } void loop() { // 获取UWB距离数据 float dist = uwb.getDistance(); // 计算小车相对位置和方向 float car_dx = dist * sin(car_h); float car_dy = dist * cos(car_h); float car_dh = atan2(car_dy, car_dx); // 更新小车位置、速度、方向 car_x += car_dx; car_y += car_dy; car_v = dist / uwb.getInterval(); car_h += car_dh; // 控制小车运动 controlCar(car_v, car_h); } void controlCar(float v, float h) { // 控制小车运动,使其跟随地面 } ``` 代码中,我们先定义了一个UWB模块对象uwb,然后在setup函数中初始化UWB模块和小车位置、速度、方向。在loop函数中,获取UWB距离数据,计算小车相对位置和方向,更新小车位置、速度、方向,最后调用controlCar函数,控制小车运动。其中,controlCar函数需要根据小车速度和方向来控制小车运动,使其跟随地面。 以上就是UWB DWM1000跟随小车的原理和代码解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪猪爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值