微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 四驱循迹小车,PWM控速,怎么提高转向不足(用的51)。

四驱循迹小车,PWM控速,怎么提高转向不足(用的51)。

时间:10-02 整理:3721RD 点击:
四个电机驱动的,用的中断来输出PWM波,总是感觉转弯转向不足,有什么好的建议。初学,总感觉中断那里影响时序太大。从时序上看,操作轮子和控制轮子转速时间差太多,怎么改

  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar t=0;//计数器计数值
  5. uchar temp;//中间变量

复制代码


  1. //---------探头控制端口---------------
  2. sbit P10=P1^0;//右边探头
  3. sbit P11=P1^1;//中间探头
  4. sbit P12=P1^2;//左边探头
  5. //--------------------------------------


  6. //---------电机控制端------------------------------
  7. uchar ZKB1_R=0;//前面右边轮子占空比
  8. uchar ZKB1_L=0;//前面左边轮子占空比
  9. uchar ZKB2_R=0;//后面右边轮子占空比
  10. uchar ZKB2_L=0;//后面左边轮子占空比

  11. sbit ENA1=P3^0;//电机1,前右轮使能端
  12. sbit ENB1=P3^1;//电机1,前左轮使能端
  13. sbit ENA2=P3^2;//电机1,后右轮使能端
  14. sbit ENB2=P3^3;//电机1,后左轮使能端

  15. sbit P20=P2^0;//前右轮,1,0前转,0,1后转
  16. sbit P21=P2^1;

  17. sbit P22=P2^2;//前左轮
  18. sbit P23=P2^3;

  19. sbit P24=P2^4;//后右轮
  20. sbit P25=P2^5;

  21. sbit P26=P2^6;//后后轮
  22. sbit P27=P2^7;
  23. //------------------------------------------------------


  24. void init_time0(uchar time) //定时器0初始化,time为定时时间
  25. {
  26.         TMOD=0X01;//0000 0001  16位计时器
  27.         TH0=(65536-time)/256;
  28.         TL0=(65536-time)%256;
  29.         ET0=1;
  30.         TR0=1;
  31.         EA=1;
  32.         temp=time;                 
  33. }

  34. void xunji()//探测到黑线返回高电平,没有则返回低电平
  35. {        
  36.         if(P12==0&&P11==1&&P10==0)//前进
  37.         {
  38.                 P20=1; //前右轮         1,0前转,0,1后转
  39.                 P21=0;
  40.                 ZKB1_R=40;

  41.                 P22=1; //前左轮                1,0前转,0,1后转
  42.                 P23=0;
  43.                 ZKB1_L=40;

  44.                 P24=1;//后右轮                1,0前转,0,1后转
  45.                 P25=0;
  46.                 ZKB2_R=40;

  47.                 P26=1;//后左轮                1,0前转,0,1后转
  48.                 P27=0;
  49.                 ZKB2_L=40;
  50.                         
  51.                
  52.         }
  53.         if(P12==1&&P10==0)        //左转
  54.         {        
  55.                
  56.                 P20=1; //前右轮         1,0前转,0,1后转
  57.                 P21=0;
  58.                 ZKB1_R=100;

  59.                 P22=0; //前左轮          1,0前转,0,1后转
  60.                 P23=1;
  61.                 ZKB1_L=100;

  62.                 P24=0;//后右轮           1,0前转,0,1后转
  63.                 P25=0;
  64.                 ZKB2_R=0;

  65.                 P26=0;//后左轮           1,0前转,0,1后转
  66.                 P27=1;
  67.                 ZKB2_L=80;
  68.                
  69.         }


  70.                 if(P12==0&&P10==1) //右转
  71.         {        
  72.                 P20=0; //前右轮         1,0前转,0,1后转
  73.                 P21=1;
  74.                 ZKB1_R=100;

  75.                 P22=1; //前左轮          1,0前转,0,1后转
  76.                 P23=0;
  77.                 ZKB1_L=100;

  78.                 P24=0;//后右轮          1,0前转,0,1后转
  79.                 P25=1;
  80.                 ZKB2_R=80;

  81.                 P26=0;//后左轮          1,0前转,0,1后转
  82.                 P27=0;
  83.                 ZKB2_L=0;
  84.                
  85.         }

  86.         if(P10==0&&P11==0&&P12==0) //停住
  87.         {
  88.           P2=0;
  89.         }

  90.         if(P10==1&&P11==1&&P12==1)//停住
  91.         {P2=0;}
  92. }

  93. void TIME_0() interrupt 1
  94.         {
  95.                   TH0=(65536-temp)/256;
  96.                 TL0=(65536-temp)%256;
  97.                 t++;
  98.                
  99.                 if(t< ZKB1_R) ENA1=1;        //前面右边占空比控制
  100.                 else                   ENA1=0;

  101.                 if(t< ZKB1_L) ENB1=1;        //前左控制
  102.                 else                   ENB1=0;

  103.                 if(t< ZKB2_R) ENA2=1;        //后右
  104.                 else                   ENA2=0;

  105.                 if(t< ZKB1_R) ENB2=1;  //后左
  106.                 else                   ENB2=0;
  107.                
  108.                 if(t==100)
  109.                         t=0;
  110.         }

  111. void main()
  112. {
  113.         ENA1=0;
  114.         ENB1=0;
  115.         ENA2=0;
  116.         ENB2=0;
  117.         init_time0(100);
  118.         while(1)
  119.         {
  120.          xunji();
  121.         }

  122. }

复制代码


应为材料部够,只有3个探测,中间在黑线上两边在黑线外直走。

没想通这个定时器是怎么控制循迹的

值得学习一下,新手再次路过。
pwm有点难理解。

提高PWM的占空比

还有,你的中断程序写错了一个(t<ZKB2_R)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top