我们在用六步换向的方法控制BLDC电机时,有时会遇到PWM占空比开到100%,电流还不够大,电机输出扭矩还不够的情况,这个时候可以采取提前开通的方法开增大电流。
原理很简单,数数上个hall周期有多少个PWM,这次我数数在还没有到点的情况下,我提前换向就可以。
下图时提前2个PWM周期的hall实际值与估计值的波形。
主要代码如下:
/* 每个中断调期调用一次,一般在FOC中断上调用,或者比FOC频率更高的中断调用也行*/
void foc_hall_isr(FOC_HALL *hall) {
foc_hall_err_chck(hall);
int sum_1_5 = hall->cnt_sum + hall->cnt_sum / 2;/*记录1.5倍的角度,防止插补角度超过霍尔角度太多*/
hall->value_now = switchLogic;
/*本来加1就可以,但为了降低滑动平动滤波的舍入误差,所以每次加的是滑动滤器的大小*/
if (hall->cnt < sum_1_5) hall->cnt+= 1;
if (hall->value_now != hall->value_pre) {
hall->value_pre = hall->value_now;
/*滑动平均滤波,计算出每个霍尔状态时间,用于插补运算*/
if (hall->cnt_sum_buf_cnt >= HALL_CNT_SUM_BUF_MAX) hall->cnt_sum_buf_cnt = 0;
hall->cnt_sum_buf[hall->cnt_sum_buf_cnt++] = hall->cnt;
hall->cnt = 0;
int i,sum=0;
for(i = 0; i < HALL_CNT_SUM_BUF_MAX;i++) sum+=(hall->cnt_sum_buf[i]);
hall->cnt_sum = sum / HALL_CNT_SUM_BUF_MAX;
}
if(hall->cnt >= (hall->cnt_sum - hall->cnt_ahead))
{
hall->value_estimate = HallCW[hall->value_now];
}
else
{
hall->value_estimate = hall->value_now;
}
}
详细代码文件见:BLDC六步换向提前导通hall估计
完。