欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機+L298驅動步進電機運轉不穩定
[打印本頁]
作者:
lisheng12138
時間:
2019-5-14 09:15
標題:
單片機+L298驅動步進電機運轉不穩定
我的步進電機正轉穩定反轉不穩定,老師 說是頻率不對,輸出的波形可能有偏差,讓我改程序,可是我不知道要怎么改程序才能輸出正確的波形,我是用51單片機和 L298驅動模塊控制兩相步進電機,求大神指點
單片機源程序如下:
#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 //正轉值
#define LEFT_RUN 0 //反轉值
static unsigned int count;
static unsigned int endcount;
uchar flag;
//八拍驅動方式正轉表 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; //運行狀態標志位
//******************************
// 步進電機停止函數
//作用:停止
//******************************
void MotorStop(void)
{
P1= 0x00;
}
//******************************
// 外部中斷0初始化函數
//作用:初始化外部中斷
//******************************
void Interrupt0_Init()
{
EA= 1;
TMOD= 0x11;
ET0= 1;
// TH0=0xFF;
// TL0=0x28;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
}
//******************************
//
//延時i ms
//******************************
void delay(uint ims)
{
endcount=ims;
count=0;
do{}while(count<endcount);
}
//******************************
// 步進電機驅動函數
//作用:通過變量var控制電動機的轉速高低,通過變量state判斷電動機的正反轉
// state:0 正轉,state: 1 反轉
//使用8拍能夠實現比較平滑的轉動,使用4拍時電機震動比較大。
//******************************
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);
}
}
}
//******************************
// 中斷處理函數
//作用:定時器0的中斷處理
//******************************
void timeint(void) interrupt 1
{
// TH0=0xFF;
// TL0=0x28; //216----234us
// 定時器定時1ms
TH0=(65536-500)/256;
TL0=(65536-500)%256;
count++;
}
//液晶
void clock(unsigned int Delay) //1ms延時程序
{
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)//寫數據
{
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() //顯示狀態與速度
{
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)//確認功能鍵被按下
{
flag++;//功能鍵按下次數記錄
while(!key1);//釋放確認
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();
}
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1