标题:
单片机+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://www.51hei.com/bbs/)
Powered by Discuz! X3.1