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 采集四通道反电动势检测换相时刻,还要辅助调速检测。

posted @ 2026-09-07 22:25  steven_lg  阅读(7)  评论(0)    收藏  举报