找回密码
 立即注册

QQ登录

只需一步,快速开始

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

无感FOC代码: 调试简单,起转顺利

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

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

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

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


顺风启转,直接同步


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


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


无感 FOC 代码 M451_FOC_V26.zip (829.53 KB, 下载次数: 2871) 带详细中文注释量产后可开放 M4_SVPWM.lib。
1>,在 DQ 坐标轴做的磁链观测器,并且用到了 M4 的 DSP 指令加快运算。
2>,有电流超前角,基速以下 MTPA 控制,基速以上弱磁控制。
3>,三闭环控制,有功率闭环控制。
4>,有加速度控制,可调节加减速的快慢。
5>,积分分离法 PI 抗饱和运算。
6>,有顺风起转功能。
7>,静止起转有两种方法可选:普通启动和快速启动。
  
每一行代码都反复检查并测试,我们精雕细琢,只为性能卓越

此代码效果的视频 M451_Video.zip (32.33 MB, 下载次数: 757)
电机参数不同或电路不同时,代码修改说明 M451无感FOC 代码说明.pdf (1.91 MB, 下载次数: 2590)

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

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


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




















M451_FOC基本原理.pdf

1.73 MB, 下载次数: 3759

分享到:  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-11-23 15:58 编辑

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

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

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


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



解这个一元二次方程,得

不同Is对应的超前角可做一个折线。假如最大工作电流是32A,做32个点,1A一个点。算出N =Is (取整),则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, 下载次数: 921

回复 支持 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

使用道具 举报

88#
 楼主| Angus 发表于 前天 15:55 | 只看该作者
本帖最后由 Angus 于 2025-5-17 19:39 编辑

转速计算和控制四

压缩机在停转时一般不能立即关功率管,立即关功率管机械结构会猛得回弹,时间长了会损伤机械结构,应有个减速的过程。

M451 无感 FOC 代码,有加减速控制。代码中每25ms 电转速增加 50,一个 3000RPM 两对磁极电机,3秒内达到最快转速。 减速时每次减200,快了四倍。
代码中可修改这个加减速度。


全速3000 rpm 的电机,如果转速加到2500 rpm ,功率已到最大,不能再增加转速,代码如何处理呢? 功率 PI 运算采用增量式算法就轻易解决了此问题。

假如转速设定3000 rpm,  转速已到 2500 rpm,  则25ms 后,转速再增加 50。
如果功率 PI 算出增量是 300,只能按转速控制增加50,不然加速度就太快了。如果功率 PI 算出必须减 10,那就减10,不然功率就超了。即,功率 PI 算出的增量,和转速控制的增减量,哪个小,就计入哪个。这样在功率不超的前提下,加速度或减速度,都是期望的值。

回复 支持 反对

使用道具 举报

87#
 楼主| Angus 发表于 3 天前 | 只看该作者
本帖最后由 Angus 于 2025-5-17 10:55 编辑
游客 58.49.24.x 发表于 2025-5-16 08:35
这里有个疑问,限压后,轻载能满足启动的电压电流要求,重载时,电压会不会不够用?毕竟负载不同,需要的 ...

限压多少,应按重载测试的效果确定,轻载启动稍快一点,依然很平稳,转速不会冲到很快。

限压带来的最大好处,是启动代码变得简单了,调整启动特性容易了。
回复 支持 反对

使用道具 举报

86#
匿名  发表于 3 天前
Angus 发表于 2025-4-12 14:30
V26版,优化了启动逻辑,提速逻辑和缺相检测,并且把ADC 限流改为周期性检测和阶梯性报警。
如何做到重载启 ...

这里有个疑问,限压后,轻载能满足启动的电压电流要求,重载时,电压会不会不够用?毕竟负载不同,需要的电流不同,电压也相应不一定。
回复 支持 反对

使用道具

85#
 楼主| Angus 发表于 4 天前 | 只看该作者
本帖最后由 Angus 于 2025-5-19 11:11 编辑

转速的计算和控制三。

同步转动时,测量转速值未更新也不做转速 PI 。在转一扇区时间、长于转速 PI 计算周期后,多次执行转速 PI 函数做一次 PI 运算,这相当于减小了积分系数,即随着转速降低,转速积分系数跟着降低。


如果不想让积分系数一直降低,就把变量 WaitCount 利用起来,当转速低到一定程度,Do_Spd_PI 一直不更新,而 WaitCount 已加到上限,也做一次转速 PI 运算。就得到了如下转速积分系数曲线:

代码中 WaitCount 计数到 6 做完一次 PI 运算,让 Do_Spd_PI = -1,目的是如果转速又立即更新了,Do_Spd_PI=0, 不会 1ms 后又做一次转速 PI 运算。




回复 支持 反对

使用道具 举报

84#
 楼主| Angus 发表于 4 天前 | 只看该作者
本帖最后由 Angus 于 2025-5-19 10:59 编辑

转速的计算和控制二

启动时,至少转过 N 个扇区,转速的计算才正确。在转速正确之前,不能做转速 PI 运算。每计算一次转速,变量 Do_Spd_PI 就加1。启动时赋值 Do_Spd_PI = -N-3;  转过一个扇区边界后 Do_Spd_PI = -N-2 ;  算是起点,再转过一个扇区边界Do_Spd_PI= -N-1; 就有了一个扇区前后两个边界的角度和时间,Do_Spd_PI= -2 时就有了 N 个扇区两边的角度和时间,就可计算出正确的转速了。


启动时不能做转速 PI 控制,也不能让转速设定值一直往上增加,所以代码中让转速设定值变量 RPM_Set_Target 一直等于测量转速。
启动后只有转到 Do_Spd_PI = -2 时,转速才正确,前面虽转速数据不对,让RPM_Set_Target = 测量转速,也无妨,因不做转速 PI 控制。 Do_Spd_PI = -1 以后就可以做转速 PI 控制了。



另一方面,启动阶段未变同步转动时 Motor_Status & 0x10) = 0,也不能做转速 PI 控制,也不能让设定转速一直往上增加。
启动时,是先 Do_Spd_PI 增加到0、还是先变同步转,不一定。

回复 支持 反对

使用道具 举报

83#
 楼主| Angus 发表于 5 天前 | 只看该作者
本帖最后由 Angus 于 2025-5-19 11:00 编辑

转速的计算和控制一。

转速的计算: RPM 转速 = 转过的角度/一圈角度/时间,再换算成一分钟转过的圈数。

有些应用,转动是不均匀的,比如活塞式压缩机,压缩时转速变慢,回程时转速快, 计算转速要在一个机械周期内求平均。
如下图一个机械周期有四个电周期。

为了加快转速控制的响应,每转过一个扇区,我们就对前面一个机械周期——24个扇区,求平均转速,所以要保存前面24个扇区边界的角度和时间,即至少25组数据。

代码中结构体数组 Section_data[SECTION_RPM_AVERAGE +2],保存跨过扇区边界时的角度的时间,SECTION_RPM_AVERAGE 是一个机械周期的扇区数 。


上图 N = 24 个扇区一个机械周期,如果转动在宏观上是平稳的,第 N 个扇区转动时间,将等于第 N+1个扇区的时间。这样可更快发现转速的变化,转速控制的响应将更快,这个留给有兴趣的人去测试。代码中保留了 N+1 个扇区的边界数据,即 N+2 组数据。
每次 PWM 检查一次,若跨过扇区边界就记录一下角度和PWM计数值,角度不会刚好是60度。时间用 PWM 周期个数再乘 PWM 一个周期的时间。







回复 支持 反对

使用道具 举报

82#
 楼主| Angus 发表于 2025-4-12 14:30:40 | 只看该作者
本帖最后由 Angus 于 2025-4-29 15:00 编辑

V26版,优化了启动逻辑,提速逻辑和缺相检测,并且把ADC 限流改为周期性检测和阶梯性报警。
如何做到重载启动顺利,轻载启动转速又不上冲呢? 方法说出来其实很简单:限压。 说出这两个字有人立马就明白了,很多事就是一层窗户纸。

电机的转速与电压成正比,300V 电压轻载时若有一万转,启动时限压30V转速就不会高于一千转。重载时转速稍低一点,900转左右,不会太低。

以 V26 代码为例,启动时,在状态5 代码中。407行,设定限压值再跳转去状态3或状态4,开始电流拖动。一旦转起来,反电势会让实际电流下降。电流实际值可能远小于设定值,即控制处于输出饱和状态。变同步时再做调整。



回复 支持 反对

使用道具 举报

81#
 楼主| Angus 发表于 2025-3-14 09:16:23 | 只看该作者
本帖最后由 Angus 于 2025-5-14 22:00 编辑
游客 58.49.24.x 发表于 2025-3-14 08:34
思路好。不过有另外的问题,假如没有缺相,启动失败也发生了,那这时怎么判断是什么故障? ...

如果没缺相,标志 TempFlag_Open 不会写成非0,一次启动失败,会停一秒左右,再次启动。如果电机卡住了根本转不动,FailCnt 失败计数,多次失败就不再启动了(上图中 286行),需人工干预,不会报缺相故障,报多次启动失败故障。

正常情况一次就能启动成功。若负载很重,偶尔会失败一次,第二次能启动成功。
回复 支持 反对

使用道具 举报

80#
匿名  发表于 2025-3-14 08:34:14
Angus 发表于 2025-3-12 16:58
缺相时,电流等于0,似乎缺相不难检测出,可做起来并不容易。
正常转动时,角度=0或180度时,相电流等于0, ...

思路好。不过有另外的问题,假如没有缺相,启动失败也发生了,那这时怎么判断是什么故障?
回复 支持 反对

使用道具

79#
 楼主| Angus 发表于 2025-3-12 16:58:47 | 只看该作者
缺相时,电流等于0,似乎缺相不难检测出,可做起来并不容易。
正常转动时,角度=0或180度时,相电流等于0,所以不能检测到电流=0就认为是缺相。如果检测到电流=0持续一段时间才认为是缺相,则在确定缺相前,电机已无法正常转动,可能已关功率管了。

启动期间三相的电流差异较大,缺相的条件很难确定。长时间电流较小, 检测多长时间合适也不容易确定。

实际测试还发现,断线的那相,电流ADC 数据异常波动,波动幅度已超过了轻载、低速转动的电流。 如果设置一个电流门限,低于此门限就认为是缺相,电流判断门限若设置高了,轻载低速时会误判为缺相。若门限低了,真缺相又会判断不出来




我们最终确定的办法是,启动前在 240 度通电,通电时间参考 L/R,一般几个毫秒就可以。这时电流经 C 相流向 AB 相, 三相都有电流,AB 相电流是 C 相的一半。如果有一相电流比设定电流小一半以上, 置位一个标志,可能缺相了。 继续启动, 如果后面启动成功了,就不认为是缺相,清除标志(310行)。如果后面启动失败了,才确定是缺相(285行),这样就减少了误判。





回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU