SimpleFOC移植STM32(五)—— 电流采样及其变换
目录
- 一、原理说明
- 1.1、电流采样
- 1.1.1、为什么要采样电流
- 1.1.2、电流采样方式
- 1.1.2.1、低侧电流采样
- 1.1.2.2、高侧电流采样
- 1.1.2.3、内置电流采样
- 1.2、电流变换
- 1.2.1、AD转换
- 1.2.2、clark变换
- 1.2.3、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 的参数
- 三、扭矩模式
- 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、准备清单
- 4.2.2、接线
- 4.3、STM32方案
- 4.3.1、准备清单
- 4.3.2、接线
- 五、程序演示
- 5.1、力矩模式
- 5.2、速度模式
- 5.3、位置模式
- 六、代码升级说明
SimpleFOC的教程比较多,总链接方便查找文档:SimpleFOC教程链接汇总
本文已于20211222更新,升级了代码,代码下载,本文最后有链接
一、原理说明
1.1、电流采样
1.1.1、为什么要采样电流
FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题:
1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。
2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。
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、AD转换获取电流值Ia和Ib,
- 2、通过Clark变换得到Iα和Iβ ,
- 3、获取电机角度,通过Park变换得到Id和Iq,
- 4、Id、Iq不能突变,同时为减少干扰,做平滑滤波,
- 5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq,
1.2.1、AD转换
为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。
1.2.2、clark变换
1.2.3、Park变换
Park变换中的“θ”是电角度,由读出的编码器角度转变而来
1.2.4、LPF运算
- dc_current模式只有 Iq 的LPF运算
- foc_current模式有 Iq 和 Id 的LPF运算
1.2.5、PID运算
- dc_current模式只有q轴电流的PID运算
- foc_current模式有q轴电流和d轴电流两个变量的PID运算
- 电流环使用 P、I 两个参数。
二、电流采样参数设置
2.1、INA240介绍
- INA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。
- 电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。
2.2、电流实际波形
- 下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V,
- 下图为电机转动时运放输出端波形
2.3、SimpleFOC V2.0.3 的参数
- 采样电阻0.01 Ω
- 运放为INA240A2,放大倍数50
- 背面需分别短接A0/A2至输出
- C1_OUT=INA_VCC/2 + 0.01 * I * 50
- 如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A)
- 如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A)
- B相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。
2.4、PowerShield V0.2 的参数
- 采样电阻0.001 Ω
- 运放为INA240A2,放大倍数50
- C1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A)
2.5、SimpleMotor 的参数
- 采样电阻0.001 Ω
- 运放为INA240A1,放大倍数20
- C1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A)
三、扭矩模式
SimpleFOC中有三种扭矩模式:
- Voltage mode - the simplest one
- DC current mode - 1xPID controller + 1xLPF
- FOC current mode - 2xPID controller + 2xLPF filters
3.2.1、电压模式(Voltage mode)
- 电压模式是之前示例中一直使用的模式,
- 因为不用采样电流,所以硬件简洁,程序简单,执行速度快,
- 适合低速电机控制
3.2.2、直流模式(DC current mode)
- 检测电流大小,实现电流环控制
- 只控制Iq,设置Vd=0,
- 像控制直流电机一样控制无刷直流电机的电流
3.2.3、FOC模式(FOC current mode)
- 控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩,
- 唯一真正的转矩控制方法,
- 保证电机始终工作在高效状态
3.2.4、三种模式对比
四、硬件介绍
4.1、原理图
4.2、SimpleMotor方案
4.2.1、准备清单
序号 | 名称 | 数量 |
---|---|---|
1 | SimpleMotor | 1 |
2 | 带编码器云台电机 | 1 |
3 | USB转串口 | 1 |
4 | 12V或24V电源 | 1 |
带编码器云台电机可以是AS5600,也可以是TLE5012B。
AS5600电机 购买链接:某宝购买
TLE5012B电机 购买链接:某宝购买
SimpleMotor 购买链接:某宝购买
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 | 杜邦线 | 若干 |
带编码器云台电机可以是AS5600,也可以是TLE5012B。
AS5600电机 购买链接:某宝购买
TLE5012B电机 购买链接:某宝购买
simpleFOCShield V2.0.3购买链接:某宝购买
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的客户,本人其实是很想把所有代码完全开放,至少可以扩大我的影响力,但这会影响到付费客户的体验,如果花了钱和不花钱得到的资料一样多。
(完)
升级后源码下载:
链接:https://pan.baidu.com/s/1gex-l-KQbw-hRLxzE-ptPg
提取码:g921
欢迎加入simpleFOC技术交流群:923734429 群已满根据提示添加新群 (入群申请写:CSDN)
请继续阅读相关文章:
SimpleFOC移植STM32(一)—— 简介
SimpleFOC移植STM32(二)—— 开环控制
SimpleFOC移植STM32(三)—— 角度读取
SimpleFOC移植STM32(四)—— 闭环控制
SimpleFOC移植STM32(五)—— 电流采样及其变换
SimpleFOC移植STM32(六)—— 双电机控制和力矩反馈
SimpleFOC移植STM32(五)—— 电流采样及其变换相关推荐
- SimpleFOC移植STM32(二)—— 开环控制
目录 注意事项 一.硬件介绍 1.1.硬件准备 1.1.1.SimpleMotor方案 1.1.2.SimpleFOCShield V2.0.3方案 1.2.硬件连接 1.2.1.原理图 1.2.2. ...
- SimpleFOC移植STM32(六)—— 双电机控制和力矩反馈
目录 一.说明 二.硬件介绍 2.1.原理图 2.2.准备清单 2.3.接线 三.程序演示 3.1.设置参数 3.2.编译下载 3.3.根据设置的控制模式操作 四.双电机控制总结 五.力矩反馈 5.1 ...
- SimpleFOC移植STM32(七)—— 移植STM32F405RGT6
目录 说明 一.点亮LED 1.1.原理图 1.2.硬件准备 1.3.烧写 二.开环控制 2.1.硬件准备 2.2.硬件连接 2.3.打开工程 2.4.修改参数 2.5.编译下载,观察运行 三.角度读 ...
- SimpleFOC移植STM32(三)—— 角度读取 (AS5600、AS5047P、TLE5012B、MA730、MT6701、ABZ)
目录 说明 一.硬件介绍 1.1.硬件准备 1.1.1.SimpleMotor方案 1.1.2.STM32方案 1.2.硬件连接 1.2.1.原理图 1.2.2.接线 二.代码编译下载 2.1.代码解 ...
- SimpleFOC移植STM32(九)—— ABZ编码器电机
目录 说明 一.ABZ编码器介绍 1.1.ABZ信号 1.2.光电式编码器 1.3.磁编码器 1.4.差分信号 二.电机驱动板103 2.1.读ABZ信号的cpr 2.1.1.接线 2.1.2.编译, ...
- SimpleFOC移植STM32(八)—— 霍尔电机
目录 说明 一.霍尔电机 1.1.电机的种类 1.2.霍尔传感器 1.3.SimpleFOC的霍尔电机控制原理 二.电机驱动板103 2.1.读取霍尔角度 2.2.驱动霍尔电机M1 2.3.驱动霍尔电 ...
- 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(6)- foc速度闭环控制
[FOC控制]英飞凌TC264无刷驱动方案simplefoc移植(6)- foc速度闭环控制 [FOC控制]英飞凌TC264无刷驱动方案simplefoc移植(6)- foc速度闭环控制 一.电机选择 ...
- 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(2)-SVPWM波实现
[FOC控制]英飞凌TC264无刷驱动方案simplefoc移植(2)-SVPWM波实现 SVPWM波实现就是无数电机foc控制的核心,所以这一节就如何在英飞凌无刷驱动上时间互补pwm波形做讲解 [F ...
- 【FOC控制】英飞凌TC264无刷驱动方案simplefoc移植(3)-FOC控制原理矢量控制
英飞凌TC264无刷驱动方案simplefoc移植(3)-FOC控制原理矢量控制 无刷电机是矢量控制,是交流电机调速的核心,也是Foc控制的核心 以下内容学习自[自制FOC驱动器]深入浅出讲解FOC算 ...
最新文章
- python安装方法32位_Python-3.9.0 安装教程【64位/32位】
- python处理视频动漫化_用Python实现抖音上的“人像动漫化”特效,原来这么简单...
- 解决复制虚拟机时候网络不从eth0开始问题
- 【jquery】select下拉框赋值
- Dalvik Vm架构
- 一个有趣的问题 : 如何设计一个线程池
- c#用控制台程序安装启动停止卸载服务
- 杂谈:Molehill API 的体现
- Atitit.软件开发的最终的设计 dsl化,ast化(建立ast, 解析执行ast)
- 联想9439微型计算机拆机,e43a 拆解文章.docx
- 细说ConcurrentHashMap扩容规则
- 苹果计算机怎么隐藏应用,苹果电脑怎么隐藏界面图标
- vivado添加设计源文件
- matlab中abs函数,Matlab中的abs函数是什么意思
- Unity - Timeline 之 Timeline Setting(Timeline的设置)
- psql -d temp 时候的txid_current!
- 工业4.0时代 个性化定制掀起制造业新篇章
- 我的世界服务器怎么使用无限附魔bug,我的世界惊现全新无限刷物品bug 服主大大都要注意了...
- 记一次计通项目(网元设计)(更新中)
- delphi生成一个随机序列号
热门文章
- oracle over的用法;
- ASP.NET毕业设计 C#高校档案数字化管理系统的设计与实现-王翔-专题视频课程
- 【PyTorch】RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemm()
- java 接口超时控制_Java接口请求响应超时的解决办法
- Android 最完整的五指棋代码示例
- 沉香与宋代八雅的关系
- 各式各样的极品程序员,你属于哪一种
- 保底掉落装备matlab,强化保底上线?这些增加强化几率的道具也别忘记使用
- Flipper_模拟和栈
- UDS protocol - 周期报文 periodical message 多字节通信 multi-byte message