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电源。


    (完)
Stm32定时器可以用于生成类光电编码器abz相脉冲。光电编码器是一种用于测量角速度和位置的设备,包含A相、B相和Z相信号。其中A相和B相信号是用于测量角度和方向,Z相信号是用于标记一个完整的旋转圈数。下面是一个简单的代码示例,用于配置stm32的定时器生成abz相脉冲信号。 首先,需要定义和初始化stm32的定时器模块和GPIO引脚。 ```c #include "stm32f4xx.h" // 定义定时器和GPIO引脚 TIM_HandleTypeDef htim1; GPIO_InitTypeDef GPIO_InitStruct; void TIM_Config(void) { // 初始化定时器模块 TIM_OC_InitTypeDef sConfigOC; __HAL_RCC_TIM1_CLK_ENABLE(); htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim1); // 配置 TIM1_CH1、TIM1_CH2 引脚为复用功能 __HAL_RCC_GPIOE_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // 配置 TIM1_CH3 引脚为普通IO输出 GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // 启动定时器 HAL_TIM_Base_Start(&htim1); // 配置定时器输出通道1和通道2 sConfigOC.OCMode = TIM_OCMODE_TOGGLE; // 切换输出 sConfigOC.Pulse = 32768; // 半周期 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2); // 配置定时器输出通道3 - 用于Z相信号 TIM_OC_InitTypeDef sConfigOCZ; sConfigOCZ.OCMode = TIM_OCMODE_TOGGLE; // 切换输出 sConfigOCZ.Pulse = 100; // 半周期 sConfigOCZ.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOCZ.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOCZ, TIM_CHANNEL_3); } int main(void) { // 初始化MCU HAL_Init(); // 配置定时器生成相脉冲信号 TIM_Config(); while(1) { // 主程序逻辑 } } ``` 在上述代码中,我们使用了`TIM1`定时器模块,其中A相信号使用了定时器的通道1,B相信号使用了通道2,Z相信号使用了通道3。通过使用定时器的输出比较模式,我们可以通过配置不同的占空比和切换输出来生成相应的光电编码器脉冲信号。 这只是一个简单的示例,具体的配置和使用可以根据具体的需求进行修改。希望对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值