单片机循迹小车,帮忙看下这个单片机程序 程序控制不了电机的转速 PS:感应部分正常工作
#include<reg52.h>#definestd_speed55//标准速度#definef_speed70//第一速度#defines_speed20//第二速度...
#include<reg52.h>
#define std_speed 55 //标准速度
#define f_speed 70 //第一速度
#define s_speed 20 //第二速度
#define t_speed 0 //第三速度
#define L_add 0 //补充速度
sbit l3=P1^0; //左边最外传感器接P1.0
sbit l2=P1^1; //左边中间传感器接P1.1
sbit l1=P1^2; //左边内侧传感器接P1.2
sbit r1=P1^3; //右边内侧传感器接P1.3
sbit r2=P1^4; //右边中间传感器接P1.3
sbit r3=P1^5; //右边最外传感器接P1.3
sbit o1=P2^0; //电机控制信号
sbit o2=P2^1;
sbit o3=P2^2;
sbit o4=P2^3;
sbit ml=P2^5; //L298电机A驱动使能
sbit mr=P2^4; //L298电机B驱动使能
int beforelever=0; //定义变量
int lever=0;
int lastlever=0;
unsigned int LPWM,RPWM;
void delay(unsigned int t)
{
int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<150;j++);
}
}
void detece() //信号灯检测程序
{
lever=0;
if(l3==1)lever=-3;
if(l2==1)lever=-2;
if(l1==1)lever=-1;
if(r1==1)lever=1;
if(r2==1)lever=2;
if(r3==1)lever=3;
if(l1==1 && r1==1)lever=0;
if(l1==0&&l2==0&&l3==0&&r1==0&&r2==0&&r3==0)lever=10;
}
void PWM(unsigned int l,unsigned int r) //PWM设置程序
{
if(l>100)l=100;// 定宽调频法 调制为0--100 范围
if(r>100)r=100;
if(l<0)l=0;
if(r<0)r=0;
if(LPWM>=l)ml=0; //L298左电机使能信号 设置使能信号与pwm同步变化,从而控制电机转速
else ml=1;
if(RPWM>=r)mr=0; //L298右电机使能信号
else mr=1;
if(LPWM>=100)LPWM=0; //LPWM高电平≥100时置LPWM为低电平
if(RPWM>=100)RPWM=0;
}
void control() //电机控制程序
{
switch(lever)
{
case -3:PWM(t_speed+L_add,f_speed);break; //lever=-3最左边的传感器检测到,左轮11/100的速度 右轮80/100速度 既右大转
case -2:PWM(s_speed+L_add,std_speed);break;//左28%右100% 右中转
case -1:PWM(f_speed+L_add,std_speed);break;//左83%右100% 右小转
case 0:PWM(std_speed+L_add,std_speed);break;
case 1:PWM(std_speed+L_add,f_speed);break;
case 2:PWM(std_speed+L_add,s_speed);break;
case 3:PWM(f_speed+L_add,t_speed);break;
}
}
void main()
{
P1=0x3f;
o1=1;
o2=0;
o3=1;
o4=0;
TMOD=0x01;
TH0=(65536-1000)/256; //TH0=(65536-x)/256 x为 x uS
TL0=(65536-1000)%256; //TL0=(65536-x)%256
TR0=0; //关T0定时器
ET0=0; //关T0定时中断
TR0=1; //开T0定时器
ET0=1; //开T0定时器
EA=1;
PWM(0,0);
delay(1000);
while(1)
{
// PWM(0,0);
detece();
if(lever==10&&lastlever==-3)lever=-3; //确保进入轨道不偏离轨道
if(lever==10&&lastlever==3)lever=3;
control();
if(lastlever!=lever)lastlever=lever;
}
}
void time() interrupt 1 //定时器中断函数
{
TH0=(65536-100)/256; //TH0=(65536-x)/256 x为 x uS
TL0=(65536-100)%256; //TL0=(65536-x)%256
LPWM++;//开始产生pwm波形
RPWM++;
} 展开
#define std_speed 55 //标准速度
#define f_speed 70 //第一速度
#define s_speed 20 //第二速度
#define t_speed 0 //第三速度
#define L_add 0 //补充速度
sbit l3=P1^0; //左边最外传感器接P1.0
sbit l2=P1^1; //左边中间传感器接P1.1
sbit l1=P1^2; //左边内侧传感器接P1.2
sbit r1=P1^3; //右边内侧传感器接P1.3
sbit r2=P1^4; //右边中间传感器接P1.3
sbit r3=P1^5; //右边最外传感器接P1.3
sbit o1=P2^0; //电机控制信号
sbit o2=P2^1;
sbit o3=P2^2;
sbit o4=P2^3;
sbit ml=P2^5; //L298电机A驱动使能
sbit mr=P2^4; //L298电机B驱动使能
int beforelever=0; //定义变量
int lever=0;
int lastlever=0;
unsigned int LPWM,RPWM;
void delay(unsigned int t)
{
int i,j;
for(i=0;i<t;i++)
{
for(j=0;j<150;j++);
}
}
void detece() //信号灯检测程序
{
lever=0;
if(l3==1)lever=-3;
if(l2==1)lever=-2;
if(l1==1)lever=-1;
if(r1==1)lever=1;
if(r2==1)lever=2;
if(r3==1)lever=3;
if(l1==1 && r1==1)lever=0;
if(l1==0&&l2==0&&l3==0&&r1==0&&r2==0&&r3==0)lever=10;
}
void PWM(unsigned int l,unsigned int r) //PWM设置程序
{
if(l>100)l=100;// 定宽调频法 调制为0--100 范围
if(r>100)r=100;
if(l<0)l=0;
if(r<0)r=0;
if(LPWM>=l)ml=0; //L298左电机使能信号 设置使能信号与pwm同步变化,从而控制电机转速
else ml=1;
if(RPWM>=r)mr=0; //L298右电机使能信号
else mr=1;
if(LPWM>=100)LPWM=0; //LPWM高电平≥100时置LPWM为低电平
if(RPWM>=100)RPWM=0;
}
void control() //电机控制程序
{
switch(lever)
{
case -3:PWM(t_speed+L_add,f_speed);break; //lever=-3最左边的传感器检测到,左轮11/100的速度 右轮80/100速度 既右大转
case -2:PWM(s_speed+L_add,std_speed);break;//左28%右100% 右中转
case -1:PWM(f_speed+L_add,std_speed);break;//左83%右100% 右小转
case 0:PWM(std_speed+L_add,std_speed);break;
case 1:PWM(std_speed+L_add,f_speed);break;
case 2:PWM(std_speed+L_add,s_speed);break;
case 3:PWM(f_speed+L_add,t_speed);break;
}
}
void main()
{
P1=0x3f;
o1=1;
o2=0;
o3=1;
o4=0;
TMOD=0x01;
TH0=(65536-1000)/256; //TH0=(65536-x)/256 x为 x uS
TL0=(65536-1000)%256; //TL0=(65536-x)%256
TR0=0; //关T0定时器
ET0=0; //关T0定时中断
TR0=1; //开T0定时器
ET0=1; //开T0定时器
EA=1;
PWM(0,0);
delay(1000);
while(1)
{
// PWM(0,0);
detece();
if(lever==10&&lastlever==-3)lever=-3; //确保进入轨道不偏离轨道
if(lever==10&&lastlever==3)lever=3;
control();
if(lastlever!=lever)lastlever=lever;
}
}
void time() interrupt 1 //定时器中断函数
{
TH0=(65536-100)/256; //TH0=(65536-x)/256 x为 x uS
TL0=(65536-100)%256; //TL0=(65536-x)%256
LPWM++;//开始产生pwm波形
RPWM++;
} 展开
德晟智能
2024-09-04 广告
2024-09-04 广告
舵机应该如何选型?今天由我们德晟智能科技有限公司说到舵机,相信不少工程师都非常熟悉了,但是如果说到舵机的产品选型,可能不少工程师都是一知半解的,甚至大部分的人都是纯靠扭矩来进行舵机选型的。“舵机”,顾名思义就是用来控制舵面控制的伺服器,而随...
点击进入详情页
本回答由德晟智能提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询