四驱循迹小车,PWM控速,怎么提高转向不足(用的51)。
时间:10-02
整理:3721RD
点击:
四个电机驱动的,用的中断来输出PWM波,总是感觉转弯转向不足,有什么好的建议。初学,总感觉中断那里影响时序太大。从时序上看,操作轮子和控制轮子转速时间差太多,怎么改
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar t=0;//计数器计数值
- uchar temp;//中间变量
- //---------探头控制端口---------------
- sbit P10=P1^0;//右边探头
- sbit P11=P1^1;//中间探头
- sbit P12=P1^2;//左边探头
- //--------------------------------------
- //---------电机控制端------------------------------
- uchar ZKB1_R=0;//前面右边轮子占空比
- uchar ZKB1_L=0;//前面左边轮子占空比
- uchar ZKB2_R=0;//后面右边轮子占空比
- uchar ZKB2_L=0;//后面左边轮子占空比
- sbit ENA1=P3^0;//电机1,前右轮使能端
- sbit ENB1=P3^1;//电机1,前左轮使能端
- sbit ENA2=P3^2;//电机1,后右轮使能端
- sbit ENB2=P3^3;//电机1,后左轮使能端
- sbit P20=P2^0;//前右轮,1,0前转,0,1后转
- sbit P21=P2^1;
- sbit P22=P2^2;//前左轮
- sbit P23=P2^3;
- sbit P24=P2^4;//后右轮
- sbit P25=P2^5;
- sbit P26=P2^6;//后后轮
- sbit P27=P2^7;
- //------------------------------------------------------
- void init_time0(uchar time) //定时器0初始化,time为定时时间
- {
- TMOD=0X01;//0000 0001 16位计时器
- TH0=(65536-time)/256;
- TL0=(65536-time)%256;
- ET0=1;
- TR0=1;
- EA=1;
- temp=time;
- }
- void xunji()//探测到黑线返回高电平,没有则返回低电平
- {
- if(P12==0&&P11==1&&P10==0)//前进
- {
- P20=1; //前右轮 1,0前转,0,1后转
- P21=0;
- ZKB1_R=40;
- P22=1; //前左轮 1,0前转,0,1后转
- P23=0;
- ZKB1_L=40;
- P24=1;//后右轮 1,0前转,0,1后转
- P25=0;
- ZKB2_R=40;
- P26=1;//后左轮 1,0前转,0,1后转
- P27=0;
- ZKB2_L=40;
-
-
- }
- if(P12==1&&P10==0) //左转
- {
-
- P20=1; //前右轮 1,0前转,0,1后转
- P21=0;
- ZKB1_R=100;
- P22=0; //前左轮 1,0前转,0,1后转
- P23=1;
- ZKB1_L=100;
- P24=0;//后右轮 1,0前转,0,1后转
- P25=0;
- ZKB2_R=0;
- P26=0;//后左轮 1,0前转,0,1后转
- P27=1;
- ZKB2_L=80;
-
- }
- if(P12==0&&P10==1) //右转
- {
- P20=0; //前右轮 1,0前转,0,1后转
- P21=1;
- ZKB1_R=100;
- P22=1; //前左轮 1,0前转,0,1后转
- P23=0;
- ZKB1_L=100;
- P24=0;//后右轮 1,0前转,0,1后转
- P25=1;
- ZKB2_R=80;
- P26=0;//后左轮 1,0前转,0,1后转
- P27=0;
- ZKB2_L=0;
-
- }
- if(P10==0&&P11==0&&P12==0) //停住
- {
- P2=0;
- }
- if(P10==1&&P11==1&&P12==1)//停住
- {P2=0;}
- }
- void TIME_0() interrupt 1
- {
- TH0=(65536-temp)/256;
- TL0=(65536-temp)%256;
- t++;
-
- if(t< ZKB1_R) ENA1=1; //前面右边占空比控制
- else ENA1=0;
- if(t< ZKB1_L) ENB1=1; //前左控制
- else ENB1=0;
- if(t< ZKB2_R) ENA2=1; //后右
- else ENA2=0;
- if(t< ZKB1_R) ENB2=1; //后左
- else ENB2=0;
-
- if(t==100)
- t=0;
- }
- void main()
- {
- ENA1=0;
- ENB1=0;
- ENA2=0;
- ENB2=0;
- init_time0(100);
- while(1)
- {
- xunji();
- }
- }
应为材料部够,只有3个探测,中间在黑线上两边在黑线外直走。
没想通这个定时器是怎么控制循迹的
值得学习一下,新手再次路过。
pwm有点难理解。
提高PWM的占空比
还有,你的中断程序写错了一个(t<ZKB2_R)