找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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


顺风启转,直接同步


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


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


无感 FOC 代码 M451_Exhaust_V23.zip (450.43 KB, 下载次数: 1840) 中文注释非常详细,量产后可开放 M4_SVPWM.lib。此代码已在220V 排烟机上测试过,原理图见后面回贴。
电机参数不同或电路不同时,代码修改说明 M451无感FOC 代码说明.pdf (1.88 MB, 下载次数: 1544)

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

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


技术支持电话
新唐上海公司   021 - 62365999

M451_FOC基本原理.pdf

1.73 MB, 下载次数: 2687

分享到:  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 发表于 2022-1-23 21:36:38 | 只看该作者
本帖最后由 Angus 于 2023-6-8 20:58 编辑

这里讲一下 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后才与控制量对应,  这样公式就变成了

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


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









回复 支持 1 反对 0

使用道具 举报

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

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

模拟 PID 运算公式 :

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


采用增量式算法:


下面是转速 PI 运算的代码
代码600 行:增量 = Kp*[本次误差 - 上次误差] + Ki * 本次误差
代码 601 行,temp32 = U(n-1) + 增量。
603 ~ 605行,计算结果 temp32 做限幅后,再赋值给电流设定值变量 Iq_set_f12

  

这里不能对 Iq_set_f12 先赋值,再对Iq_set_f12 做限幅检查。因为ADC 中断的优先级更高,计算时若产生 ADC 中断,Iq_set_f12 的中间结果在 ADC 中断里做电流 PI 运算,数值就不对了。  



PI 系数 Kp_Speed, Ki_Speed 是有12小数的,所以 601 行应右移 12 ,未右移,就是计算结果保留了 12 位小数。做电流PI 运算时会做小数位的对齐。







回复 支持 1 反对 0

使用道具 举报

73#
 楼主| Angus 发表于 2024-6-2 17:07:38 | 只看该作者
本帖最后由 Angus 于 2024-6-3 18:06 编辑

用新唐 M451 做的一个 24V 的空气泵,无感 FOC 控制。

反复启动的视频

24V泵反复启动的视频.zip (5.72 MB, 下载次数: 15)

示波器一大格是50ms,  可以看出,起动时间每次都不到 0.05秒。
回复 支持 反对

使用道具 举报

72#
 楼主| Angus 发表于 2024-5-30 13:32:47 | 只看该作者

高压无感 FOC 代码执行后,用 PinView 查看引脚配置


回复 支持 反对

使用道具 举报

71#
 楼主| Angus 发表于 2024-5-30 12:32:37 | 只看该作者
本帖最后由 Angus 于 2024-5-30 13:53 编辑

高压电机控制的 CPU 部分。


回复 支持 反对

使用道具 举报

70#
 楼主| Angus 发表于 2024-5-30 12:31:34 | 只看该作者
高压电机控制的功率驱动部分。



R114 的阻值按保护电流选取,取值 75欧时,保护电流 10A
回复 支持 反对

使用道具 举报

69#
 楼主| Angus 发表于 2024-5-30 11:35:28 | 只看该作者

高压电机控制的 AC/DC 部分。



回复 支持 反对

使用道具 举报

68#
 楼主| Angus 发表于 2024-5-30 11:33:55 | 只看该作者
高压电机控制的电源部分


回复 支持 反对

使用道具 举报

67#
 楼主| Angus 发表于 2024-5-11 09:58:25 | 只看该作者
本帖最后由 Angus 于 2024-5-11 16:36 编辑

I/F 起动的好处是,电流比较稳定,不会过流。 V/F起动的好处是切同步快,但波形不好。


代码中 V/F起动,是电压加到设定值后,再转一段时间,确认稳定了,就切同步。 轻载时,电压较低就进入准同步状态。这里还可以改进,轻载时不必加到指定电压再切同步,可以早一点。代码可按如下修改: 变量 Circle_Over 做扇区计数。

245 行, 还没进入准同步状态,扇区计数 Circle_Over 清0。
234 行准同步状态,扇区计数到 6 就切到同步。这期间,每转一扇区,电压就增加一点,见240行。



能保持 6 个扇区在准同步状态(每转过一扇区,电压还会增加一点),就说明转动足够稳定了。

这个代码改动,下次更新。
回复 支持 反对

使用道具 举报

66#
 楼主| Angus 发表于 2024-4-30 10:00:46 | 只看该作者
本帖最后由 Angus 于 2024-4-30 13:00 编辑

为保证切到同步后能可靠保持同步转动,除了角度收敛,一般还需其它条件,才切同步。比如转速已高于能同步转的最低转速。
我们采用的方法是,在某个电压下能稳定转动一会儿。

起动时若能执行到235行,表明 Angle_q 与估算 Q 轴之间的角度偏差已很小。如果输出电压已增加到 234 行的值(转速与电压基本成正比,但有滞后),还能反复执行到此——Angle_q 角度始终保持在估算 Q 轴附近,那就可以切同步了。




当然,也可以改为用实际转速值 RPM_Measure 是否高于某个下限,来决定是否最终要切同步。
回复 支持 反对

使用道具 举报

65#
 楼主| Angus 发表于 2024-4-26 23:03:34 | 只看该作者
本帖最后由 Angus 于 2024-4-27 11:00 编辑

24年4月26日以后更新的代码,完善了状态 3 起转。 下图可见,切同步较快。

压缩泵起转波形,50ms 内切同步,电流 PI 值可以稍大一点,以加快响应。


风机起转波形,0.2 秒切同步

回复 支持 反对

使用道具 举报

64#
 楼主| Angus 发表于 2024-4-26 22:53:39 | 只看该作者
本帖最后由 Angus 于 2024-4-30 09:36 编辑

状态 3 快速起转的流程。



拖动起始电压,和起始转速,在跳转到状态 3 之前赋值,如下图 394~397 行。
394行初始电压的确定依据是,让轻载能转动即可。
397行拖动起始转速,可参考拖动转速下限值。


在状态 3,电压逐步增加到 248行给定值——拖动最大电压值,这个电压值的确定依据是:即使不转,也不会过流,电流=电压/(电阻+电抗)。

若 248 行的电压值,写成和 394 行一样的初值,可验证 394 行的初值能否让轻载转得动。


位置收敛后角度 Angle_q 加快调整,接近估算角度时,就可以同步转了。代码并未立即切同步,而是保持在状态 3 继续执行一段时间,到电压增加到指定值,并且再 L/R 时间后——电流和转动都稳定了——再切同步。

可以切同步但未切同步的时段,是准同步状态,可适当提高一点电压,以提高转速,让转动更稳定。这个电压值是 234 行设定的。






回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU