找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

谢谢楼主。
回复 支持 反对

使用道具

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

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

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

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

使用道具 举报

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

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

使用道具

55#
 楼主| Angus 发表于 2024-2-8 18:00:25 | 只看该作者

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



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

使用道具 举报

54#
 楼主| 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欧,这个电压值也是对的。






回复 支持 反对

使用道具 举报

53#
 楼主| 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 一次,加快了响应。
回复 支持 反对

使用道具 举报

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

使用道具 举报

51#
a20084666 发表于 2024-1-2 14:07:43 | 只看该作者
上桥180欧姆的电阻,感觉很大
回复 支持 反对

使用道具 举报

50#
 楼主| 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,就取消了指数加速,转速仅线性增加。



回复 支持 反对

使用道具 举报

49#
 楼主| 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 的值决定是否启转。





回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU