基於51微控制器的步進電機的控制
阿新 • • 發佈:2019-01-02
前面筆者分享過基於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;
}
}