SimpleFOC移植STM32(五)—— 电流采样及其变换_极对数对电流采样的影响
1.1.2、电流采样方式
电流采样主要有三种方式:
1.1.2.1、低侧电流采样

低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。
1.1.2.2、高侧电流采样

高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。
1.1.2.3、内置电流采样

内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。
这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。
1.2、电流变换
本节增加电流环,主要增加了以下功能,
1.2.1、AD转换
为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。

1.2.2、clark变换

1.2.3、Park变换

Park变换中的“θ”是电角度,由读出的编码器角度转变而来

1.2.4、LPF运算

1.2.5、PID运算

二、电流采样参数设置
2.1、INA240介绍


2.2、电流实际波形


2.3、SimpleFOC V2.0.3 的参数

2.4、PowerShield V0.2 的参数

2.5、SimpleMotor 的参数

三、扭矩模式
SimpleFOC中有三种扭矩模式:
3.2.1、电压模式(Voltage mode)

3.2.2、直流模式(DC current mode)

3.2.3、FOC模式(FOC current mode)

3.2.4、三种模式对比

四、硬件介绍
4.1、原理图

4.2、SimpleMotor方案
4.2.1、准备清单
| 序号 | 名称 | 数量 |
|---|---|---|
| 1 | SimpleMotor | 1 |
| 2 | 带编码器云台电机 | 1 |
| 3 | USB转串口 | 1 |
| 4 | 12V或24V电源 | 1 |

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

只展示M1的接线,M2的接线根据原理图自行连接。
4.3、STM32方案
4.3.1、准备清单
| 序号 | 名称 | 数量 |
|---|---|---|
| 1 | STM32核心板 | 1 |
| 2 | SimpleFOCShield V2.0.3 | 1 |
| 3 | 带编码器的云台电机 | 1 |
| 4 | USB转串口 | 1 |
| 5 | 5V电源 | 1 |
| 6 | 12V电源 | 1 |
| 7 | 杜邦线 | 若干 |

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

Shield V2.0.3的背面按照上图短接

对照 Shield V2.0.3 的原理图:
| STM32核心板 | V2.0.3 |
|---|---|
| PA0 | 5 |
| PA1 | 9 |
| PA2 | 6 |
| PB9 | 8 |
| PA3 | A0 |
| PA4 | A2 |
| 3V3 | 3V3 |
| GND | GND |
| 如果是AS5600编码器,如下 | |
| STM32核心板 | AS5600电机 |
| —- | —- |
| PB6 | SCL |
| PB7 | SDA |
| 3V3 | VCC |
| GND | GND |
| 如果是TLE5012B编码器,如下 | |
| STM32核心板 | TLE5012电机 |
| —- | —- |
| PB15 | MOSI |
| PB14 | MISO |
| PB13 | SCK |
| PB8 | CSQ |
| GND | GND |
| 3V3 | VCC |

只展示M1的接线,M2的接线根据原理图自行连接。
五、程序演示


注意:
1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8),
2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。
5.1、力矩模式
5.2、速度模式
5.3、位置模式
5.1、5.2、5.3不再写教程,请根据上一篇文章操作
六、代码升级说明
本文已于20211222第一次升级了代码:
1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。
2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。
3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。
4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。
之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。
5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。
6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。
7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。
8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。
9、这个系列的代码开放到这一章为止,之后的双电机控制不再开放,只提供给购买SimpleMotor的客户,本人其实是很想把所有代码完全开放,至少可以扩大我的影响力,但这会影响到付费客户的体验,如果花了钱和不花钱得到的资料一样多。
(完)
作者:普通网友