我的步進電機正轉穩定反轉不穩定,老師 說是頻率不對,輸出的波形可能有偏差,讓我改程序,可是我不知道要怎么改程序才能輸出正確的波形,我是用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();
- }
- }
復制代碼
|