1. 程式人生 > >基於51微控制器的步進電機的控制

基於51微控制器的步進電機的控制

前面筆者分享過基於51微控制器的兩種小車製作,我們利用的是L298N驅動控制電機轉動,那麼接下來,筆者給大家介紹兩種利用51微控制器控制步進電機的小程式。
首先我們要如何使電機轉動呢,源程式如下:

#include <reg52.h>


unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正轉表格,換算成二進位制 0000 0010,0000 0100,0000 1000,0001 0000
unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反轉表格,換算成二進位制 0001 0000,0000 1000,0000 0100,0000 0010
/******************************************************************/
/* 延時函式 */ /******************************************************************/ void Delay(unsigned int i)//延時 { while(--i); } /******************************************************************/ /* 主函式 */
/******************************************************************/ main() { unsigned char i; while(1) { for(i=0;i<4;i++) //4相 { P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格 Delay(500); //改變這個引數可以調整電機轉速 ,數字越小,轉速越大 } } }

接下來,我們要控制電機的正反轉,這個程式主要用於4相步進電機的常規驅動,速度不可調的過快,不然就沒有力矩的轉動了,按s4可控制電機正反轉:

#include <reg52.h>

bit Flag;//定義正反轉標誌位


unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正轉表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反轉表格
/******************************************************************/
/*                    延時函式                                    */
/******************************************************************/
void Delay(unsigned int i)//延時
{
 while(--i);
}
/******************************************************************/
/*                   主函式                                       */
/******************************************************************/
main()
{

 unsigned char i;


  EX1=1;         //外部中斷0開
  IT1=1;         //邊沿觸發
  EA=1;          //全域性中斷開

 while(!Flag)            
 {
  P0=0x71;//顯示 F 標示正轉
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //輸出對應的相 可以自行換成反轉表格
     Delay(500);        //改變這個引數可以調整電機轉速 ,數字越小,轉速越大
     }
  }
while(Flag)
 { 
  P0=0x7C;//顯示 b 標示反轉
  for(i=0;i<4;i++)      //4相
     {
     P1=B_Rotation[i];  //輸出對應的相 
     Delay(500);        //改變這個引數可以調整電機轉速 ,數字越小,轉速越大
     }
  }
}
/******************************************************************/
/*                   中斷入口函式                                 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
 Delay(300);

 Flag=!Flag;         //s3按下觸發一次,標誌位取反

 }

最後介紹一下帶停機的步進電機正反轉的方法:

#include <reg52.h>

unsigned char Flag;//定義正反轉和停止標誌位
sbit KEY = P3^3;


unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正轉表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反轉表格
/******************************************************************/
/*                    延時函式                                    */
/******************************************************************/
void Delay(unsigned int i)//延時
{
 while(--i);
}
/******************************************************************/
/*                   主函式                                       */
/******************************************************************/
main()
{

 unsigned char i;


  EX1=1;         //外部中斷0開
  IT1=1;         //邊沿觸發
  EA=1;          //全域性中斷開

 while(Flag==0)            
 {
  P0=0x71;//顯示 F 標示正轉
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //輸出對應的相 可以自行換成反轉表格
     Delay(500);        //改變這個引數可以調整電機轉速 ,數字越小,轉速越大
     }
  }
while(Flag==1)
 { 
  P0=0x7C;//顯示 b 標示反轉
  for(i=0;i<4;i++)      //4相
     {
     P1=B_Rotation[i];  //輸出對應的相 
     Delay(500);        //改變這個引數可以調整電機轉速 ,數字越小,轉速越大
     }
  }
while(Flag==2)  //停止
 { 
  P0=0x6D;//   顯示 S
  P1=0;
  }
}
/******************************************************************/
/*                   中斷入口函式                                 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
 Delay(500);
 if(!KEY)
 {

 Flag++;         //s3按下觸發一次
 if(Flag==3)
   Flag=0;
  }
 }