找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
64#
 楼主| 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实参。


回复 支持 反对

使用道具 举报

63#
 楼主| Angus 发表于 2024-4-1 12:40:11 | 只看该作者
本帖最后由 Angus 于 2024-9-15 16:30 编辑

电机公式是 V - Ri = Ldi/dt + E ;  位置估算输入的电压,一般先把电机绕线电阻的压降去掉,即先计算等式左边的 V-Ri
我们的代码是用电压的 25mV 数值计算的,可以保证电压不足10V的低压电机的计算精度。最大电压可到 1638.3V,380V 的电机也无需修改电压数据精度。

先计算 V- Ri, 187/188行是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。

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

使用道具 举报

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

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

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

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

使用道具 举报

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

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

使用道具

60#
 楼主| Angus 发表于 2024-3-24 11:16:54 | 只看该作者
本帖最后由 Angus 于 2024-9-15 16:28 编辑

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

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

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


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


回复 支持 反对

使用道具 举报

59#
 楼主| Angus 发表于 2024-3-7 08:33:09 | 只看该作者
本帖最后由 Angus 于 2024-4-1 10:11 编辑
游客 223.112.186.x 发表于 2024-3-6 15:41
关于PARK变换,求出id,iq,我下载的代码如下:(无法发送图片,只能复制)
////===求Idq,前俩实参最大正负65 ...

正余弦值 C11,C12,C21,C22有15位小数,所以Ia,Ib乘c11~C22后右移15位去掉小数, 加16384是四舍五入。

若不用浮点运算,整数除法,得到的只有整数的商和余数,比如 20~24 除10,=2.0~2.4, 商是整数部分2。25~29 除10,=2.5~2.9,商也是整数部分2,如何让整数部分是 3 呢?

整数运算没法加0.5,那就在被除数上,加除数的一半(等于加了0.5)。25~29, 加5后再除10 =3.0~3.4,整数部分刚好是3。而20~24 加5后除10 = 2.5~2.9,整数部分仍是 2。


也就是说,整数除法的四舍五入,是在除之前,先在被除数上加除数的一半,再做除法,结果就四舍五入了。

所以,右移15是除32768,四舍五入就在被除数上先加 16384。
回复 支持 反对

使用道具 举报

58#
匿名  发表于 2024-3-6 15:41:33
关于PARK变换,求出id,iq,我下载的代码如下:(无法发送图片,只能复制)
////===求Idq,前俩实参最大正负65535(可同时最大),否则计算溢出 ========
// *_I_alpha,  输入 I_alpha 返回 Id
// *_I_beta,   输入 I_beta 返回 Iq           
//  _q_Angle   q 轴角度,[0 ~ 65536)表示[0~360)度
void Static_to_Dynamic(int32_t *_I_alpha, int32_t *_I_beta, int32_t _q_Angle)
{
  int32_t  C11,  C21 ;
  int32_t  Ia = *_I_alpha,  Ib = *_I_beta ;
  
  C11 =  _q_Angle ;
  C21 = Get_cos(&C11) ;
                                                              // 65535*0x8000+16384= 0x7FFFC000
  *_I_alpha = ((Ia*C11+16384)>>15)+((-Ib*C21+16384)>>15);     // 65536 * 0x8000   = 0x80000000 溢出
  *_I_beta  = ((Ia*C21+16384)>>15)+ ((Ib*C11+16384)>>15);     //-65536 *(-0x8000) = 0x80000000 溢出
}                                                             //-65535 *(-0x8000) = 0x7FFF8000

上面的的两个等式*_I_alpha和 *_I_beta  =,和公式不一致,楼主能给讲讲吗?谢谢@
回复 支持 反对

使用道具

57#
匿名  发表于 2024-2-28 08:41:04
Angus 发表于 2024-2-23 18:44
如果是交流220V 整流得到的直流,有人为节省成本母线电容用的小,母线电压波动大,这时最好每次PWM 都测 ...

谢谢楼主。
回复 支持 反对

使用道具

56#
 楼主| Angus 发表于 2024-2-23 18:44:00 | 只看该作者
游客 223.112.186.x 发表于 2024-2-23 14:39
楼主,每次都要采样母线电压的值吗?不太明白,母线电压不是固定不变的吗?请楼主解惑。另外,原理图对不 ...

如果是交流220V 整流得到的直流,有人为节省成本母线电容用的小,母线电压波动大,这时最好每次PWM 都测一次电压比较好。

此代码是三电阻或双电阻测电流,在PWM 计数起点测电流,即下MOS 导通中间。

我测试的板子,稍做了改动,只要测到母线电压和三相电流,就能转起来。ADC 引脚用哪个、就配置哪个就行。
回复 支持 反对

使用道具 举报

55#
匿名  发表于 2024-2-23 14:39:38
Angus 发表于 2022-10-27 21:48
电压的基准值是 0.1V。最大值是 16383,若超过此值, 乘4后大于等于65536做坐标旋转会溢出,即最大工作电压 ...

楼主,每次都要采样母线电压的值吗?不太明白,母线电压不是固定不变的吗?请楼主解惑。另外,原理图对不上啊,能否分享一张实际的原理图,采样的是那个点,采样的是相线电压还是母线电压,谢谢!
回复 支持 反对

使用道具

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

本版积分规则

新唐MCU