找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
31#
 楼主| Angus 发表于 2023-10-27 17:00:03 | 显示全部楼层
M451无感FOC方案,测试飞行器螺旋桨的视频,示波器上可看到电流波形正弦度很好

电调测试.zip (2.38 MB, 下载次数: 224)

如果不固定住,就要起飞了

回复 支持 反对

使用道具 举报

32#
 楼主| Angus 发表于 2023-11-26 17:17:24 | 显示全部楼层
本帖最后由 Angus 于 2023-12-28 11:36 编辑

这里讲一下短路保护代码。 逻辑关系有点绕,但工作可靠。
短路信号接到 PWM 的 Brake 功能引脚,短路时,PWM 输出立即关闭功率管、然后产生 Brake 中断。
进 Brake 中断后 741 行写标志执行过Brake中断,用于中断外检查。743 行写一标志,表示关了功率管。如果干扰较强,可采用 BrakeCount 计数的方式,两次或三次 Brake 信号确定是短路了,就保持关功率管关闭。 如果硬件做的好(比如用IPM)短路信号没有干扰,一次 Brake 信号就有效。

清除 Brake 中断标志 PWM0->INTSTS1 后 PWM 的输出就会恢复,不清除 Brake 中断标志退出中断后又会反复进 Brake 中断,所以 747行关了 Brake 中断再返回 ,这样即可保持功率管关闭,又不会反复进 Brake 中断了。  




Brake 中断里不能改写状态机 Motor_Status = 0, 因为Brake 中断优先级高,后续可能返回 ADC 中断又被改写,或打乱 ADC 里的状态机。在中断外、主循环里有“是否发生 Brake ”的检查和后续处理,如下 254 行在这里,改写Mortor_Status =0 才是可靠的。255行把 Stop_Runing 相应位写1,此后,271行转速设定值就会被写成停转值——小于0的负值。



以后,只要 Stop_Runing 不清0,转速设定值 RPM_Set 就被写成 <=0 的停转值,Motor_Status 会保持在0、电机自由停转,不会再重新启转。

执行到 315 行时,检查短路是否已解除。 若手动按钮取消短路保护,即 Brake_No_Resume =0 了,这里清除 Brake 中断标志PWM0->INTSTS1 、恢复 PWM 输出,重新使能 Brake 中断。Stop_Runing 的短路标志也清除,但此时 Motor_Status=0,因在ADC 中断里有 PWM0->MSKEN = 0 , PWM 引脚输出仍保持着关闭功率管。



如果没有其它错误,Stop_Runing=0, 后续转速设定值 RPM_Set 就可以正常赋值了。一切从新开始,由 RPM_Set 的值决定是否启转。





回复 支持 反对

使用道具 举报

33#
 楼主| Angus 发表于 2023-12-28 11:39:07 | 显示全部楼层
本帖最后由 Angus 于 2024-1-2 13:01 编辑

起转时,即可以线性加速,也可以指数加速。
线性加速的好处是,起转时,如果想让转速慢慢稳定增加,就采用线性加速。

起转开始时,位置不收敛,转速较低,执行64~70行代码,转速逐步增加。
转速低于上限时,67行转速增加量 temp32 先给一个定值,这是线性加速。68行,转速增加一个百分比,这是指数加速度。
然后执行到 87 行,转速增加量 temp32 加到转速Pull_Ommega_f16 上。然后88行Pull_Ommega_f16 去掉16位小数,加到“位置”角度值 Angle_q 上。  



调用函数时,如果实参一用0值,68行转速增加百分比=0,就取消了指数加速,转速仅线性增加。



回复 支持 反对

使用道具 举报

34#
 楼主| Angus 发表于 2024-1-2 20:34:00 | 显示全部楼层
功率管栅极电阻,要根据功率管特性调整。开关慢了发热多,开关快了可能会振荡,发热也会多。
回复 支持 反对

使用道具 举报

35#
 楼主| Angus 发表于 2024-1-4 11:00:11 | 显示全部楼层
本帖最后由 Angus 于 2024-1-5 16:08 编辑

最后的代码更新了什么?

代码中转速的计算方法是: 转过扇区边界时,数组Section_data[] 记录转过的精确角度和时间(PWM计数值);  记录 NUM_SECTION_AVERAGE +1 个扇区边界后,用 NUM_SECTION_AVERAGE 个扇区的角度、除时间,得出一秒转过的角度,再用一分钟转过的角度除360度得一分钟转过的圈数,就是 RPM 转速值了。
顺风起转时,要等转过 NUM_SECTION_AVERAGE +1 个扇区边界,才有 NUM_SECTION_AVERAGE 个扇区的角度和时间。所以在下图359行,Do_Spd_PI(累加到正开始做转速PI)赋值必须至少是 -NUM_SECTION_AVERAGE -1,否则开始做转速 PI 时转速数据不对,电流会突变、电流波形不连续。



另外把转速 PI 的运算频率,从10ms 一次,改为1ms 一次,加快了响应。
回复 支持 反对

使用道具 举报

36#
 楼主| Angus 发表于 2024-1-17 21:06:07 | 显示全部楼层
本帖最后由 Angus 于 2024-2-4 20:00 编辑

今天调试一个新板子,总结一下调试步骤:修改好电机Lq, Ld,绕线电阻RESISTER_COIL,以采样电阻及运放倍数CURRENT_Adc1000以后,核对以下事项

1,核对PWM,  PWM024 驱动上MOS,  PWM135 驱动下MOS。如果不是这样,代码改动稍大。
2,核对PWM 的输出极性,PWM 输出高时功率管导通,如果不是,在函数PWM_Init()中124~125行注释或放开反相函数。

3,核对电流运放的极性,电流流入电机时,运放输出电压增高。电流 ADC 的值为正。若正负反了,在ADC 中断里把Current_PWM01/PWM23/PWM45 数据取反。

4,核对电流 ADC 输入引脚与输出 PWM01/23/45 对应关系。

以上若没错,可以烧录代码,通电了。若转速旋钮=0,上电后在状态0,功率管关闭。这时可以在 ADC 中断代码中增加一个状态7(下面详述两处代码改动)。然后在仿真状态,依次写变量的值 Motor_Status=7,   Angle_q=0,PWM->MSKEN=0(PWM输出),  Id_set_f12 = CURRENT_Adc1000<<2 (电流值=1A), 这个时候,Current_PWM01的值刚好是1A电流对应的ADC 值。

调试电路,代码如下稍做修改。
ADC 中断里,364行这里是增加的状态7,什么都不用做,这个状态用于仿真状态直接变量的值


main.c 中主循环这里,307行,增加if(Motor_Status != 7)排除状态7,即状态7也是什么都不做。


CURRENT_Adc1000 = 0xB333, 此值相当于0.25A电流值,设定电流1A, 就是把 Iq_Set_f12写成其4倍的值 = 0x0002CCCC
如下图,10毫欧电阻放大5.6倍相当于56毫欧。
电流1A时,5V 参考源,12位ADC 值是: (1A*56毫欧/5000毫伏)*4096 = 45.875,  仿真看到 Current_PWM01 = 45,
在0度时,是用Current_PWM23/PWM45计算Ia,Ib的, 所以,只要Current_PWM23/PWM45的电流和=45电流控制就是对的,Current_PWM01的值若比45小是ADC转换的时间窗太短造成的。


输出电压 Vq_out_f17 =1441344,右移17位得0.1V的数值是 : 1441344/131072 = 11,  即输出电压Vq是1.1V,电机电阻是1欧,这个电压值也是对的。






回复 支持 反对

使用道具 举报

37#
 楼主| Angus 发表于 2024-2-8 18:00:25 | 显示全部楼层

有这个宏定义是 I/F 起动,启转阶段从功率管开始工作,电流就在控制范围内。即使换一个型号的电机、电感电阻有较大变化,也不易烧功率管,这是优点。建议初学者先用这个方法试着让电机起转。



若把此句注释掉,就是 V/F 起转,好处是起转快。因起转阶段不做电流 PI 控制、电流波动大,所以需小心确定起转电压。若换个型号的电机、电感电阻参数差异较大,需调整起转电压,否则可能过流。
回复 支持 反对

使用道具 举报

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

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

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

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

使用道具 举报

39#
 楼主| 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。
回复 支持 反对

使用道具 举报

40#
 楼主| 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 中断里调用此函数、重新配置低通带宽。


回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU