|
50黑幣
我的步進(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ù)制代碼
|
|