我的步进电机正转稳定反转不稳定,老师 说是频率不对,输出的波形可能有偏差,让我改程序,可是我不知道要怎么改程序才能输出正确的波形,我是用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();
- }
- }
复制代码
|