用L297和L298控制步进电机。转速太慢,小车基本带不起来。改程序增加转速,转动又不正常了。很头疼
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint/*********************...
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/***************************变量声明*****************************/
uint n;//进定时器1中断次数计数
uint speed;//电机速度控制变量
uint step_l;//左电机行走步数控制变量
uint step_r;//右电机行走步数控制变量
//************************管脚定义************************************/
sbit en_left = P1^0;
sbit cw_left= P1^1;
sbit clk_left= P1^2;
sbit en_right = P1^3;
sbit cw_right= P1^4;
sbit clk_right= P1^5;
sbit hf_left=P1^6;
sbit hf_right=P1^7;
/***********************延时子函数******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*void delayms(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}*/
/**************************子函数定义****************************/
void timer1_init(); //定时器初始化函数
void init();
void move_left(uint speed,uint step, uchar cw,uchar en);
void move_right(uint speed,uint step, uchar cw,uchar en);
/***************************主函数*****************************/
void main()
{
delay(10);
timer1_init();
init();
while(1)
{
move_left(50,500,0,1);//(速度,距离,方向,使能)
//注:距离是使用65mm轮胎时 100 就对应走100mm
move_right(50,500,1,1);
// move_left(60,,1,1); //通过距离控制转弯角度?
// move_right(60,,1,1);
// delay(200);//可以通过延时时间控制转弯角度.
while(1);
}
}
/**************************子函数****************************/
void move_left(uint speed_l,uint step, uchar cw,uchar en)
{
speed=speed_l;
step_l=step*4;
TR1=1;
if(cw==1)
{
cw_left=1;
}
else
{
cw_left=0;
}
if(en==1)
{
en_left=1;
}
else
{
en_left=0;
}
}
void move_right(uint speed_r,uint step, uchar cw,uchar en)
{
speed=speed_r;
step_r=step*4;
TR1=1;
if(cw==1)
{
cw_right=1;
}
else
{
cw_right=0;
}
if(en==1)
{
en_right=1;
}
else
{
en_right=0;
}
}
void timer1_init()
{
TMOD=0X10;
ET1=1;
EA=1;
TH1=(65536-10)/256;
TL1=(65536-10)%256;
}
void timer1_serve() interrupt 3
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
n=n+1;
if(n==speed)
{
if(step_l==0)
{
if(step_r==0)
{
TR1=0;
}
clk_left=clk_left;
}
else
{
clk_left=~clk_left;
step_l=step_l-1;
}
if(step_r==0)
{
if(step_l==0)
{
TR1=0;
}
clk_right=clk_right;
}
else
{
clk_right=~clk_right;
step_r=step_r-1;
}
n=0;
}
}
void init()
{
hf_left=1;
hf_right=1;
} 展开
#define uchar unsigned char
#define uint unsigned int
/***************************变量声明*****************************/
uint n;//进定时器1中断次数计数
uint speed;//电机速度控制变量
uint step_l;//左电机行走步数控制变量
uint step_r;//右电机行走步数控制变量
//************************管脚定义************************************/
sbit en_left = P1^0;
sbit cw_left= P1^1;
sbit clk_left= P1^2;
sbit en_right = P1^3;
sbit cw_right= P1^4;
sbit clk_right= P1^5;
sbit hf_left=P1^6;
sbit hf_right=P1^7;
/***********************延时子函数******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*void delayms(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}*/
/**************************子函数定义****************************/
void timer1_init(); //定时器初始化函数
void init();
void move_left(uint speed,uint step, uchar cw,uchar en);
void move_right(uint speed,uint step, uchar cw,uchar en);
/***************************主函数*****************************/
void main()
{
delay(10);
timer1_init();
init();
while(1)
{
move_left(50,500,0,1);//(速度,距离,方向,使能)
//注:距离是使用65mm轮胎时 100 就对应走100mm
move_right(50,500,1,1);
// move_left(60,,1,1); //通过距离控制转弯角度?
// move_right(60,,1,1);
// delay(200);//可以通过延时时间控制转弯角度.
while(1);
}
}
/**************************子函数****************************/
void move_left(uint speed_l,uint step, uchar cw,uchar en)
{
speed=speed_l;
step_l=step*4;
TR1=1;
if(cw==1)
{
cw_left=1;
}
else
{
cw_left=0;
}
if(en==1)
{
en_left=1;
}
else
{
en_left=0;
}
}
void move_right(uint speed_r,uint step, uchar cw,uchar en)
{
speed=speed_r;
step_r=step*4;
TR1=1;
if(cw==1)
{
cw_right=1;
}
else
{
cw_right=0;
}
if(en==1)
{
en_right=1;
}
else
{
en_right=0;
}
}
void timer1_init()
{
TMOD=0X10;
ET1=1;
EA=1;
TH1=(65536-10)/256;
TL1=(65536-10)%256;
}
void timer1_serve() interrupt 3
{
TH1=(65536-10)/256;
TL1=(65536-10)%256;
n=n+1;
if(n==speed)
{
if(step_l==0)
{
if(step_r==0)
{
TR1=0;
}
clk_left=clk_left;
}
else
{
clk_left=~clk_left;
step_l=step_l-1;
}
if(step_r==0)
{
if(step_l==0)
{
TR1=0;
}
clk_right=clk_right;
}
else
{
clk_right=~clk_right;
step_r=step_r-1;
}
n=0;
}
}
void init()
{
hf_left=1;
hf_right=1;
} 展开
2个回答
展开全部
看你不进电机的线接对了没有咯。一般步进电机的线接法都是4条控制线,其他线接地 !你可以用万用表测量电机的相数,按照像数来连接,就会获得大力矩了!还有所谓的大力矩和高转速,是成反比的,如果想要大力矩的话就要牺牲转速,想要高速度得话就要牺牲力矩。还有你要检查你的步进电机的电源电压是否达到了他的额定电压一小车用的大个的步进电机的电压是12v的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询