SimpleFOC Porting to STM32 (7) – Porting STM32F405RGT6

目录

  • 说明
  • 一、点亮LED
  • 1.1、原理图
  • 1.2、硬件准备
  • 1.3、烧写
  • 二、开环控制
  • 2.1、硬件准备
  • 2.2、硬件连接
  • 2.3、打开工程
  • 2.4、修改参数
  • 2.5、编译下载,观察运行
  • 三、角度读取
  • 3.1、硬件准备
  • 3.2、硬件连接
  • 3.3、接线说明
  • 3.4、打开工程
  • 3.5、修改代码
  • 3.6、编译下载,观察运行
  • 四、闭环控制
  • 4.1、硬件准备
  • 4.2、硬件连接
  • 4.3、打开工程
  • 4.4、修改代码
  • 4.5、编译下载,观察运行
  • 五、电流采样
  • 5.1、硬件准备
  • 5.2、硬件连接
  • 5.3、打开工程
  • 5.4、修改代码
  • 5.5、编译下载,观察运行
  • 5.6、当前问题
  • 六、双电机控制
  • 6.1、他山之石
  • 6.2、硬件准备
  • 6.3、硬件连接
  • 6.5、打开工程
  • 6.5、修改代码
  • 6.6、编译下载,观察运行
  • 6.7、本节重点
  • 七、力矩反馈
  • SimpleFOC的教程比较多,做了一个总的链接,欢迎点击阅读:SimpleFOC教程链接汇总

    说明

  • 前面六节用STM32F103C8T6演示了电机的FOC控制,受制于单片机性能,电机所能达到的最大速度不超过1000RPM。本文采用STM32F405RGT6,单片机性能提高,电机最大转速可以达到3000RPM。
  • 前四个代码开放,网盘链接在每一节的开始位置。
  • 和前面六章用STM32F103C8T6相比,移植后的代码,应用部分是完全相同的,主要是底层驱动不同。
  • 前面文章已经详细讲过的技术难点本文不再重复,如有不懂可看下前面几篇文章。
  • 一、点亮LED

    链接:https://pan.baidu.com/s/17qQ46F0iCBFMCMNmwC0gnA
    提取码:k11o

    1.1、原理图

    1.2、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1


    1.3、烧写

    注意:
    1、如果接了外部12V电源,ST-link的3.3或者5V电源就不要再跟单片机连接,
    2、ST-link跟单片机连接,以前我都是只接三根线,现在发现RST信号接入后烧写更稳定了。

    二、开环控制

    你仍然可以阅读前面这篇文章,以获取更多详细的介绍,SimpleFOC移植STM32(二)—— 开环控制

    本节代码下载:
    链接:https://pan.baidu.com/s/1W2JHhauEoUN_0f2LhlJ-uA
    提取码:4kyc

    2.1、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1
    4 USB转串口 1
    5 2804云台电机 1

    mODrive 购买链接:某宝购买
    电机 购买链接:某宝购买

    2.2、硬件连接

  • 电机三根线随便接,不用区分相序,
  • 代码中使用USART2与串口调试助手通信,也就是驱动板的GPIO 3为TXD2,4为RXD2,所以驱动板的GPIO3接串口的RXD,GPIO4接串口的TXD。

  • 2.3、打开工程


    2.4、修改参数

  • 开环控制中,最重要的参数就是voltage_limit,
  • 电机抖动转不起来把voltage_limit设置的大一点,
  • 电机发热严重的把voltage_limit设置的小一点,
  • 串口发送指令,比如“T10”,后面别忘了回车换行符。
  • 2.5、编译下载,观察运行

  • 常用的串口调试软件,在发送区敲回车,对应的16进制数据为0D 0A,也就是回车换行;Arduino IDE自带的串口监视器,输入指令点发送,只有16进制的0A。所以不能用Arduino IDE的软件给当前代码发送指令。
  • 发送指令,从低速开始逐渐增加,速度设置过快电机容易失步变成振动。速度单位为rad/s,6.28表示一圈每秒。

  • 三、角度读取

    你仍然可以阅读前面这篇文章,获得单独读某一个编码器的代码,SimpleFOC移植STM32(三)—— 角度读取

    本节代码下载:
    链接:https://pan.baidu.com/s/1YrT5unNBFKMGDQByhpgwXA
    提取码:gbpo

    3.1、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1
    4 USB转串口 1
    5 带编码器云台电机 2
    6 杜邦线 若干

    mODrive 购买链接:某宝购买
    电机 购买链接:某宝购买

    3.2、硬件连接


    3.3、接线说明

  • I2C接口用M0的A/B为SCL0/SDA0,M1的A/B为SCL1/SDA1,
  • 如果是SPI接口的编码器,GPIO1为M0的CS,GPIO2为M1的CS,
  • 3.4、打开工程

  • 如果需要打印速度,可以把屏蔽打开。

  • 3.5、修改代码

  • “MyProject.h”文件中选择编码器型号,1表示使用,0表示不用。

  • 3.6、编译下载,观察运行


    四、闭环控制

    如果对闭环控制的概念不了解,可以先看这篇文章 SimpleFOC移植STM32(四)—— 闭环控制

    本节代码下载:
    链接:https://pan.baidu.com/s/1Bha2drDvGBN-s00lSc7kKA
    提取码:ra3b

    4.1、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1
    4 USB转串口 1
    5 带编码器航模电机 1
    6 杜邦线 若干

    mODrive 购买链接:某宝购买
    电机 购买链接:某宝购买

    4.2、硬件连接


    4.3、打开工程

    4.4、修改代码

  • 修改电机极对数和零点校准电压。关于零点校准的说明,有疑问的请看 SimpleFOC移植STM32(四)—— 闭环控制
  • 选择编码器型号,本节中用AB信号,当前代码不支持Z信号,下一节会增加对Z信号的支持。

  • 4.5、编译下载,观察运行


    最大转速可以达到T300(300 rad/s = 47.8圈/s = 2866)。

    五、电流采样

    更多详细的介绍,请阅读前面这篇文章,SimpleFOC移植STM32(五)—— 电流采样及其变换

    5.1、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1
    4 USB转串口 1
    5 带编码器航模电机 1
    6 杜邦线 若干

    mODrive 购买链接:某宝购买
    电机 购买链接:某宝购买

    5.2、硬件连接


    5.3、打开工程


    5.4、修改代码

  • 极对数和voltage_sensor_align,根据实际使用电机确定,
  • PID参数仅供 参考,非最佳参数,
  • 编码器增加了对Z信号的支持,有详细注释说明。请充分理解Z信号的意义,请充分理解相对值和绝对值编码器的区别。

  • 5.5、编译下载,观察运行

  • 同样是T300的转速,但是电流比上一节的电流要小,不知道是PID参数设置的好,还是电流环的加入让电机更加平稳,
  • 5.6、当前问题

  • 电机转速超过T300,电流会急剧增大,并且在每次角度跨零时抖动一下,
  • 我对比了ODrive的处理方法,程序没有直接使用读取到的编码器角度,而是利用估算的角度计算,读取的编码器角度只用来校正估算角度,
  • 我觉得这个问题是影响电机转速继续提升的原因。

  • 六、双电机控制

    更多详细的介绍,请阅读前面这篇文章,SimpleFOC移植STM32(六)—— 双电机控制和力矩反馈

    6.1、他山之石

         在STM32F103C8T6的应用中,电流采样采用Inline模式,AD转换随用随取,不用考虑同步的问题;而在当前的Lowside采样模式下,只能在下臂打开的同时采样电流,需要配置AD转换为定时器触发模式,先来看下odrive的电流采样方法:

  • TIM1/TIM8的PWM频率配置为24KHz( 168M/(3500*2) ),

  • 每个PWM周期包含两次更新,TIM_1_8_RCR为2,所以每3次触发一次定时器更新,更新频率为16KHz。

  • 下臂关闭的时候,采集的电压为电流为0时的电压,做校准,

  • 下臂打开的时候,采集的电流做为有效电流值处理,

  • TIM1更新触发
    ADC1注入转换channel_6/Vbus,
    ADC2注入转换channel_10/m0_phB,
    ADC3注入转换channel_11/m0_phC,

  • TIM8更新触发
    ADC2规则转换channel_13/m1_phB,
    ADC3规则转换channel_12/m1_phC,


  • 本文代码只在上电时,采样一次Vbus(电源电压),正常运行不对ADC1触发采样,
    本文代码只在上电时,校准下电流为0时的电压,正常运行不做校准,


    6.2、硬件准备

    序号 名称 数量
    1 mODrive 驱动板 1
    2 12V电源 1
    3 ST-link 1
    4 USB转串口 1
    5 带编码器航模电机 2
    6 杜邦线 若干

    mODrive 购买链接:某宝购买
    电机 购买链接:某宝购买

    6.3、硬件连接


    6.5、打开工程


    6.5、修改代码

    根据编码器类型选择

    6.6、编译下载,观察运行

    A指令控制M0电机,B指令控制M1电机。

    6.7、本节重点

  • 两个电机同时控制,电机的最大转速不能达到上节的T300。表现为电机转速比如A250,观察电流会发现电流随角度变化而变化。这个问题应该不是单片机性能不够,而是代码架构需要调整。像odrive一样,设定周期读取角度,处理电机转动。
  • 两个电机同时转动,容易互相干扰,表现为电机转速高了后电机振动,转速上不去,比如在上一节单电机控制中,电机最大转速为T300,而在有干扰的情况下,最大转速到200就振动得几乎失控。参考odrive的做法,设置两个PWM波形一定的相位差,


  • 在实际控制中,参考了odrive的做法,同时根据使用的MOS管特性,调整了偏移值以获得最佳效果。

    七、力矩反馈

    自从两个月前改进了力矩反馈的代码后,电机三相线可以随便接,只要电机参数设置好,力矩反馈并无难点,不再赘述!


    (完)

    物联沃分享整理
    物联沃-IOTWORD物联网 » SimpleFOC Porting to STM32 (7) – Porting STM32F405RGT6

    发表评论