本帖最后由 Angus 于 2024-9-15 16:21 编辑
这里讲一下短路保护代码。 逻辑关系有点绕,但工作可靠。
短路信号接到 PWM 的 Brake 功能引脚,短路时,PWM 输出立即关闭功率管、然后产生 Brake 中断。
进 Brake 中断后 811 行写标志,表明执行过Brake中断,用于中断外检查。
812 行写标志,表示关了功率管。如果干扰较强,可采用 BrakeCount 计数的方式,两次或三次 Brake 信号确定是短路了,就保持关功率管关闭。 如果硬件做的好(比如用IPM)短路信号没有干扰,一次 Brake 信号就有效。
清除 Brake 中断标志 PWM0->INTSTS1 后 PWM 的输出就会恢复,不清除 Brake 中断标志退出中断后又会反复进 Brake 中断,所以 816行关了 Brake 中断再返回 ,这样即可保持功率管关闭,又不会反复进 Brake 中断了。
Brake 中断里不能改写状态机 Motor_Status = 0, 因为Brake 中断优先级高,后续可能返回 ADC 中断又被改写,可能打乱 ADC 里的状态机。在中断外、主循环里有“是否发生 Brake ”的检查和后续处理,如下 297 行在这里,改写Mortor_Status =0 才是可靠的。296行把 Stop_Runing 相应位写1,后面检查此标志,RPM_Set 会一直赋值为停转值,不再起转。
以后,只要 Stop_Runing 不清0,406行都会把转速设定值 RPM_Set 写成 <=0 的停转值,Motor_Status 会保持在0、电机自由停转,不会再重新启转。
执行到 343 行时,检查短路是否已解除。 若短路保护已解除,即 Brake_No_Resume =0 了,这里清除 Brake 中断标志PWM0->INTSTS1 、恢复 PWM 输出,重新使能 Brake 中断。Stop_Runing 的短路标志也清除,但此时 Motor_Status=0,因在ADC 中断里有 PWM0->MSKEN = 0 , PWM 引脚输出仍保持着关闭功率管。
功率管如果用的是 IPM , 短路时 Fo 输出几十 us 低脉冲,然后输出高。如果是15V 太低,Fo 会持续输出低,二者都会产生 Brake, 所以, 如果后续检测到是 15V 太低,不是短路,也解除短路保护。
如果没有其它错误,Stop_Runing=0, 后续转速设定值 RPM_Set 就可以正常赋值了。一切从新开始,由 RPM_Set 的值决定是否启转。
|