您的位置:首页 > 其它

MCU—直流电机

2017-03-16 20:48 281 查看
直流电机经典控制电路——H桥电路控制。可以使直流电机正转,反转,停止,加速,减速等各种操作。





图中所示为一个典型的直流电机控制电路。电路得名于“H桥驱动电路”是因为它的形状酷似字母H。

4个三极管组成H的4条垂直腿,而电机就是H中的横杠(注意:图只是示意图,而不是完整的电路图,

其中三极管的驱动电路没有画出来)。

H桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。要使电机运转,必须使对角线上的一对三极管导通。例如,如下图所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经 Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向
转动(电机周围的箭头指示为顺时针方向)。





直流电机正反装程序:

#include<reg52.h>

sbit Key_UP=P3^2;   //正转按键 对应实验板上的K1

sbit Key_DOWN=P3^3;//反转按键  对应实验板上的K2

sbit Key_STOP=P3^4;//停止键    对应实验板上的K3

sbit ZZ=P1^0;//控制端

sbit FZ=P1^1;//控制端

sbit BEEP = P3^6; //蜂鸣器控制端口P36 

unsigned char KeyV,TempKeyV;   

void Delay(unsigned int ii)

{

unsigned int jj;

for(;ii>0;ii--)

for(jj=0;jj<125;jj++)

{;}

}

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

void beep() //蜂鸣器响一声函数

{

  unsigned char i;

  for (i=0;i<100;i++)

   {

   Delay(1);

   BEEP=!BEEP;       //BEEP取反

   } 

   BEEP=1;           //关闭蜂鸣器

   Delay(250);       //延时     

}

void main()

{

   FZ=1;

   ZZ=1;

 while(1){

  if (!Key_UP)

    KeyV = 1;

  if (!Key_DOWN)

    KeyV = 2;
   if (!Key_STOP)

    KeyV = 3;

   if (KeyV!= 0)     

    {

      Delay(10);   

      if (!Key_UP)

        TempKeyV = 1;

      if (!Key_DOWN)

        TempKeyV = 2;

      if (!Key_STOP)

        TempKeyV = 3;
if (KeyV == TempKeyV)  
  {
 
    if (KeyV == 1){
   beep();
ZZ=1;
FZ=0;

}

if(KeyV==2){

 beep();
ZZ=0;
FZ=1;
}
if(KeyV==3){
beep();
ZZ=0;
FZ=0;
}
}  



KeyV=0;

TempKeyV=0; 

 }

}

直流电机PWM调速控制程序:

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

*                                                                            * 

*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 * 

*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样* 

*可以设定占空比可从1-100变化。即0.01ms*100=1ms                               * 

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

#include <REGX51.H> 

#define uchar unsigned char      

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

* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256;         * 

* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器* 

* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 * 

* 间为1ms*65536=65.536ms                                                     * 

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

#define V_TH0  0XFF                  

#define V_TL0  0XF6                  

#define V_TMOD 0X01                  

void init_sys(void);            /*系统初始化函数*/ 

void Delay5Ms(void); 

unsigned char ZKB1,ZKB2; 

void main (void) 



init_sys(); 

  ZKB1=40;            /*占空比初始值设定*/ 

  ZKB2=70;            /*占空比初始值设定*/ 

  while(1) 

  { 

       if (!P1_4) //如果按了+键,增加占空比 

      { 

       Delay5Ms(); 

       if (!P1_4) 

         { 

         ZKB1++; 

         ZKB2=100-ZKB1; 

         } 

      } 

       if (!P1_5) //如果按了-键,减少占空比 

      { 

       Delay5Ms(); 

       if (!P1_5) 

         { 

         ZKB1--; 

         ZKB2=100-ZKB1; 

         } 

      } 

/*对占空比值限定范围*/ 

if (ZKB1>99) ZKB1=1; 

if (ZKB1<1) ZKB1=99; 

 

  }

  

   



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

*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/ 

void init_sys(void)            /*系统初始化函数*/ 



  /*定时器初始化*/ 

  TMOD=V_TMOD; 

  TH0=V_TH0; 

  TL0=V_TL0; 

  TR0=1; 

  ET0=1; 

  EA=1; 



//延时 

void Delay5Ms(void) 



unsigned int TempCyc = 1000; 

while(TempCyc--); 



/*中断函数*/ 

void timer0(void) interrupt 1 using 2 



static uchar click=0;                  /*中断次数计数器变量*/ 

TH0=V_TH0;                                    /*恢复定时器初始值*/ 

TL0=V_TL0; 

++click; 

if (click>=100) click=0; 

if (click<=ZKB1)      /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ 

  P1_0=0; 

else 

  P1_0=1; 

if (click<=ZKB2)                        

  P1_1=0; 

else 

  P1_1=1; 



※附上PWM相关资料:
http://www.elecfans.com/dianzichangshi/2009032738285.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: