BLDC无刷直流电机方波控制

无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。 无刷电机是指无电刷和换向器(或集电环)的电机,又称无换向器电机。早在十九纪诞生电机的时候,产生的实用性电机就是无刷形式,即交流鼠笼式异步电动机,这种电动机得到了广泛的应用。

3d195e937e46470197336aa98eb65ad4.jpeg

直流无刷电机(BLDC)最经典的驱动方法就是三相六步换相法。

在A相加电源正极,B相加电源负极,线圈A、B将产生如上图所示的磁场BA、BB,由于磁场是矢量,所以线圈BA、BB产生的合成磁场为B,此时转子就会保持在图中位置。BLDC的运行方式为绕组的两两导通,所以三相线圈A 、B、C的导通组合只有6中情况,通过合理的顺序依次切换三相绕组的通电顺序就可使转子跟着磁场旋转起来,如下图所示:

 

1)A端接正电压,B端接负电压,C端悬空,转子将会旋转至上图1位置;

2)在1)的基础上,C端接正电压,B端接负电压,A端悬空,转子将会从上图1位置旋转至图2位置;

3)在2)的基础上,C端接正电压,A端接负电压,B端悬空,转子将会从上图2位置旋转至图3位置;

4)在3)的基础上,B端接正电压,A端接负电压,C端悬空,转子将会从上图3位置旋转至图4位置;

5)在4)的基础上,B端接正电压,C端接负电压,A端悬空,转子将会从上图4位置旋转至图5位置;

6)在5)的基础上,A端接正电压,C端接负电压,B端悬空,转子将会从上图5位置旋转至图6位置;

a9d66b275bb64d429aff94c7d685f645.png

基本驱动电路如图所示:

5666b1757d8e4421bacbfd537b75e652.png

六步换相法即是按如下的顺序通电:AB->AC->BC->BA->CA->CB。当然,除此之外还可以使用其他的通电顺序,只需要保证磁场的变化方向能构成一个旋转磁场即可。

还要使用PWM进行调速。最简单的方法是只对上桥臂MOS管(Q1、Q3、Q5)进行调制,下桥臂(Q2、Q4、Q6)使用GPIO控制。这样的优点是控制方式简单;缺点在于上桥臂截止时,只能通过下桥臂MOS管的体二极管进行续流,而体二极管压降较大,这会造成下桥臂MOS管发热更为严重。使用这种驱动方法的驱动波形如图所示:

e946bd3b105b452c9103c417ad30ff01.png

图中红色框内为一个周期,可以看到,只有上桥臂使用了PWM进行调制。

更好的方法是使用互补的PWM信号进行控制,上下管交替导通。这种方式的驱动波形如图所示:

66da7f8427674dc5a91a2cd7a5107c6a.png

图中红色框内为一个周期,可以看到,上下桥臂同时使用了PWM信号进行控制。互补PWM信号展开放大后的波形如图所示:

03fdfcb2d1b849c6a6a48d1ba40c1f00.png

上桥臂导通时下桥臂截止,上桥臂截止时下桥臂导通。

 

代码:

#include "includes.h"

 

#define uchar unsigned char

#define uint  unsigned int

/****************************************Copyright (c)**************************************************

**                                           大道至简研究

**

**--------------文件信息---------------------------------------------------

**描        述: 基于freescale无刷电调驱动程序

**

********************************************************************************************************/

/////////////////////////////////////////////////////////

void sysInit(void);

////////////////////////////////////////////////////////

uchar turn_flag;//换相相序

//uchar turn1_flag,turn2_flag,turn3_flag,turn4_flag,turn5_flag,turn6_flag;//ABC换相标志

long int time,time_beg,time_end;

long int overflow_num;//溢出中断次数

 

//uchar com_flag;//强制换相标志

uint st_time;

uchar start_flag;

//uint DATA_L,DATA_H,DATA;

uint f1,f2,f3 ;

uint pwm=0;

 

void star_motor()//开环强制电机启动

{

 

 ///////////换相A-B//////////////

  A_UP=1;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=pwm;//控制高电平导通

  C_UP=0;

  C_DOWN_PWM=0;

    delay(st_time);

   ///////////换相A-C//////////////

  A_UP=1;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=pwm;

   delay(st_time);

    ///////////换相B-C//////////////

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=1;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=pwm;

   delay(st_time);

    ///////////换相B-A//////////////

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=pwm; //无刷电机下桥臂PWM控制驱动

  B_UP=1;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=0;

   delay(st_time);

    ///////////换相C-A//////////////

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=pwm; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=0;

  C_UP=1;

  C_DOWN_PWM=0;

   delay(st_time);

    ///////////换相C-B//////////////

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=pwm;

  C_UP=1;

  C_DOWN_PWM=0;

   delay(st_time);

 //////////////////////////////////////

 A_DOWN_PWM=0;

 B_DOWN_PWM=0;

 C_DOWN_PWM=0; 

}

 

 motor_control()  //自动换相

 {  pwm=25;

 switch(turn_flag){ 

 /////////////换相A-B///////////////////

  case 1:  //delay_us(time);//延时30°的电角度

  /* TIE_C0I = 0;

   TIE_C1I = 0;

   TIE_C2I = 1;*/

 

  A_UP=1;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=pwm;//控制高电平导通

  C_UP=0;

  C_DOWN_PWM=0;  //TIE_C0I=1;

 

   //////////////////////////////////////

 A_DOWN_PWM=0;         

 B_DOWN_PWM=0;

 C_DOWN_PWM=0;

  break;

   ///////////换相A-C/////////////////////////////////

 

  case 2: // delay_us(time);  //延时30°的电角度

  /* TIE_C0I = 0;       

   TIE_C1I = 1;

   TIE_C2I = 0;*/

  A_UP=1;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=pwm; //TIE_C1I=1;

 

 

   //////////////////////////////////////

 A_DOWN_PWM=0;

 B_DOWN_PWM=0;

 C_DOWN_PWM=0;

  break;

    ///////////换相B-C//////////////////////////////////

 

  case 3:  // delay_us(time); //延时30°的电角度

  /* TIE_C0I = 1;

   TIE_C1I = 0;        

   TIE_C2I = 0;  */

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=1;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=pwm; // TIE_C2I=1;

 

   break;

  

    ///////////换相B-A/////////////////////////////////////

 

  case 4:   //delay_us(time);  //延时30°的电角度

  /* TIE_C0I = 0;

   TIE_C1I = 0;        

   TIE_C2I = 1;*/

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=pwm; //无刷电机下桥臂PWM控制驱动

  B_UP=1;

  B_DOWN_PWM=0;

  C_UP=0;

  C_DOWN_PWM=0;   //TIE_C0I=1;

 

    //////////////////////////////////////

 A_DOWN_PWM=0;

 B_DOWN_PWM=0;

 C_DOWN_PWM=0;

   break;

  ///////////换相C-A/////////////////////////////////////

 

  case 5:  //delay_us(time); //延时30°的电角度

   /*TIE_C0I = 0;

   TIE_C1I = 1;          

   TIE_C2I = 0; */

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=pwm; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=0;

  C_UP=1;

  C_DOWN_PWM=0;  //TIE_C1I=1;

  

    //////////////////////////////////////

 A_DOWN_PWM=0;

 B_DOWN_PWM=0;

 C_DOWN_PWM=0;

   break;

    ///////////换相C-B///////////////////////////////////////

 

  case 6:// delay_us(time);  //延时30°的电角度

   /*TIE_C0I = 1;

   TIE_C1I = 0;       

   TIE_C2I = 0;*/

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=pwm;

  C_UP=1;

  C_DOWN_PWM=0; // TIE_C2I=1;

 

 

   //////////////////////////////////////

 A_DOWN_PWM=0;

 B_DOWN_PWM=0;

 C_DOWN_PWM=0;

   break;

  

   default:

  

     break;

  

 

    }

 

 }

 

////////////////////////////////////////////////////////

void main(void)

{

  int turn_time,i,j;

  DisableInterrupts;

  sysInit();

  EnableInterrupts;  

  pwm=20;

  st_time=500;

  DDRB=0xff;

  DDRA=0xff;

  PORTB=0xff;  

 // dty01=25000;

 

  // TIE_C0I = 1;

  // TIE_C1I = 1;

  // TIE_C2I = 1;

   // TSCR2_TOI =1; // 使能定时器溢出中断

 

 

  

 /* */

  for(;;) 

  { 

  

    // star_motor() ;

   if(start_flag==0)

     {   

 /*   ///////////初始对准,电机转到A相//////////////

  A_UP=0;   //控制高电平导通

  A_DOWN_PWM=0; //无刷电机下桥臂PWM控制驱动

  B_UP=0;

  B_DOWN_PWM=100;

  C_UP=1;

  C_DOWN_PWM=0;

  for(i=0;i<5;i++) {

   delay(5000);

  } */

   /////////////////////

      start_flag=100;

      for(i=0;i<20;i++) {

       

      for(j=0;j<20;j++){

       

     st_time=st_time-20;

     if(st_time<200)

      {

      st_time=200;

      }

      star_motor();  

      }

     }

     }

 

   

  }

 

}

 

 

 

////////////////////////////////////////////////////////////////////

void sysInit(void)

{

  CRGInit(); // Clocks and Reset Generator module initialization

  //ATDInit();

  //  SCIInit(); // Serial Communication Interface initialization

  ECTInit(); // Enhanced Capture Timer module initialization

  PWMInit(); // PWM module initialization

 // SPIInit() ;

}

 

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐