Em đã làm được cái động cơ này quay với con IR2103
con IR2110 thì chỉ khác con IR2103 là nó cả 2 đầu vào HI và LI đề là đầu vào tích cực cao, nó cũng không có bộ tạo deadtime bên trong, không có phần logic chống ngắt mạch do mở 2 van cùng lúc
Em post đoạn code config pwm lên đây các bác xem có đúng không hộ em
Code:
_PTSIDL = 0; // pwm time base run in idle mode
_PTOPS = 0; // pwm time base postscale select bit 1:1
_PTCKPS = 0; // pwm time base input clock prescale select bit
// 11 -> 1:64
// 10 -> 1:16
// 01 -> 1:4
// 00 -> 1:1
// PTMR config (PWM time base register)
// PTPER config (PWM time base priod register)
PTPER = (Fcy/Fpwm - 1);
// SEVTCMP config (special event compare register)
SEVTCMP = PTPER;
// PWMCON1 config
_PMOD3 = 0; // PMODx = 1 pwm I/0 pin pair is in the independent ouput mode
// PMODx = 0 pwm I/0 pin pair is in the complementary output mode
_PMOD2 = 0;
_PMOD1 = 0;
_PEN3H = 1; // =1 to enable for pwm output
_PEN3L = 1;
_PEN2H = 1;
_PEN2L = 1;
_PEN1H = 1;
_PEN1L = 1;
// PWMCON2 config
// DTCON1 config (dead time control register)
_DTAPS = 3; // Dead time unit A prescale select bit
// = 3 -> 1:8
// = 2 -> 1:4
// = 1 -> 1:2
// = 0 -> 1:1
_DTA = 63; // Unsigned 6 bit Dead time value bits for dead time unit A
// FLTACON config (Fault A control register)
// FLTBCON config
// OVDCON config (Override control register)
OVDCON = 0x0000; // all pwm pin are control by the value in the corresponding POUTxx bit
// POUTxx = 0
PDC1 =(unsigned int) (PTPER *0.4);
PDC2 =(unsigned int) (PTPER *0.4);
PDC3 =(unsigned int) (PTPER *0.4);
PWMCON2 = 0x0F00; //Postscale = 1:16
PTCON = 0x8000; //Kich hoat module PWM
Delay_ms(10);
SD = 0; // day la chan shutdown của IR
Delay_ms(1);
_POUT1L = 1;// bat may chan Lowside để nạp điện đầy cho tụ, sẵn sàng chạy
_POUT2L = 1;
_POUT3L = 1;
còn đây là chương trình em dùng để test cái động cơ nó quay
Code:
void BLDC_test_forward(void){
if((HallA == 0) & (HallB == 1) & (HallC == 1)){ // CASE 1
OVDCON = (1 << BL) + (1 << CH_P); // BL & CH
return;
}
if((HallA == 0) & (HallB == 0) & (HallC == 1)){ // CASE 2
OVDCON = (1 << BL) + (1 << AH_P); // BL & AH
return;
}
if((HallA == 1) & (HallB == 0) & (HallC == 1)){ // CASE 3
OVDCON = (1 << CL) + (1 << AH_P); // CL & AH
return;
}
if((HallA == 1) & (HallB == 0) & (HallC == 0)){ // CASE 4
OVDCON = (1 << CL) + (1 << BH_P); // CL & BH
return;
}
if((HallA == 1) & (HallB == 1) & (HallC == 0)){ // CASE 5
OVDCON = (1 << AL) + (1 << BH_P); // AL & BH
return;
}
if((HallA == 0) & (HallB == 1) & (HallC == 0)){ // CASE 6
OVDCON = (1 << AL) + (1 << CH_P); // AL &CH
return;
}
}
em xin giải thích một tẹo ở đây các hằng số được định nghĩa như sau:
Code:
#define AL 0
#define AH 1
#define BL 2
#define BH 3
#define CL 4
#define CH 5
#define AL_P 8
#define AH_P 9
#define BL_P 10
#define BH_P 11
#define CL_P 12
#define CH_P 13
có nghĩa là nếu muốn pha A dẫn phía L và pha C dẫn phía H thì em sẽ ghi giá trị 1 vào POUT1L và đặt 3H ở chế độ xung pwm