SimpleFOC移植STM32(九)——使用ABZ编码器控制电机

目录

  • 说明
  • 一、ABZ编码器介绍
  • 1.1、ABZ信号
  • 1.2、光电式编码器
  • 1.3、磁编码器
  • 1.4、差分信号
  • 二、电机驱动板103
  • 2.1、读ABZ信号的cpr
  • 2.1.1、接线
  • 2.1.2、编译,下载代码
  • 2.1.3、转动电机,观察串口打印
  • 2.2、驱动ABZ电机M1
  • 2.2.1、接线
  • 2.2.2、修改代码
  • 2.2.3、串口发送指令,观察电机运行
  • 2.3、驱动ABZ电机M2
  • 2.4、驱动双ABZ电机
  • 三、电机驱动板405
  • 四、总结



  • 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、磁编码器

  • 磁编码器体积小,性能强,价格便宜,发展的很快,会越来越多的代替光电编码器。

    磁编码器购买链接: 某宝购买
  • 需要说明的是,有些磁编码器上电后可以输出当前绝对位置对应的脉冲数(需要配置相应的寄存器)。下图:
  • 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 购买链接:某宝购买
    2804电机购买链接:某宝购买

    2.1.2、编译,下载代码

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

  • 第一次输出的cpr肯定不准确,因为电机上电为任意位置,
  • 可以发送指令“2”读取任意时刻的cpr。
  • 2.2、驱动ABZ电机M1

    2.2.1、接线

    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小节有说明,不清楚的可以去查看。
  • 接线:

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

    2.4、驱动双ABZ电机


    电机驱动板103 购买链接:某宝购买
    2804电机购买链接:某宝购买

    请结合上面的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电源。


    (完)
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » SimpleFOC移植STM32(九)——使用ABZ编码器控制电机

    发表评论