找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
61#
 楼主| Angus 发表于 2024-3-24 11:16:54 | 只看该作者
本帖最后由 Angus 于 2024-3-24 21:26 编辑

在做位置估算时,要用到一个低通滤波器。低通带宽若太低,转速响应慢;若太高,起转时容易受干扰、同步慢。所以,可以启转成功后, 把带宽加倍,以加快转速的响应。

低通滤波器的带宽配置函数 Set_PWM_Frequency_LPF(72437760ul/gPWM_Period, 200);   参数一是数据采样频率, 即PWM 频率;参数二是低通滤波器的带宽“角频率”值 Ommega,  实参若用200,转折频点=200/3.14159/2 = 32Hz

此代码中,低通带宽在 main() 中配置后,未再配置。对于风机来说这样做没什么影响。


此低通带宽值在 ADC 中断里计算时用到,所以,可以在 ADC 中断里调用此函数、重新配置低通带宽。


回复 支持 反对

使用道具 举报

62#
匿名  发表于 2024-3-25 11:04:58
Angus 发表于 2024-3-24 11:16
在做位置估算时,要用到一个低通滤波器。低通带宽若太低,转速响应慢;若太高,起转时容易受干扰、同步慢。 ...

这里的低通滤波器,是为了得到一个比较平滑的反电动势是吗?能否详细讲讲。这个算法在启动和低速时和速度正常时的区别,以及如何切换的,谢谢!
回复 支持 反对

使用道具

63#
 楼主| Angus 发表于 2024-3-26 09:07:29 | 只看该作者
游客 223.112.186.x 发表于 2024-3-25 11:04
这里的低通滤波器,是为了得到一个比较平滑的反电动势是吗?能否详细讲讲。这个算法在启动和低速时和速度 ...

我们是dq 轴估算,直接计算出 q 轴的电势,这个反电势直接与转速成正比。

刚启转时,电流容易受干扰 ADC 数据更容易跳动,计算出的反电势也会数据跳动,就是含有高频分量,由此计算出的转速值,也会有数据跳动。低通滤波,就是滤除数据跳动分量。实际机械转速几乎不跳动,就是频率较低,带宽较窄。

启转成功后,数据比较稳定,可以适当增大一点点带宽,加快转速响应,特别是转速会快速变化的应用。
回复 支持 反对

使用道具 举报

64#
 楼主| Angus 发表于 2024-4-1 12:40:11 | 只看该作者
电机公式是 V - Ri = Ldi/dt + E ;  位置估算输入的电压,一般先把电机绕线电阻的压降去掉,即先计算等式左边的 V-Ri
我们的代码是用电压的 25mV 数值计算的,可以保证电压不足10V的低压电机的计算精度。最大电压可到 1638.3V,380V 的电机也无需修改电压数据精度。

先计算 V- Ri, 196/197行是Vd/Vq电压的 25mV 数值。Ri 计算结果是 伏,就要乘 40 得 25mV 数值
R = 毫欧/1000 = RESISTER_COIL / 1000
i = 电流ADC值/1安电流的ADC 值
电流 Iq_Measure_f3,是电流ADC 值乘8的数值(乘8是为了后面位置估算提高精度),所以电流ADC值 = Iq_measure_f3/8
CURRENT_Adc1000 是1安电流的ADC值、再乘1000的数据,所以1安电流 ADC 值 =  CURRENT_Adc1000 / 1000
所以电流 i = (Iq_Measure_f3/8) / (CURRENT_Adc1000/1000)



40*R*i  = 40 * (RESISTER_COIL/1000)*【(Iq_Measure_f3/8) / (CURRENT_Adc1000/1000)】
上式简化后 40*Ri = 5*RESISTER_COIL * Iq_Measure_f3 / CURRENT_Adc1000
Iq_Measure_f3 有 15 位,如果电阻RESISTER_COIL 有17位,前面乘积就 32位了,就不能再乘5了,所以把乘5移到分母除5。

第200行代码本应除5,做四舍五入要加 2.5, 加不了小数,就变成加5除10。
回复 支持 反对

使用道具 举报

65#
 楼主| Angus 发表于 2024-4-1 15:01:41 | 只看该作者
本帖最后由 Angus 于 2024-4-1 15:18 编辑

如果做弱磁控制,要在 194行,增加电流求模的计算


195行,求Iq*Iq + Id*Id ,乘后除4,是防止与后面乘积相加后数据溢出。
196行,如果数值太小,为提高开方精度,先左移12、开方后再右移6。右移了5位是补偿196行开方前的右移2。


弱磁控制的转速 PI 运算结果,是电流的模 Is_set_f12
如下 708行就要变成 :
Iq_set_f12 = temp32 * cos() ;   
Id_set_f12 = temp32 * sin() ;    // 这个偏角=0时, 就是Id=0控制。偏角为负时,Id设定值负值,就是弱磁控制。
可做个“电流Is——偏角”表格,按电流的模Is 查表得偏角,再求Iq,Id



回复 支持 反对

使用道具 举报

66#
 楼主| Angus 发表于 2024-4-17 17:12:47 | 只看该作者
本帖最后由 Angus 于 2024-4-17 22:11 编辑

新唐 M451 无感 FOC 是如何很快起转成功的?

无感 FOC 的起转,是先托动,就是电磁场吸引着转子永磁体转动。
刚开始,转子位置未知,用较大电流吸着磁铁转,所以磁铁跟得紧,电流方向与磁铁夹角小于90度,如下图。





转速稍快后,磁铁位置准确了。由于电流大转矩大,转速又慢,所以电流方向与转子夹角仍小于90度。若想让二者夹角到90度,有两个方法:
1>,加快电流转速。让电流方向,尽快转到 Q 轴位置——90度。  如果电流不减小,可能要转很多圈,电流方向才能赶上90度位置,切同步慢。
2>,减小电流降低转矩,永磁体转不动就会落后,直到落后电流方向 90度,就变同步转。 如果电流减太快、转矩降太快,重载时,还没变同步,就转不动而停转了。

所以,以上两个办法,同时使用,才能尽快变到同步转动。

这里再详细说一下电流加速度。
为了加快电流转速,我们采用了指数加速的方式。如下图

刚开始时,转速要慢,要让电流吸住磁铁转。转到磁铁位置准确了,就要尽快转到90度,这时指数加速,电流方向可很快转到90度

转速调整函数, Adjust_Pull_Ommega(Speed_Inc,  PULL_Ommega_Inc_f16 ,  PULL_Ommega_Max_f16);   
函数内这样实现
Pull_Ommega_f16 += Pull_Ommega_f16 * Speed_Inc >>14 ;      // 指数加速
Pull_Ommega_f16 += PULL_Ommega_Inc_f16 ;                        // 线性加速


拖动刚开始,如果只想线性加速,可以让实参一 = 0,磁铁位置准确了,再用非0实参。


回复 支持 反对

使用道具 举报

67#
 楼主| Angus 发表于 2024-4-19 17:36:13 | 只看该作者
本帖最后由 Angus 于 2024-4-21 18:18 编辑

状态 4 起转流程图



锁定电流 CURRENT_MotorLock_f12 的取值:大小让重载时能转得动。
锁定时间 TIME_MotorLock 的取值: 反转最大角度时,能转到位。比如想逆时针转,电流在 12点锁定,此时磁铁若在8点会是最大反转角度,锁定时长要让磁铁转到12点差不多。先用电流半值驱动,是让轻载时减缓转速、减轻在 12 点左右的来回抖动。

线性加速度 PULL_Ommega_Inc_f16 的取值,重载起动时(起转较慢), 拖动最少的圈数能起转成功,一般两三圈, 或四五圈就能同步。
轻载时磁铁跟得紧,线性加速度若取值小,要到转速较高时、要转很多圈电流方向才能追上Q轴,就用指数加速度加快电流增速。逐步增加指数加速度值,让轻载能较快同步。

拖动转速上限 PULL_Ommega_Max_f16 :比最小能同步的转速高一点。比如在500 rpm 以下无法同步转,则拖动转速上限可取值700rpm 以上。
拖动转速下限 PULL_Ommega_Min_f16 : 一般比最小同步转速小一点。比如500rpm以下无法同步转动,则拖动转速下限可取值 300rpm以下。高于此转速才判断是否同步。

拖动电流增减量 PULL_Current_Inc_f12 :轻载时工作电流较小,若拖动电流较大不降低,转速要加到较快才能同步。拖动两三圈以后(重载已同步)减电流,轻载能尽早切同步。
拖动电流下限取值可按上限的1/2到 1/8 之间,  在状态4 代码中确定,主要是为了轻载能在低速同步,不必拖动到较高转速才能同步,此代码中用的  CURRENT_Pull_Max_f12/8


回复 支持 反对

使用道具 举报

68#
 楼主| Angus 发表于 5 天前 | 只看该作者
本帖最后由 Angus 于 2024-4-28 10:00 编辑

状态 4 起转波形


从上图可见,收敛速度很快,电流方向追赶估算角度的速度有点慢。若要加快起转,就要缩短这段时间。
回复 支持 反对

使用道具 举报

69#
 楼主| Angus 发表于 3 天前 | 只看该作者
本帖最后由 Angus 于 2024-4-28 11:11 编辑

状态 3 快速起转的流程。



拖动起始电压,和起始转速,在跳转到状态 3 之前赋值,如下图 393~396 行。初始电压的确定依据是绕组不过流,又让轻载能转动。电流 = 电压 / 绕组阻抗。
拖动起始转速不必从0开始,可从拖动转速下限 PULL_Ommega_Min_f16 ,这可加快起转速度。


在状态 3,电压逐步增加到 247行给定的电压值——拖动最大电压值,这个电压值的确定依据:重载时能让电机转得动。

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



位置收敛后角度 Angle_q 加快调整,接近估算角度时,就可以同步转了,但 234 行代码并未立即切同步,而是保持在状态 3 继续执行 1~3倍的 L/R 时间后——电流和转动都稳定了——再切同步。
可以切同步但未切同步的时段,是准同步状态,可适当提高一点电压,以提高转速,让转动更稳定。这个电压值是 239 行设定的。




回复 支持 反对

使用道具 举报

70#
 楼主| Angus 发表于 3 天前 | 只看该作者
本帖最后由 Angus 于 2024-4-27 11:00 编辑

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

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


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

回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU