BJX 302A BLDC驱动器——3MCU外设驱动配置
GPIO
1 void SetIoInitPro(void) 2 { 3 P0OE &= ~0x30; /* IO口方向设置*/ //p04 p05 4 P1OE &= ~0x01; //P10 //反电动势过零检测 AD输入口 5 //P2OE = 0x00; 6 P3OE &= ~0x98; //P33 P34 P37 //电流检测 反动势零点COM AD调速输入 7 8 SET_SFR_PAGE1; 9 P0PU &= ~0x30; /* IO口上拉设置*/ 10 P1PU &= ~0x01; //P10AD 口 关上拉口 11 //P2PU = 0xff; 12 //P3PU = 0xff; 13 P3PU &= ~0x98; 14 SET_SFR_PAGE0; 15 16 SetTime0IoInitPro(); 17 //SetIoSwInitPro(); 18 }
PWM上桥PWM下桥常开
1 void Time2HighPwm(void) 2 { 3 //t2pwm clk 4 T2CON &= ~(CPUCLK_PSC_BITS << T2CPUCLK_PSC_OFFSET); 5 T2CON |= CPUCLK_PSC128 << T2CPUCLK_PSC_OFFSET; //TCK 128分频 6 //t2pwm period 7 T2OVRH = U16_HI_BYTE(T2PWM_PERIOD_VAL); 8 T2OVRL = U16_LOW_BYTE(T2PWM_PERIOD_VAL); 9 10 //PWMx互补输出死区寄存器 11 T2PWMDZH = U16_HI_BYTE(T2PWM_DEADZONE); 12 T2PWMDZL = U16_LOW_BYTE(T2PWM_DEADZONE); 13 }
ADC ADC_Init(IOADC1+IOADC2+IOADC3+IOADC11+IOADC12+IOADC15,VREFP_INTERNAL_4V);//内部4V基准
1 void ADC_Init(u16 Channel_IO, u8 AD_Vrefps) 2 { 3 //1、设置AD转换速度,不能太快,否则采集AD值不准,特别在使用内部4V基准时要注意。 4 ADCON2=0; 5 //ADCON1 = TSADCK8 | CPUCLK_16; //单通道6.54us,4通道6.54*2 = 13.8us ,比较两个通道的电压即可 //19140*2 RPM/min,一个六步换相区间=13.8*20,换相精度+-3度。 6 //ADCON1 = TSADCK4; 7 ADCON1 = TSADCK4 | CPUCLK_4; //1分频采样不准,采样建立时间4clk即可基本准确 //使用24M/2需要调整串口波特率 //AD正确工作频率要低于或者等于4M 8 9 //2、使能相应信号输入的IO为ADC输入功能,可以一次初始化全部AD口 //换相存在6度得误差,基本上旋转是没啥问题的。 10 ADCHH = (u8) (Channel_IO>>8); 11 ADCHL = (u8) (Channel_IO); 12 13 //3、配置AD内部参考电压 14 ADCON2 &= ~0x03; //选择VDD为参考电压 15 if(AD_Vrefps>=VREFP_INTERNAL) 16 {//选择外部参考电压 17 ADCON2 |= VREFP_INTERNAL; 18 ADCON0 |= AD_Vrefps; 19 } 20 21 //4、使能AD总控制位,必须在设置AD通道前进行使能 22 ADEN=1; 23 ADSC=0; //连续转换功能禁止 24 25 //5、ADEN 使能后,等待模拟稳定标志位,高电平有效 26 while(!(ADCON0 & ADRDY)); 27 delay10us(); 28 29 }
Timer0 10us中断
1 void T0_TIMER_init() 2 { 3 T0CON &= ~(CPUCLK_PSC_BITS << T0CPUCLK_PSC_OFFSET); 4 //T0CON |= CPUCLK_PSC128 << T0CPUCLK_PSC_OFFSET; //128分频 5 T0CON |= CPUCLK_PSC16 << T0CPUCLK_PSC_OFFSET; //128分频 6 T0OVR = T0OVR_INIT_VAL; //配置定时器初值 (T0OVR+1)/T0CLK 7 8 TIMER0_MODE_TIMER; 9 TIMER0_T0C_CLR; 10 TIMER0_ENABLE_INT; 11 TIMER0_ENABLE; 12 13 } 14
一个最简单BLDC驱动器包扩pwm输出,以及反电动势过零检测,PWM可以使用IO口输出+PWM作为一相的输出。到达过零点的时候,切换通电的相即可。
TIMER0作为一个基准时基,程序所有跟时间相关的功能都与其有关,是程序时序的基础。
ADC 采集四通道反电动势检测换相时刻,还要辅助调速检测。

浙公网安备 33010602011771号