標(biāo)題:
單片機(jī)+L298驅(qū)動(dòng)步進(jìn)電機(jī)運(yùn)轉(zhuǎn)不穩(wěn)定
[打印本頁]
作者:
lisheng12138
時(shí)間:
2019-5-14 09:15
標(biāo)題:
單片機(jī)+L298驅(qū)動(dòng)步進(jìn)電機(jī)運(yùn)轉(zhuǎn)不穩(wěn)定
我的步進(jìn)電機(jī)正轉(zhuǎn)穩(wěn)定反轉(zhuǎn)不穩(wěn)定,老師 說是頻率不對(duì),輸出的波形可能有偏差,讓我改程序,可是我不知道要怎么改程序才能輸出正確的波形,我是用51單片機(jī)和 L298驅(qū)動(dòng)模塊控制兩相步進(jìn)電機(jī),求大神指點(diǎn)
單片機(jī)源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit key1=P3^2;
//sbit key2=P3^3;
//sbit key3=P3^4;
#define RIGHT_RUN 1 //正轉(zhuǎn)值
#define LEFT_RUN 0 //反轉(zhuǎn)值
static unsigned int count;
static unsigned int endcount;
uchar flag;
//八拍驅(qū)動(dòng)方式正轉(zhuǎn)表 A-B---> B- --> B-A --> A --> AB --> B
// --> BA- --> A- --> A-B-
ucharupstep8_table[]={0x05,0x01,0x09,0x08,0x0A,0x02,0x06,0x04};
char SpeedChar[]="SPEED(n/min):";
char StateChar[]="RUN SET:";
char STATE_CW[]=" FAN ";
char STATE_CCW[]="ZHENG";
char SPEED[3]="999";
uchar RunState=LEFT_RUN; //運(yùn)行狀態(tài)標(biāo)志位
//******************************
// 步進(jìn)電機(jī)停止函數(shù)
//作用:停止
//******************************
void MotorStop(void)
{
P1= 0x00;
}
//******************************
// 外部中斷0初始化函數(shù)
//作用:初始化外部中斷
//******************************
void Interrupt0_Init()
{
EA= 1;
TMOD= 0x11;
ET0= 1;
// TH0=0xFF;
// TL0=0x28;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
}
//******************************
//
//延時(shí)i ms
//******************************
void delay(uint ims)
{
endcount=ims;
count=0;
do{}while(count<endcount);
}
//******************************
// 步進(jìn)電機(jī)驅(qū)動(dòng)函數(shù)
//作用:通過變量var控制電動(dòng)機(jī)的轉(zhuǎn)速高低,通過變量state判斷電動(dòng)機(jī)的正反轉(zhuǎn)
// state:0 正轉(zhuǎn),state: 1 反轉(zhuǎn)
//使用8拍能夠?qū)崿F(xiàn)比較平滑的轉(zhuǎn)動(dòng),使用4拍時(shí)電機(jī)震動(dòng)比較大。
//******************************
void MotorSpeedOrDirection(uint var, ucharstate)
{
uchari=0;
if(!state)
{
for(i=0;i<8; i++)
{
P0=upstep8_table[ i];
delay(var);
}
}
else
{
for(i=7;i>0; --i)
{
P0=upstep8_table[ i];
delay(var);
}
}
}
//******************************
// 中斷處理函數(shù)
//作用:定時(shí)器0的中斷處理
//******************************
void timeint(void) interrupt 1
{
// TH0=0xFF;
// TL0=0x28; //216----234us
// 定時(shí)器定時(shí)1ms
TH0=(65536-500)/256;
TL0=(65536-500)%256;
count++;
}
//液晶
void clock(unsigned int Delay) //1ms延時(shí)程序
{
unsignedint i;
for(;Delay>0;Delay--)
for(i=0;i<124;i++);
}
void wcm(unsigned char com)//寫命令
{
RS=0;
E=0;
P1=com;
clock(5);
E=1;
clock(5);
E=0;
}
void wd(unsigned char date)//寫數(shù)據(jù)
{
RS=1;
E=0;
P1=date;
clock(5);
E=1;
clock(5);
E=0;
}
void shuzu(unsigned char *c)
{
while((*c)!='\0')
{
wd(*c);
c++;
}
}
void ShowState() //顯示狀態(tài)與速度
{
if(RunState==RIGHT_RUN)
{
wcm(0x80+0x40+9);
wd('Z');
}
else
{
wcm(0x80+0x40+9);
wd('F');
}
}
void inti_lcd()//初始化
{
RW=0;
wcm(0x38);
wcm(0x0c);
wcm(0x06);
wcm(0x01);
}
void main()
{
unsignedint sum=0;
P1= 0x00;
count= 0;
Interrupt0_Init();
inti_lcd();
wcm(0x80);
shuzu(SpeedChar);
wcm(0x80+13);
shuzu(SPEED);
wcm(0x80+0x40);
shuzu(StateChar);
while(1)
{
if(key1==0)
{
delay(5);
if(key1==0)//確認(rèn)功能鍵被按下
{
flag++;//功能鍵按下次數(shù)記錄
while(!key1);//釋放確認(rèn)
if(flag==3)
flag=0;
}
}
if(flag==0)
{
MotorStop();
}
if(flag==1)
{
RunState=RIGHT_RUN;
MotorSpeedOrDirection(1,0);
}
if(flag==2)
{
RunState=LEFT_RUN;
MotorSpeedOrDirection(1,1);
}
//ShowState();
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1