找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

15万转无感FOC: 高压风机水泵吸尘器,冰箱空调压缩机

  [复制链接]
跳转到指定楼层
#
Angus 发表于 2016-8-10 16:46:56 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 Angus 于 2024-9-16 08:00 编辑

参考原理图 M451_FOC.pdf (39.23 KB, 下载次数: 4071) , 图中第三相驱动和前两相一样,省略, 省一页图纸。
M451无感FOC吸尘器在10万转时,电流钳测的电流波形

每个PWM周期的计算耗时小于20us。如果 PWM=30KHz/周期33us,转速就可跑到 15万转。

启转快,同步快,代码精简到8K


顺风启转,直接同步


让电流设定值突变,电流响应快、并且无超调


有感FOC的IAR工程代码开始: M451_SVPWM.zip (1.57 MB, 下载次数: 4599)
运行此代码,不接电机,在PWM0_0, PWM0_2, PWM0_4 引脚接 10K/1uF 阻容后就可测到如下波形


带详细中文注释的无感 FOC 代码 M451_FOC_V23_Nu-LVMDM.zip (822.92 KB, 下载次数: 2145) ,量产后可开放 M4_SVPWM.lib。
电流有超前角控制,可实现 MTPA 控制或弱磁恒功率控制。
每一行代码都经过测试和思索,我们精雕细琢,只为性能卓越
此代码效果的视频 M451_Video.zip (32.33 MB, 下载次数: 140)
电机参数不同或电路不同时,代码修改说明 M451无感FOC 代码说明.pdf (1.89 MB, 下载次数: 1845)

PWM 触发ADC中断代码流程:  读取电流 =>迭代运算、估算位置=>算三路PWM 占空比写入寄存器

  
过调制输出电压。 过调制可提高电压利用率


技术支持电话
芯唐电子科技(上海)有限公司   021 - 62365999








M451_FOC基本原理.pdf

1.73 MB, 下载次数: 3013

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 顶1 踩
回复

使用道具 举报

推荐
admin 发表于 2022-11-21 16:08:45 | 只看该作者
M451  可做 FOC + PFC 方案。 也可做 FOC + CAN通信 方案

七段式SVPWM 算法,一个PWM 周期有两次电流注入,所以电流频率是PWM 频率的两倍,PWM 频率若用10KHz(周期是 100us),电流频率主要是20KHz,所以噪音已比较小。

此M451 FOC 方案,PWM(ADC)中断耗时20us左右,所以另一组PWM  完全有时间做 PFC 控制。

我们推荐以下引脚配置, 同时留出CAN 通信引脚。PA2,PA3 可控制大功率 PFC 的主管和副管。

牛卧堂
回复 支持 2 反对 0

使用道具 举报

推荐
 楼主| Angus 发表于 2023-3-30 11:36:26 | 只看该作者
本帖最后由 Angus 于 2023-3-31 21:58 编辑

这里讲一下电流 PI 参数的取值问题

电机可以看成一个电感串一个电阻,其拉氏变换是 1/(sL+R), PI 控制的拉氏变换是 (Kp + Ki/s) , 这俩公式看不懂的,请去复习一下拉氏变换
电流的 PI 控制图如下,x是电流设定值,y是电机的实际电流。PI 控制的输出是电压V,电压加到电机(电阻+电感), 又调整了电流大小,控制的最终结果是 y=x 。因为有积分运算,所以只要 x-y >0, PI 运算的结果V 就会一直增加,所以电机电流y也一直增加,直到 y=x。


上图写成公式

公式化简

令 Ki = K*Kp, K是一个常数,公式变为



上式可变成 y 的二阶微分方程,求出 y  的解,用拉氏反变换的方法也可求出 y 的解。
当设定电流不变、即x=常数时,y 的解的形式是:
其中 x1,x2 是 S 的一元二次方程   的解。我们先不求解,讨论解的形式,比较简单。

S的一元二次方程有俩实数解时,y 的解中,e的指数是实数,y 的值指数变化(增加或衰减)趋于终值C0,没有振荡。
如果上述一元二次方程的解是复数,e的指数是复数,按欧拉公式,就是y的解是三角函数、乘e指数。y的解有三角函数,就是电流 y 有振荡。PI 控制效果、是振荡式趋于稳定值C0,这是我们不希望的。
上述S的二次方程有实根,必须满足:

上式可写成 ,第二个括号内的值 >=0,就满足整个公式>=0。

从第二个括号内式子 4RKp - 4LkKp >=0 得出 R - LK >= 0,即 K <= R/L
所以,Ki 满足下式,  电流响应就不会有振荡:

这就是 Ki 取值的理论依据,实际上 PI 控制环路还有PWM  滞后一个周期等其它微小滞后因素,Ki 的这个临界值,比 R/L*Kp 还大一点,也就是只要Kp的取值不会引起振荡,Ki 取值 = R/L*Kp 也不会振荡。

回复 支持 2 反对 0

使用道具 举报

推荐
 楼主| Angus 发表于 2023-10-3 21:30:50 | 只看该作者
本帖最后由 Angus 于 2023-10-29 18:00 编辑

M451无感FOC方案特性:
1,磁链估计,比电流估计精度好。
2,dq轴估计,比静态坐标轴估计误差小,因为Ld,Lq是常量,而ab轴的电感是随角度变化的,静轴估计理论上就有误差。
3,反正切输入PLL, 比Ea*sin+Eb*cos 输入PLL好,因为前者的值只与角度偏差有关,而后者的值还受转速影响。
4,定点数运算比浮点运算快。电机最小电感仍可10uH以下。我们测试了电感9uH 的吸尘器,起转很好。
5,M4内核有除法指令,更有“抗饱和累加“指令,写代码方便,运算速度快。
6,M451工作电压范围2.5~5.5V, 宽工作电压范围,抗干扰能力强。

回复 支持 1 反对 0

使用道具 举报

推荐
 楼主| Angus 发表于 2024-7-20 11:11:34 | 只看该作者
本帖最后由 Angus 于 2024-9-15 16:05 编辑

新唐M451 无感FOC 代码,做MTPA控制。

先介绍一下理论。文字中的符号, 要显示出来,必须单独上传图片,为了省事,我只好先写成 word 文件,再截成一个大图片上传了。

电流分量代入转矩公式,得


MTPA 控制就是给定电流Is,求角度等于多少时,转矩最大。求导=0得



解这个一元二次方程,得

不同Is对应的超前角可做一个折线。假如最大工作电流是32A,做8个点,4A一个点。算出N = 8*Is/32=Is/4 (取整),则Is对应的超前角在点[ N], [N+1 ]之间,按下式做一个线性计算就可得到角度



M451的无感FOC 代码,起转时Id=0,起转成功能后,第277行代码,切同步前把超前角 Angle_Fai 写成 0,如果以后不再改这个超前角,就是 Id=0 控制。



若要做 MTPA 控制,就在 SysTick 中断里、转速 PI 运算得出 Is 后,再查表求出超前角 Angle_Fai就可以了,求 Iq,Id的代码已写好。




M451做MTPA 控制.pdf

332.75 KB, 下载次数: 113

回复 支持 1 反对 0

使用道具 举报

推荐
 楼主| Angus 发表于 2022-1-23 21:36:38 | 只看该作者
本帖最后由 Angus 于 2024-9-12 13:41 编辑

这里讲一下 Clark 变换

求 I_alpha, I_beta,  就是求电流向量的实部和虚部。A相在0度,B相在120度,C相在-120度,三个电流写成复数形式分别为


求三个电流的“失量和” 。 三相电流的“标量和=0“,即Ia+Ib+Ic = 0,这个不用求。


因为在下MOS 导通时测电流,显然下MOS导通时间长时,电流ADC 受PWM 开关影响就小,值相对准确一些。
如果 C 相下 MOS 导通时间短、就用 Ia 和 Ib 计算电流向量, Ic = -Ia-Ib 代入向量求和公式,得到

消去 Ia 或 Ib 的公式,请读者自己推导

等幅变换中电流向量若是 I,  则对应相电流峰值是 I*2/3。所以上式求出的电流向量,乘2/3后才与控制量对应,  这样公式就变成了

上式这个电流向量的模,正好与相电流的峰值,数值上相等。
下面来看代码,
181~189行,按扇区,选择下MOS导通时间长的两相, 求I_alpha, I_beta,为了减小计算误差先增加小数,数值乘8
191行,1/3 的开方=0.57735 =18919/32768, 所以乘18919再右移15位就是乘1/3的开方,右移小了3位,等于是把结果乘了8


执行完191行后,就求出了 I_alpha,I_beta 。接下来坐标变换求出了有3位小数的 Id 和 Iq 电流









回复 支持 1 反对 0

使用道具 举报

推荐
 楼主| Angus 发表于 2022-1-20 14:35:43 | 只看该作者
本帖最后由 Angus 于 2024-9-15 16:10 编辑

这里讲一下代码中的 PI 运算。

模拟 PID 运算公式 :

去掉微分运算,再把公式离散化,公式变为:


采用增量式算法:


下面是转速 PI 运算的代码
代码 733 行:增量 = Kp*[本次误差 - 上次误差] + Ki * 本次误差
代码 734 行,temp32 = U(n-1) + 增量。
736~739行是抗饱和运算
741 ~ 742行,计算结果 temp32 做限幅后,再赋值给电流设定值变量 Is_set_f12

  


回复 支持 1 反对 0

使用道具 举报

76#
 楼主| Angus 发表于 4 天前 | 只看该作者

main() 主循环中,电机启动流程


更新转速设定值 RPM_Set ,不是一个很紧急的事件,在 main() 主循环中,按旋钮 ADC 值确定转速设定值 RPM_Set 是多少。

在main() 主循环代码中,电机可能在同步转,也可能未在同步转。



一,如果电机在同步转(Motor_Status 的 bit4 非0),下图318行,做以下事情:
如果 RPM_Set  <= 0,  说明电机已在停转降速中,这时需判断一下,若转速已降到最小值以下,就去状态 1 刹车停转。
如果 RPM_Set >0,  这里不需要做什么。电流大小由SysTick 中断里、转速 PI 计算结果决定;电压角度和 PWM 输出占空比,由 ADC 中断里计算、输出。

二,如果电机未在同步转, 下图327 行,要么不需要起动(RPM_Set <= 0),要么需要启动(RPM_Set >0)。



1>,如果不需要起动(RPM_Set <= 0),又已在起动流程(状态3,4,5,6),则直接刹车停转(335行, 去状态1)、或关功率管(去状态0)就行了。
       如果未在启动流程,未转、也未在启转,就判断是否取消故障状态,转向开关是否变了,等等。

2>,如果需要起动、又未在启动流程,执行到 362 行,先调用函数 Test_Period() 判断是否已顺风吹转,若是则跳转到状态6,顺风起转。若未顺风转,跳转到状态 2 先给自举电容充电,充电结束后,在状态 2,按宏定义决定跳转到状态 3 开始 V/F 起转、还是跳转到状态 5 ( 再跳转到状态4)  开始 I/F 起动。

     若需要启动,又已在启动流程,这里就不需要做什么了,ADC 中断里、启动代码会变换状态。





回复 支持 反对

使用道具 举报

75#
 楼主| Angus 发表于 5 天前 | 只看该作者
积分抗饱和运算

如果电机转速已到最大,而设定转速仍比实际转速大,转速 PI 的积分计算仍一直增加电流设定值,最终电流设定值加到上限,可能比电流实际值大很多倍。如下图电流设定值一直加到了高位 =0x0019,十进制的25,比电流实际值 Iq_Measure 的高位= 2,大了12倍多。

这时如果设定转速 RPM_Set 调到 4767 以下,电流设定值要很久才能降到电流实际值以下,而这期间转速不会下降,这就是积分饱和引起的调节滞后,不好的使用体验。




假如本次转速误差 Err_Spd =K,K>0,  
下次 PI 运算时前 Err_Spd_Last = Err_Spd = K ; 到时候若转速设定值与转速实际值一样,即 Err_Spd = 0 ;  则转速 PI 运算就是
temp32 = (Err_Spd - Err_Spd_Last)*Kp_Speed +Err_Spd*Ki_Speed = -K * Kp_Speed ;   
如果下次刚好能让“电流设定值 = 电流实际值”, 那么就不会积分饱和。

即本次转速 PI 计算的电流值若等于下式,下次转速 PI 运算就可以把增量减去,不会积分饱和


本次电流设定值 =  K * Kp_Speed + 电流实际值 = Err_Spd * Kp_Speed + 电流实际值 ;  // 这个是本次电流设定值的上限


K 值取多少呢? 因转速控制精度1%以下,可取转速最大值的 1/64。所以有以下积分抗饱和运算代码:



这段代码的执行效果如下图,电流设定值只增加到实际值的 2.7 倍,这是下次能一次把电流误差回调到 0 的值。




回复 支持 反对

使用道具 举报

74#
 楼主| Angus 发表于 2024-8-13 16:19:47 | 只看该作者
本帖最后由 Angus 于 2024-8-13 16:26 编辑

查表法 MTPA 控制,要先按下式计算出不同电流 Is 下的超前角,做成一个表格。



电机的电阻和电感,都好测量,但磁链常数怎么测量呢?



电机参数里,会给出反电势常数 Ke,  可以按下式求出磁链常数,这里频率 f 是每秒的转速,不是每分钟的转速。

如果不知道电机的参数, 测量磁链常数的最好办法是,用另一个电机拖动,用出示波器测出反势电压峰值,再按上式算出磁链常数。



如果找不到合适的方法用另一个电机拖动,可以让电机空载转起来,采用 Id=0 的控制方式。用下式求出磁链常数。

电机均速转时,Iq 是个常数,求导=0,第一个公式,等号右边前两项=0,  公式就成了下式:

上式等号右边是反电势。转速高时反电势高、计算误差小。
这样就可求出电机的磁链常数了。

在新唐 M451 无感 FOC 的代码中,反电势数值是变量 EMF_Multi_Unit_Magnify , 此变量每个PWM 周期估算位置时更新一次,对此变量低通滤波后,就得到一个稳定的反电势数值。




回复 支持 反对

使用道具 举报

73#
 楼主| Angus 发表于 2024-8-13 15:00:09 | 只看该作者
本帖最后由 Angus 于 2024-8-13 15:17 编辑

MTPA 控制为何比Id=0控制,消耗的电流会小

假定转矩 T 是个常数,电流 iq,id 就是反比关系,Te 公式的意义,见前面回帖。



Iq 与 Id 的函数图像,可以看成是  y= - 1/x 向右平移。如下图

控制器的输出功率,与电流的模有关,即 Is

以 Is 为半径的圆上,控制器的输出功率是相等的。

在电机基速以下,即未达到最快转速时,下图蓝色 Te 是等转矩线,可以理解为负载等转速线(确切来说,应是输出转矩曲线才是负载等速线)。其原理见楼上回帖的讲解。

如果采用 MTPA 控制,达到这个转速,所需电流是蓝色箭头 Is2 。

如果采用 Id=0 控制,达到这个转速,需要的电流是红色箭头 Is1,已超出以 Is2 为半径的圆圈 。

此图很明显得看出,相同转速, MTPA 控制所需的电流 Is2比 Id=0控制所需的电流 Is1 小。



回复 支持 反对

使用道具 举报

72#
 楼主| Angus 发表于 2024-8-13 11:39:16 | 只看该作者
MTPA 控制就是用最小的电流,获得最大转矩 。为什么要获得最大转矩,基础理论是什么 ?

牛顿第二定律  

力矩 = 半径 叉乘 力,
把 "质量与半径平方的积" 定义为转动惯量 J 后,转矩与角速率的关系,和牛顿第二定律一样,称为转动的牛顿第二定律

上式可见,相同的转动惯量,转矩大,角速率的斜率大,即提速快。如果没有摩擦力,会一直加速。
实际的负载——被外力驱动的物体,转速与转矩的公式,是下式:B 是一个常量系数

这是个一阶微分方程,解这个微分方程,可得转速公式与转矩的关系式为:

此函数的形状是这样的。最终转速是 M/B


对于同一个负载,显然,若外加的转矩大,不仅最终的转速高,提速也快。

如果不需要达到电机的最高转速,转矩大的电机,负载达到设定转速的时间短。



回复 支持 反对

使用道具 举报

71#
 楼主| Angus 发表于 2024-8-2 09:00:30 | 只看该作者
Angus 发表于 2023-10-3 21:30
M451无感FOC方案特性:
1,磁链估计,比电流估计精度好。
2,dq轴估计,比静态坐标轴估计误差小,因为Ld,Lq ...

观测器理论不错,起转效果也不错。PWM 中断只用了 20us 多点,MCU 还有很多算力可以利用,接下来是加上高频注入法呢,还是加上 PFC 功能呢 ?

高频注入法中的旋转电压法,可做到 0 速时测到磁铁位置,让电机像有感一样转动,听起来就不错。

冰箱,洗衣机,大风扇等 220V 的应用都需要 PFC 功能,并不在意起转时,反转一个小角度。一个芯片做成电机控制+PFC 是个很受欢迎的方案。
回复 支持 反对

使用道具 举报

70#
 楼主| Angus 发表于 2024-7-18 09:09:04 | 只看该作者
本帖最后由 Angus 于 2024-8-2 09:06 编辑





采用状态 3 起转,起转前不需要锁定


回复 支持 反对

使用道具 举报

69#
 楼主| Angus 发表于 2024-7-15 16:18:28 | 只看该作者
本帖最后由 Angus 于 2024-9-12 16:23 编辑

积分抗饱和的方法

网上查一下,有很多种抗积分饱和的方法,比如,积分分离法,输出限幅法,等等。

我们24年7月以后的代码,积分抗饱和方法是:每次做转速PI 前,检查若转速误差为负(表明指令要降速)并且输出饱和了,就让电流设定值=电流测量值,这样接下来的转速PI 计算结果,一定是降输出电压,也就是退出饱和,要降速了。

回复 支持 反对

使用道具 举报

68#
 楼主| Angus 发表于 2024-7-1 11:00:37 | 只看该作者
本帖最后由 Angus 于 2024-7-15 13:35 编辑

积分饱和

假如输出电压最高时,电机达到最快的 5Krpm,电流稳定在3A。如果设定转速此时是 6Krpm, 转速误差仍有1K, 转速 PI 运算中的积分运算,仍会一次次增加电流设定值,一直加到控制器电流上限,假如是 20A 。  

这时如果转速设定值突然变成 4Krpm,转速 PI 结果——设定电流,从20A慢慢往下降,在降到 3A 前,输出电压不会降,所以转速不会降、保持5Krpm。只有电流降到 3A 再降时,输出电压才开始降,转速也才开始从 5k 往下降。 转速控制会有一个长时间的滞后才反应过来。这就是积分饱和、造成的不良后果。
一个性能优良的电机控制代码,一定有积分抗饱和运算



回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU