大家好,這次想問的是用於BLDC六步驅動的腳位控制
使用的是PIC16F1933,搭配MCC做腳位設定,用ECCP(1~3)將
RC0,RC2,RC7設為PWM輸出控制上臂,
RA6,RC1,RC6設一般IO輸出控制下臂,
問題1:PWM關斷方式
下面的程式,當上臂需關斷時用 EPWM1_LoadDutyValue(0);
將DutyCycle寫0,這樣有問題嗎?還是可以用IO_RC2_LAT=0;
或PORTC = (PORTC & 0xFB);之類的程式去關
/*
反轉順序:132645
RC0(EPWM2):W+ RC2(EPWM1):V+ RC7(EPWM3):U+
RA6:W- RC1:V- RC6:U-
*/
void PWM_Switch(void)
{
switch(Hall_P)
{
case 0:
LED_RC4_LAT = 0;
break;
case 1://U+W-
if(Hall_N == 5 || Flag.Initial==0)
{
EPWM3_LoadDutyValue(DutyCycle); //U+
IO_RA6_LAT = 1; //W-
EPWM1_LoadDutyValue(0); //V+ = 0
Hall_N = 1;
Hall_Er_T = 0;
}
break;
case 2://W+V- U+ = 0
if(Hall_N == 3 || Flag.Initial==0)
{
EPWM2_LoadDutyValue(DutyCycle); //W+
IO_RC1_LAT = 1; //V-
EPWM3_LoadDutyValue(0); //U+ = 0
Hall_N = 2;
Hall_Er_T = 0;
}
break;
case 3://U+V- W- = 0
if(Hall_N == 1 || Flag.Initial==0)
{
EPWM3_LoadDutyValue(DutyCycle); //U+
IO_RC1_LAT = 1; //V-
IO_RA6_LAT = 0; //W- = 0
Hall_N = 3;
Hall_Er_T = 0;
}
break;
case 4://V+U- W+ = 0
if(Hall_N == 6 || Flag.Initial==0)
{
EPWM1_LoadDutyValue(DutyCycle); //V+
IO_RC6_LAT = 1; //U-
EPWM2_LoadDutyValue(0); //W+ = 0
Hall_N = 4;
Hall_Er_T = 0;
}
break;
case 5://V+W- U- = 0
if(Hall_N == 4 || Flag.Initial==0)
{
EPWM1_LoadDutyValue(DutyCycle); //V+
IO_RA6_LAT = 1; //W-
IO_RC6_LAT = 0; //U- = 0
Hall_N = 5;
Hall_Er_T = 0;
}
break;
case 6://W+U- V- = 0
if(Hall_N == 2 || Flag.Initial==0)
{
EPWM2_LoadDutyValue(DutyCycle); //W+
IO_RC6_LAT = 1; //U-
IO_RC1_LAT = 0; //V- = 0
Hall_N = 6;
Hall_Er_T = 0;
}
break;
case 7:
LED_RC4_LAT = 0;
break;
}
}
問題2:Hall訊號與換相
Hall腳位要不要用IOC中斷去觸發?或者放在主程式裡隨時偵測就好?
電子換相怎麼這麼危險..Hall隨便一個雜訊導致相位切錯就是直接爆炸
做了很多種嘗試,還是無法完全避免雜訊問題,有沒有建議呢?
Hall_P = (PORTB & 0x07);
PWM_Switch();
問題3:ALARM後的處理
目前是用過電流與換相計時的方式觸發ALARM
ALARM觸發後該六臂全部切斷嗎?
會不會有馬達反電勢無處釋放造成IGBT燒壞的情況呢?
目前只要運作中出問題,驅動板就會有元件燒毀..只能猜原因。