当前位置:   article > 正文

51红外循迹小车_51单片机智能循迹小车仿真图+元件清单+程序和原理图

51单片机智能循迹小车仿真图+元件清单+程序和原理图

一、所需配件:减速马达,底盘,C51控制板,L298N电机驱动,轮胎,万向轮,电池盒,杜邦线,铜柱,螺丝螺母。

44b53d6469da4e178d8d6beca33db16d.jpg

控制板原理图

6cab326cb6344d26bbb472f4c19bebe9.png

 二、红外循迹模块

0c09ebd3014449a68c3b70559304463c.jpg

 1.调试

①传感器不处于黑线上时指示灯没亮就顺时针调节电位器

②传感器处于黑线上时指示灯没灭就逆时针调节电位器

2.循迹传感器电路图

5d8993bad8b34967b8954ed1a4ce3b63.jpg

 注:①VCC:电源线;DO:TTL开关信号输出;AD:模拟信号输出

②LM339:四路输出比较器,每路比较器有两个输入端和一个输出端,当同向输入端(+)>反向输入端(-)时,输出端为截止信号(需加上拉电阻,拉至高电平);当(+)<(-)时,输出端为低电平。

①工作原理:TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

三、L298N电机驱动(双H桥)

73d53da25dc24ff2b7b73475335ef547.jpg

 若T1,T4导通(B极为高电平),则如图

fa181e6d95964040b56315303604e359.jpg

 若T2,T3导通(B极为高电平),如图

be8d4ca099534646a8bb9bef0c9982bb.jpg

 1.通过控制这四个三极管的导通,就可以切换电机的正转和反转,若四个三极管都不导通,则没电流通过,电机停转。

2.控制ENA,IN1,IN2这三个引脚来控制三极管的导通

ENA:使能脚(总开关),它为高电平(1)时,IN1和IN2两个引脚的控制才有效。

若IN1为1,IN2为0,则T1,T3导通

e46ab730414d49d185574fbe932635df.jpg

 若IN1为0,IN2为1,则T2,T3导通

38f70cde246047afa50d01686475d5bb.jpg

 若IN1和IN2为0,T2,T4导通,电机不转动

若IN1和IN2为1,T1,T3导通,电机不转动

 四、直流有刷电机工作原理

e9577cd27db741f0951544c57b81e35b.jpg

注:磁极不动,线圈旋转,通电后,电流经过导体会产生磁场,磁铁同性相斥,异性相吸,从而产生安培力,转到后,换向器会,可改变绕组上的电流方向,再次产生磁场,产生力,从而实现不断转动。

d68c6ddee3374d78a7fb3d4bc5b798af.jpg

 

五、pwm调速原理

靠占空比(改变脉冲宽度)来控制输出电压。对于单片机来说,可通过定时器设置定时初值,在中断服务函数中对占空比进行调整,从而实现电机的转速控制。

ff9e363e828a4529824549a7833ce59d.jpg

 六、代码

1.电机模块

  1. //电机模块
  2. #include <REGX52.H>
  3. sbit IN1=P1^0;//左轮
  4. sbit IN2=P1^1;//左轮
  5. sbit IN3=P1^2;//右轮
  6. sbit IN4=P1^3;//右轮
  7. void Left_Go()//左轮前进
  8. {
  9. IN1=1;
  10. IN2=0;
  11. }
  12. void Right_G0()//右轮前进
  13. {
  14. IN3=1;
  15. IN4=0;
  16. }
  17. void Left_Back()//左轮后退
  18. {
  19. IN1=0;
  20. IN2=1;
  21. }
  22. void Right_Back()//右轮后退
  23. {
  24. IN3=0;
  25. IN4=1;
  26. }
  27. void Left_Stop()//左轮停止
  28. {
  29. IN1=0;
  30. IN2=0;
  31. }
  32. void Right_Stop()//右轮停止
  33. {
  34. IN3=0;
  35. IN4=0;
  36. }

 函数封装

  1. #ifdef __MOTOR_H__
  2. #define __MOTOR_H__
  3. void Left_Go();
  4. void Right_G0();
  5. void Left_Back();
  6. void Right_Back();
  7. void Left_Stop();
  8. void Right_Stop();
  9. #endif

2.运动模块

  1. //动作模块
  2. #include <REGX52.H>
  3. #include "MOTOR.h"
  4. void Car_Go()//小车前进
  5. {
  6. void Left_Go();
  7. void Right_G0();
  8. }
  9. void Car_Left()//小车左转
  10. {
  11. void Left_Stop();
  12. void Right_G0();
  13. }
  14. void Car_Right()//小车右转
  15. {
  16. void Right_Stop();
  17. void Left_Go();
  18. }
  19. void Car_Stop()//小车停止
  20. {
  21. void Left_Stop();
  22. void Right_Stop();
  23. }
  24. void Car_Back()//小车后退
  25. {
  26. void Left_Back();
  27. void Right_Back();
  28. }

函数封装

  1. #ifndef __CAR_H__
  2. #define __CAR_H__
  3. void Car_Go();
  4. void Car_Left();
  5. void Car_Right();
  6. void Car_Stop();
  7. void Car_Back();
  8. #endif

3.定时器模块

  1. #include <REGX52.H>
  2. sbit ENA_1 = P3^0;
  3. sbit ENA_2 = P3^1;
  4. sbit ENB_1 = P3^2;
  5. sbit ENB_2 = P3^3;
  6. /**
  7. * @brief 定时器0初始化,100us@12.000MHz
  8. * @param 无
  9. * @retval 无
  10. */
  11. void Timer0_Init(void) //100微秒@11.0592MHz
  12. {
  13. TMOD &= 0xF0; //设置定时器模式
  14. TMOD |= 0x01; //设置定时器模式
  15. TL0 = (65536-100)%256; //设置定时初始值
  16. TH0 = (65536-100)/256; //设置定时初始值
  17. TF0 = 0; //清除TF0标志
  18. TR0 = 1; //定时器0开始计时
  19. ET0 = 1;
  20. EA = 1;
  21. PT0 = 0;
  22. }
  23. unsigned int pwml,pwmr,t;//左右占空比,比较值
  24. void Timer0_Routine() interrupt 1
  25. {
  26. TL0 = (65536-100)%256; //设置定时初始值
  27. TH0 = (65536-100)/256; //设置定时初始值
  28. t++;
  29. if(t<pwml)
  30. {
  31. ENA_1 = 1;
  32. ENA_2 = 1;
  33. }
  34. else
  35. {
  36. ENA_1 = 0;
  37. ENA_2 = 0;
  38. }
  39. //左pwm
  40. if(t<pwmr)
  41. {
  42. ENB_1 = 1;
  43. ENB_2 = 1;
  44. }
  45. else
  46. {
  47. ENB_1 = 0;
  48. ENB_2 = 0;
  49. }
  50. //右pwm
  51. if(t>=100){t = 0;}
  52. }

函数封装

  1. #ifndef __TIMER0_H__
  2. #define __TIMER0_H__
  3. extern pwml;
  4. extern pwmr;
  5. extern t;
  6. void Timer0_Init(void);
  7. #endif

4.循迹模块

  1. #include <REGX52.H>
  2. #include "CAR.h"
  3. #include "Timer_0.h"
  4. sbit OUT1 = P2^4;//左调
  5. sbit OUT2 = P2^1;//右调
  6. extern pwml;
  7. extern pwmr;
  8. void Chack()
  9. {
  10. if(OUT1 == 1 && OUT2 == 1)//全黑线(或空中)停车
  11. {
  12. pwml = 0;
  13. pwmr = 0;
  14. Car_Stop();
  15. }
  16. if(OUT1 == 0 && OUT2 == 1)//偏左,右移
  17. {
  18. pwml = 20;
  19. pwmr = 16;
  20. Car_Go();
  21. }
  22. if(OUT1 == 1 && OUT2 == 0)//偏右,左移
  23. {
  24. pwml = 16;
  25. pwmr = 20;
  26. Car_Go();
  27. }
  28. if(OUT1 == 0 && OUT2 == 0)
  29. {
  30. pwml = 16;
  31. pwmr = 16;
  32. Car_Go();
  33. }
  34. }

函数封装

  1. #ifndef __CHACK_H__
  2. #define __CHACK_H__
  3. #include "MOTOR.h"
  4. void Chack();
  5. #enfif

5.main函数

  1. #include <REGX52.H>
  2. #include "Timer_0.h"
  3. #include "MOTOR.h"
  4. #include "CAR.h"
  5. #include "Chack.h"
  6. void main()
  7. {
  8. Timer0_Init();
  9. while(1)
  10. {
  11. Chack();
  12. }
  13. }

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/767840
推荐阅读
相关标签
  

闽ICP备14008679号