找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
21#
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

使用道具 举报

22#
 楼主| Angus 发表于 2023-2-15 17:19:27 | 只看该作者
本帖最后由 Angus 于 2024-3-12 15:28 编辑

停转时一定关功率管吗? 停转后可以去状态0关功率管,也可去状态5 保持小电流锁定状态。这个由宏定义 MOTOR_STOP_STATUS 配置。

转速的设置有个上限RPM_Set_Max、下限RPM_Set_Min, 还有个停转值 RPM_Stop_Value,停转值一般取负值,因为负值比0值更能让电流PI运算的结果——电流设定值——下降更快,电机停转也就更快。

状态1输出0电压,六个管子都输出PWM,七段式上下管交替导通50%,五段式下三管常通,都会刹车。
状态2输出0电压,但只下三管输出PWM, 上三管保持关断,七段式SVPWM下管只导通50% 时间,所以不会刹车,又可以给自举电容充电。main()开头,外设初始化时,进状态2 等50ms,就是给自举电容充电 50ms(RPM_Set 初值= RPM_Stop_Value -1)。

起转前,先进入状态2,给自举电容充电,充电时间到后,检测转速设定值RPM_Set,代码见下面截图:
1> 若转速设定值RPM_Set 比停转值RPM_Stop_Value 还小,就是给自举电容充电后功率管保持关断,去状态0 (201行)。
2> 若转速设定值RPM_Set 大于停转值RPM_Stop_Value,但小于0(204行),  执行完状态2 就是保持停转状态。由MOTOR_STOP_STATUS 配置是停在状态0、还是跳转去状态5保持小电流锁定。




状态5锁定后,检测转速设定值 RPM_Set 是否大于0(328行),转速设定值大于0才起转,否则保持锁定状态,代码截图如下:








回复 支持 反对

使用道具 举报

23#
 楼主| Angus 发表于 2023-2-16 09:27:08 | 只看该作者
本帖最后由 Angus 于 2023-2-21 10:16 编辑

此代码起转方式,是 I/F 起动,还是V/F 起动?

这两种起动方式可以在代码中选配,由宏定义 __DO_CURRENT_PI_WHILE_ACTIVE  配置。

若选配了起动过程中做电流PI,就是I/F 起动,起动时,在状态2给自举电容充电后,变状态5磁体先吸到某个位置(这里耗费较长时间),再变状态4控制起转过程。整个过程电流是受控制的,对保护控制器比较有利。


若未定义__DO_CURRENT_PI_WHILE_ACTIVE ,就是起动过程不做电流PI控制, 起动时,在状态2给自举电容充电后,变状态3控制起转过程,起动过程稍快,但不做电流控制,电流波动较大。所以起动电压不要太大,防止电流冲太高对功率管不利

回复 支持 反对

使用道具 举报

24#
 楼主| Angus 发表于 2023-2-19 12:36:38 | 只看该作者
本帖最后由 Angus 于 2023-2-21 20:30 编辑

PWM  频率 15KHz 以上,用五段式 SVPWM, 可降低功率管开关次数,减小功率管发热量。
若 PWM 频率较低,10KHz 以下,就用七段式 SVPWM ,可降低 PWM 频率开关噪音,因为电流通断频率是 PWM 频率的两倍。

函数 M4_SVPWM() 是按五段式计算出的、三对PWM 的不供电时间。在本例中,就是PWM 低电平时间,是两边低电平时间和。把三个指针返回值,除2后写入占空比寄存器即可。

如果要用七段式,低电平最短的那路PWM, 低电平时间 temp16 要减半,另两相低电平时间,也减去 temp16/2

返回值 Section 的低16位,是 T1+T2,  即最大导通相的高电平时间。所以 temp16 = PWM周期 - Section 就是:低电平时间最短那相的、低电平时间。
五段式变七段式,只要三个指针返回值,都再减 temp16/2 就可以了,代码如下。


返回值 Section 低16位是 T1+T2 未修正值,如果它超过周期值了,就不必减了。




回复 支持 反对

使用道具 举报

25#
 楼主| Angus 发表于 2023-2-21 22:23:17 | 只看该作者
本帖最后由 Angus 于 2023-2-22 08:52 编辑

Vd_out_f17, Vq_out_f17 是电流 PI 计算出来的,有可能它俩的模大于母线电压,再计算 SVPWM 时,就会出现 T1+T2 > PWM 周期的情况。这时会修正 T1+T2 = PWM 周期,输出电压就比 Vd_out_f17, Vq_out_f17 小了,这时若用Vd_out_f17, Vq_out_f17做位置估算,比实际输出电压值大,位置估算数值就出错了。

因此 SVPWM 若 T1+T2 > PWM 周期,就要修正 Vd_out_f17 = Vd_out_f17 * PWM 周期/(T1+T2),  Vq_out_f17 =  Vq_out_f17 * PWM 周期/(T1+T2),如此 Vq/Vd 又等于实际输出电压了。

代码如下
在做 SVPWM 时,I_beta,I_alpha  二者已赋值去掉15位小数的电压值Vq_out_f17, Vd_out_f17,  Section 的低16位是未修正的 T1+T2
432, 433行,把电压修正后,再恢复小数位,赋值给Vq_out_f17,Vd_out_f17


此处修正用的不是PWM 周期,而是 Pwm_Duty_Uplimit,因为这个值是计算 SVPWM 的上限,T1+T2 大于这个值,就会修正到这个值。
回复 支持 反对

使用道具 举报

26#
 楼主| Angus 发表于 2023-2-24 21:59:57 | 只看该作者
本帖最后由 Angus 于 2023-2-25 20:28 编辑

为什么 T1+T2 > Pwm_Duty_Uplimit 时,就要等比例减小T1,T2 呢, 这个上限本应该是 PWM 周期,为何可以比 PWM 周期小呢?
  
当 T1 + T2 = PWM 周期时,输出电压达到最大,电压向量就是下图中、最大的那个边长为(VDD*2/3)的六边形,这种情况,上管导通的占空比很大,下管导通时间很短。双电阻测电流方式,因不能轮换测电流相,可能会在某个时刻测不到电流,或因下管导通时间太短,测到的电流误差太大,影响角度估算。


在红蓝相输出电压最大时,红蓝相下管导通时间几乎=0。


如果 SVPWM 计算时,限制 T1+T2 最大= PWM*0.8,则输出电压向量的六边形大小,就减小到80%,限制了下管导通的时间 >= 20%.  这样在下管导通时测电流的时间就很宽裕了,当然,这样最大输出电压也低了一些。

回复 支持 反对

使用道具 举报

27#
 楼主| Angus 发表于 2023-3-2 22:00:25 | 只看该作者
本帖最后由 Angus 于 2023-3-3 16:00 编辑

观测器函数M451_FOC_Reckon()总在执行,只是在磁铁不转时,估算出的磁铁角度数值 Estimate_Q_Position 会大幅度跳动,数值是随机的。

电机转起来后,有了反电势,反正切估算出的角度Estimate_Q_Position 跳动幅度变小, 当数据跳动连续N 次小于某个值时(代码中可配置),就认定磁铁角度估值准确,就是估算已收敛,变量Position_Explicit 变非0。但这时电磁场与磁铁的位置不一定是90度,可能大于90度,也可能小于90度。



起转时,电流强托,电磁场角度逐增 Angle_q += Pull_Ommega >>16;
估算收敛后,启转函数Adjust_Pull_Ommega() 中会加快、或减慢电磁场的转速Pull_Ommega,向永磁体垂直方向靠近, 同时返回磁铁垂直方向(Q轴)与当前电磁场的角度差Estimate_Q_Position - Angle_q,做为调整电流的依据。






回复 支持 反对

使用道具 举报

28#
 楼主| Angus 发表于 2023-3-20 22:19:17 | 只看该作者
从黄色估算角度的曲线来看,角度很快就收敛了。
启动10ms 左右角度就收敛了。这个图一大格200ms,只有开头的一点点时间,角度不准确,几乎看不出来。




回复 支持 反对

使用道具 举报

29#
 楼主| 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

使用道具 举报

30#
 楼主| Angus 发表于 2023-4-10 11:00:25 | 只看该作者
本帖最后由 Angus 于 2023-4-10 13:27 编辑

Kp 如何取值呢?

楼上已推导出 Ki 取值 = RKp/L,我们重新推导楼上过程,


上式,是一阶低通滤波器的公式,低通的带宽(或转折频点)是

套用拉氏反变换公式,可求出冲激响应。或者把上式变成微分方程也可求出时域解为下式:

冲激响应的积分,是阶跃响应。对上式求积分,得到输入突变时的输出公式、和函数图形如下。


低通,除了用带宽描述,还有一种描述方法是: 阶跃上升时间,一般取“输出上升到1-1/e ”的时间,做为上升时间,如上图,t=L/Kp 时上升到 1-1/e。
电机的电流 PI 控制,电流上升时间一般取15个PWM周期以上,上升太快,输出容易振荡。
我们代码中的注释,建议取值 20~100个 PWM周期, 即低通带宽是 PWM 频率的 1/20~1/100
确定了低通带宽,就确定了Kp


这就是电流 PI 控制系数的计算方法。





回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU