大家好、
BLDC 驱动程序是基于 TI 正式发布的 BLDC 传感流程的2级编写的。
_IQ iqVaIn;
_iq iqVbIn;
_IQ IDCfdbk;
D_PWM=_IQ (1);
d_com=_iq (0.333333333333333);//120度换向
//---------------------------------------------------------------
// ADC 转换和偏移调节
//---------------------------------------------------------------
IqVaIn =_IQ15toIQ (((AdcResult.ADCRESULT4<<3)-BemfA_OFFSET);
IqVbIn =_IQ15toIQ ((AdcResult.ADCRESULT5<<3)-BemfA_OFFSET);
IDCfdbk=(_IQ15toIQ (AdcResult.ADCRESULT7<<3)-IDC_OFFSET)<<1;
D_PWM=_IQ (0.6);
连接霍尔模块的输入并调用霍尔传感器读取宏。
//---------------------------------------------------------------
HALL3_READ_MACRO (HALL1)
如果(HALL1.Revolutions>=30)
ClosedFlag=true;
if (HALL1.CmtnTrigHall=0x7FFF)/*仅在霍尔模块检测到换向使能信号时才执行以下代码,这意味着在每个换向周期中执行一次计算,即在新换向周期开始时。*/
{
Speed2.timestamp =虚拟定时器;/* speed2*/的输入
SPEED_PR_Macro1 (speed2)
if (HALL1.Revolutions<=5){/*因为 过滤器是五阶的,所以它需要五个先前的周期值*/
speed3.EventPeriod=speed2.EventPeriod_n_1;
speed3.SUflag=true;
其他(else)
speed3.currenttheta=rg1.Angle;
speed3.HallGpio=HALL1.HallGpioAccepted;
speed3.EventPeriod=speed2.EventPeriod_n;
speed3.SUflag=false;
}
SE_Macro1 (speed3)/*计算速度*/
}
rg1.Freq = speed3.nextspeed;/*将速度值分配给 rg1.Freq*/
RG_MACRO (rg1)/*计算角度*/
fa1.Angle= rg1.out;/*电机 A 0 */
fa1.phiv=_iq (-0);/*提前点火角为零*//*马达 D 48V ~0.9/0.7Nm -0.508 */
FA_MACRO (FA1)/*添加带实际角度的 phiv *//*电机 C 48V ~0.7Nm -0.05 */
Theta=(fa1.out);
Theta_ref1=_IQmpy (D_com、_IQ (0.5));
Theta_ref2= D_com-_iq (0.3333333333333);
if (ClosedFlag == false)
{
pwmcntl1.Duty1 =_IQmpy (_IQ ((HALL1.HallGpioAccepted==2)||(HALL1.HallGpioAccepted=3)、d_pwm);
pwmcntl1.Duty2 =_IQ (1)-(_IQ ((HALL1.HallGpioAccepted=5)||(HALL1.HallGpioAccepted=4));
pwmcntl1.Duty3 =_IQmpy (((HALL1.HallGpioAccepted==1)||(HALL1.HallGpioAccepted=5)、d_pwm);
pwmcntl1.Duty4 =_IQ (1)-(_IQ ((HALL1.HallGpioAccepted=6)||(HALL1.HallGpioAccepted=2));
pwmcntl1.Duty5 =_IQmpy (((HALL1.HallGpioAccepted==4)||(HALL1.HallGpioAccepted=6)、d_pwm);
pwmcntl1.Duty6 =_IQ (1)-(_IQ ((HALL1.HallGpioAccepted=3)||(HALL1.HallGpioAccepted=1));
}
否则{
pwmcntl1.Duty1 =_IQ ((theta>=_IQ (0.25)-theta_ref1)&&(theta <_IQ(0.25)))+_IQmpy( d_pwm,_IQ(((theta>=0)&&(θ <_IQ(0.25)-theta_ref1))) || ((theta>=_IQ (0.91666666666666667)-theta_ref2)&(theta<_IQ (1)));
pwmcntl1.Duty2 =_IQ (1)-_IQ ((theta>=_IQ (0.75)-theta_ref1)&&(theta <_IQ(0.75)))+_IQmpy( d_pwm,_IQ(((theta>=_IQ (0.416666666666667)-theta_ref2)&((theta<_IQ (0.75)-theta_ref1)));
pwmcntl1.Duty3 =_IQ ((theta>=_IQ (0.5833333333333)-theta_ref1)&&(theta <_IQ(0.583333333333333)))+_IQmpy( d_pwm,_IQ(((theta>=_IQ (0.25)-theta_ref2)&&((theta<_IQ (0.5833333333333)-theta_ref1)));
pwmcntl1.Duty4 =_IQ (1)-_IQ ((theta>=_IQ (0))&&(theta <_IQ (0.08333333333333333))+_IQ (((theta>=_IQ (0.0833333333333)+_IQ (1)-theta_reeta)&&(theta) <_IQ(1.0))))+_IQmpy( d_pwm,_IQ(((theta>=_IQ (0.75)-theta_ref2)&&(theta<_IQ (0.0833333333333)+_IQ (1)-theta_ref1)));
pwmcntl1.Duty5 =_IQ ((theta>=_IQ (0.916666666666667)-theta_ref1)&&(theta <_IQ(0.916666666666667)))+_IQmpy( d_pwm,_IQ(((theta>=_IQ (0.58333333333333333)-theta_ref2)&((theta<_IQ (0.916666666666667)-theta_ref1))));
pwmcntl1.Duty6 =_IQ (1)-_IQ ((theta>=_IQ (0.41666666666666667)-theta_ref1)&&(theta <_IQ(0.416666666666667)))+_IQmpy( d_pwm,_IQ(((theta>=_IQ (0.083333333333333)-theta_ref2)&&((theta <_IQ(0.416666666666667)-theta_ref1))) || ((theta>=_IQ (0.083333333333333)-theta_ref2+_iq (1)和(theta<_IQ (1)));
}
PWM_CNTL_MACRO (pwmcntl1)/*生成 PWM 波形*/
客户程序独立控制6个 MOSFET。 ePWM 宏中的设置如下:
#define PWM_CNTL_AQCTLA_INIT_STATE (CAU_CLEAR + CAD_SET)
#define PWM_CNTL_AQCTLB_INIT_STATE (CBU_SET + CBD_CLEAR)
epwmA 和 epwmB 的动作限制子模块的动作模式相反、这就是上面代码中较低引脚的占空比在前面额外增加了"1-"的原因。
当占空比 d_pwm 小于0.75时、客户代码可正常运行、当 d_pwm 大于0.75时、点击 run 后、程序将直接报告错误、点亮红灯并显示过流。
他在示波器上观察了 PWM1A 和 PWM1B 的波形、发现开始时将是一个占空比约为0.5的互补波形。 之后、PWM1A 将保持1、PWM1B 将保持0。 客户怀疑这可能触发了短路保护。
我想问一下、为什么高占空比会导致短路和错误消息、但低占空比没有问题?
此致、
安妮