SimpleFOC移植STM32(九)—— ABZ编码器电机



SimpleFOC、ODrive和VESC 教程链接汇总:请点击

说明

在SimpleFOC代码中,ABZ信号和霍尔电机信号处理方式很像,都是信号边沿触发中断,在中断中获取状态计算角度。
本次移植驱动板103和官方代码保持一致。

驱动板405采用的是定时器计数脉冲,处理方式不同。

一、ABZ编码器介绍

  • ABZ或者ABI,叫法不同但指的都是同一种编码器,也叫增量式编码器。
  • ABZ编码器最大的优点就是接口统一,兼容性好。
  • 不像SPI接口的磁编码器,不同厂家的芯片甚至同一厂家的不同型号,通信协议各不相同,换个编码器就要重新写代码。

1.1、ABZ信号

  • A、B两相相差90度,可通过比较A相在前还是B相在前,以判断编码器的正转与反转,通过零位脉冲,可获得编码器的零位参考位。
    在这里插入图片描述

  • 一般采用四倍频技术,比如500线的编码器,转一圈可以获得2000个脉冲信号,
    在这里插入图片描述

1.2、光电式编码器

  • 最初的ABZ编码器是光电式的,最有名的品牌是安华高( Avago),分辨率叫“线”,比如500线就是500ppr(2000cpr)。
    在这里插入图片描述

  • 拆开后是这样的:下图
    在这里插入图片描述
  • 500线属于正常分辨率,1000线算是比较高的,2000线的电机肯定很贵了。不像现在的磁编码器,起步就是1024ppr。

1.3、磁编码器

  • 磁编码器体积小,性能强,价格便宜,发展的很快,会越来越多的代替光电编码器。
    在这里插入图片描述
    磁编码器购买链接:https://item.taobao.com/item.htm?ft=t&id=655599337824,图锐科技

  • 需要说明的是,有些磁编码器上电后可以输出当前绝对位置对应的脉冲数(需要配置相应的寄存器)。下图:
    在这里插入图片描述

在这里插入图片描述

ABZ编码器每次上电都需要校准,所以使用时会有不方便的时候,但这个功能完美的解决了校准问题。这也是光电编码器望尘莫及的功能,充分体现了磁编码器的灵活。

1.4、差分信号

  • 在传输距离比较长的情况下(比如大于1m),信号容易发生变形和干扰,需要将编码器输出的TTL信号转为差分信号,待到控制器端再转为TTL信号。
  • 工业应用中,ABZ差分信号是应用非常普遍的编码器接口。
  • 在驱动板103或者驱动板405上,可以只用A+,B+,Z+做为ABZ信号,A-,B-,Z-悬空即可。虽然不够严谨,但是做为开发学习还是可以的。
    在这里插入图片描述


在这里插入图片描述


二、电机驱动板103

在这里插入图片描述

ABZ编码器电机的代码是独立的,没有与其它编码器混在一起,不需要在 myproject.h 中设置编码器类型,代码看起来更简洁。

2.1、读ABZ信号的cpr

如果你已经知道编码器的cpr,可以跳过当前小节。

2.1.1、接线

A—SCL1(PB6/TIM4_1)、B—SDA1(PB7/TIM4_2)、Z—PA12
在这里插入图片描述

驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

2.1.2、编译,下载代码

在这里插入图片描述

2.1.3、转动电机,观察串口打印

  • 第一次输出的cpr肯定不准确,因为电机上电为任意位置,
  • 可以发送指令“2”读取任意时刻的cpr。
    在这里插入图片描述

2.2、驱动ABZ电机M1

2.2.1、接线

在这里插入图片描述
驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

2.2.2、修改代码

  • 在Myproject.h 中选择是否需要使用Z信号,然后修改cpr,
    在这里插入图片描述

  • 极对数按照实际写入,

  • voltage_sensor_align是电机零点校准时的电压值,需要根据电机功率设置,100W以内的电机基本属于小功率,可以设置的大一点,200W以上的属于大功率,设置的小一点。

  • 如果不清楚电机功率,可以多试几个值,电源有电流显示的话观察下零点校准时的电流,只要在0.2A — 0.8A这个范围内就行,电流太小电机无力,校准可能不准确,电流太大电机会发热,容易损坏电机。

  • 初次调试请选择 Type_voltage 模式,因为可以跳过电流环,电流环的PI参数非常难设置。

  • 云台电机请选择 Type_voltage 模式,电机转速低且电流小,检测电流反而增加误差。

  • 速度环的PI请自行设置,不清楚可以先把速度I参数设置为0,只用速度P参数,先让电机转起来再说。不同电机的PI参数不相同,具体请百度。

  • 以下参数针对2804电机,编译后下载,
    在这里插入图片描述

2.2.3、串口发送指令,观察电机运行

在这里插入图片描述

2.3、驱动ABZ电机M2

  • A—SCL2(PB10)、B—SDA2(PB11)、Z—SWD(PA13),
  • 其实最初的设计是打算接PA11引脚的,但是调试代码的时候发现PB11和PA11是同一个中断源EXTI_Line11,并且在中断代码中无法区分,所以用SWD(PA13)来代替。
  • SWD(PA13)并没有设计外部上拉电阻,反复测试后确定只要代码中打开了内部上拉也可以的。
  • 只是占用SWD后不能再用ST-link下载代码了,请大家使用串口下载。
  • 串口下载的方法在 SimpleFOC移植STM32(二)—— 开环控制 的第3.2小节有说明,不清楚的可以去查看。

接线:
在这里插入图片描述
驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

接下来的操作与 2.2小节相同,请参考上面。

2.4、驱动双ABZ电机

在这里插入图片描述

驱动板103 购买链接:https://item.taobao.com/item.htm?ft=t&id=656368067494,图锐科技
2804电机 购买链接:https://item.taobao.com/item.htm?ft=t&id=643573104607,图锐科技

请结合上面的2.2和2.3小节操作。
需要注意的是,控制M1的电机发送指令以 A开头,比如 A6.28;控制M2的电机发送指令以 B开头,比如 B6.28。

三、电机驱动板405

  • 驱动板405在最初设计的时候已经支持ABZ编码器,只需要在 Myproject.h 文件选择编码器类型即可。
  • 与驱动板103的中断方式处理ABZ信号不同,驱动板405使用定时器计数AB脉冲。TIM3计数M0的AB相,TIM4计数M1的AB相。
  • 定时器计数减少了中断,在角度处理的方式上与磁编码器类似,需要主动读取定时器,

四、总结

  • 光电编码器的信号输出有开漏和推挽多种形式,不确定信号类型情况下,在单片机接口上最好能接 上拉电阻,
  • 光电编码器的工作电压一般为5V,接3.3V后不工作。驱动板103没有5V电源输出。
  • 磁编码器输出的ABZ信号一般为推挽输出,有一定的驱动能力,所以有没有上拉电阻不重要。
  • 磁编码器的工作电压为3.3V-5V,接STM32单片机尽量用3.3V电源。


    (完)
<think>嗯,用户想了解如何使用HAL库在STM32上读取ABZ编码器的示例代码和方法。首先,我需要回顾一下ABZ编码器的工作原理。ABZ编码器通常输出A、B两相脉冲信号和Z相零位信号。A、B相用于检测旋转方向和速度,Z相用于确定绝对位置,每次转到零点时触发一次。 接下来,我得考虑STM32的定时器编码器模式。HAL库支持通过定时器的编码器接口来读取A、B相信号,这样可以利用硬件计数器自动处理脉冲的方向和计数。用户提到的引用资料[^2]和[^3]都提到了使用HAL库的函数,比如HAL_TIM_Encoder_Start()和相关的获取计数值的函数。 然后,用户可能需要配置CubeMX来设置定时器为编码器模式。例如,选择TIM2或TIM3,设置通道1和通道2为编码器模式,并配置分频系数、计数模式等。这里需要注意编码器的类型是AB相,所以需要选择对应的编码器模式,比如TI1和TI2的边沿触发。 关于Z相信号的处理,Z相通常连接到外部中断引脚,需要在CubeMX中配置对应的GPIO为中断模式,并在中断服务函数中处理零位校准。例如,当Z相触发时,将计数器重置为0或某个基准值,这样可以确保绝对位置的准确性。 代码部分需要初始化定时器并启动编码器接口,同时开启Z相的中断。在主循环中,定期读取计数器的值,并根据需要计算角度、速度和位置。速度计算可能需要用到定时器的溢出次数和捕获比较功能,或者通过测量两次读取之间的脉冲数变化和时间差来计算。 用户可能还关心如何处理高速情况下的性能问题,比如使用DMA来减少CPU负担,如引用[^2]提到的HAL_TIM_Encoder_Start_DMA()函数。此外,使用FreeRTOS来同时处理多个任务,比如在一个任务中读取编码器数据,另一个任务中进行控制逻辑,如引用[^1]所述。 需要提醒用户注意编码器的分辨率,即每转的脉冲数,以便正确计算角度和位置。例如,如果编码器是1000线,那么每转会产生1000个脉冲,每个脉冲对应0.36度的角度变化。 最后,确保示例代码的正确性,包括CubeMX配置步骤和Keil中的代码编写,如引用提到的。可能还需要处理计数器的溢出问题,比如使用32位定时器或处理16位定时器的溢出中断,以扩展计数范围。 总结一下,步骤应该是:CubeMX配置定时器为编码器模式,配置Z相的中断,编写初始化代码,处理中断,读取计数值,并进行计算。同时,考虑性能优化和使用RTOS多任务处理。</think>### 使用HAL库读取ABZ编码器的实现方法 #### 1. CubeMX基础配置(编码器模式) 在CubeMX中配置定时器为**编码器模式**,以STM32G431为例: - 选择定时器(如TIM3),设置工作模式为`Encoder Mode` - 配置通道1和通道2为`Combined Channels` - 设置编码器类型:`Encoder Mode TI1 and TI2` - 分频系数根据编码器分辨率调整(如1000线编码器建议分频=0) - 计数器模式设为`UP`,自动重装载值设为最大(0xFFFF) [^1] #### 2. 编码器数据读取代码 ```c // 启动编码器接口 HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); // 获取当前计数值(需处理溢出) int32_t get_encoder_value(void) { static uint16_t last_cnt = 0; static int32_t total_cnt = 0; uint16_t current_cnt = TIM3->CNT; int16_t diff = current_cnt - last_cnt; total_cnt += diff; last_cnt = current_cnt; return total_cnt; } // 计算角度(假设编码器1000线) float get_angle(void) { return (get_encoder_value() % 4000) * 0.09f; // 0.09度/脉冲 } ``` #### 3. Z相零位处理 配置Z相连接的GPIO为外部中断: ```c // 中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == Z_PHASE_Pin) { TIM3->CNT = 2000; // 设置中间值防止溢出 encoder.total_cnt = 0; // 重置绝对位置 } } ``` #### 4. 速度计算(溢出处理) ```c // 定时器溢出中断处理 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { if(TIM3->CNT > 0x7FFF) { encoder.total_cnt += 0x10000; } else { encoder.total_cnt -= 0x10000; } } } // 速度计算(单位:RPM) float get_rpm(void) { static int32_t last_count = 0; static uint32_t last_time = 0; int32_t delta = get_encoder_value() - last_count; uint32_t delta_t = HAL_GetTick() - last_time; last_count = encoder.total_cnt; last_time = HAL_GetTick(); return (delta * 60.0f) / (4000.0f * delta_t / 1000.0f); // 4000脉冲/转 } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值