找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2188|回复: 0
打印 上一主题 下一主题
收起左侧

单片机循迹小车论文 电赛资料下载

[复制链接]
跳转到指定楼层
楼主
ID:370451 发表于 2018-7-12 19:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第十五届“长通杯”大学生电子设计竞赛

循迹小车(I题)

摘  要
随着现代化的不断发展,智能水平逐渐进步,某些智能引导机器人已经逐步出现在无人驾驶机动车,仓库,无人快递工厂及服务机器人等方面,智能循迹小车就是其中一个重要的应用方向。本文论述了智能循迹小车的控制过程,本设计采用STC89C516RD+单片机作为智能小车的控制核心,运用红外对管传感器检测道路情况,识别白色路面中央的黑色标识线,采集信号并将信号转换为能被单片机识别的数字信号,在电机驱动中,采用L298N电机驱动模块控制直流电机,通过相应程序完成双线循迹及自动泊车,自动避障,整体系统电路设计简单,可靠性能高。

目  录

摘  要
目  录              III

1 系统方案
1.1 智能循迹小车控制芯片的论证与选择
2 系统理论分析与计算
2.1 系统整体的分析
2.1.1  所用元件的分析              1
2.1.2 系统模块与接线分析              2
2.1.3 小车电源模块分析              2
2.1.4 电机驱动模块分析              2
2.1.5 红外循迹模块分析              3
3 电路与程序设计              3
3.1 电路的设计              4
3.1.1 系统总体框图              4
3.1.2 驱动系统框图与电路原理图              4
3.2 程序的设计              5
3.2.1 程序功能描述与设计思路              5
3.2.2 程序流程图              5

4 测试方案与测试结果              6
4.1 测试方案              6
4.2 测试条件与仪器              6
4.3 测试结果及分析                            6
4.3.1 测试结果(数据)                            6
4.3.2 测试分析与结论                            7
5 心得体会                            7
附录1:电路原理图              8
附录2:源程序              10

循迹小车I题)

1 系统方案
1.1智能小车控制芯片的论证与选择

方案1:采用Atmel公司的AT89C516RD+单片机作为智能小车的主控芯片, AT89C516RD+是一种低功耗、高性能CMOS8位微控制器,工作电压为5V,32个I/O口,具有 8K 在系统可编程Flash 存储器。该芯片价格便宜,应用广泛,操作简单,硬件与软件设计相对简单。大学生广泛用于单片机学习与创作。资源足够用于智能小车的设计。因此,本设计选择了此芯片。

方案2:采用单片机MSP430F1611作为智能小车的主控芯片,MSP430F1611是一款超低功耗单片机,工作电压范围为1.8V-3.6V,48 位I/O 口线,16-Bit RISC 架构,但相应硬件复杂,软件编写相对难度大,而且价格昂贵,用于智能小车资源过剩,造成浪费。所以我们放弃了此方案。

方案3:采用AT89C51单片机,4k字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。现已被C52逐渐取代,故放弃。

   本设计方案采用方案一中的易于操作的AT89C516RD+单片机作为电信号处理、控制电机驱动以及红外寻迹功能。

2 系统理论分析与计算
2.1系统整体的分析
2.1.1 所用元件的分析
(1)采用AT89C516RD+主控芯片。
  • 采用L298N作为电机驱动模块的主芯片。
  • 采用红外对管制作黑线检测模块。
  • 采用超声波传感器作为避障模块。
2.1.2 系统模块与接线分析

(1)对单片机的程序编程与烧录

程序采用c语言编程,通过keil uVision4软件对程序进行调试以及对可以运行的程序生成单片机可以运行的hex文件;程序的烧录采用stc-isp-15-v6.85烧录软件;用USB转TTL小板给单片机烧录程序。小板的RX接单片机的TX(p3.1),TX接单片机的RX(p3.0),GND接单片机的GND,VCC接单片机的VCC。但需要注意的是在用烧录软件给单片机烧录程序时要用冷启动,即先点击‘下载/编程’按钮,再将USB小板的VCC连接单片机的VCC。

2.1.3 小车的电源模块分析

电池模块采用4节干电池对小车送电。电机的运行需要8V左右的电压,而单片机、超声波、以及红外模块都需要稳定的5v的逻辑电压;因此采用L7805CV稳压芯片输出稳定的5v电压。

图1 电源模块
2.1.4电机驱动模块分析

电机驱动采用L298N集成芯片与单片机和电机连接。通过单片机运行程序将高低电平送给驱动模块从而控制电机的前进、后退、左转、后传、停止。电机驱动集成板自带稳压芯片高压端接电源电压(8v左右),GND接地线,然后输出5v电压;out1、out2用导线和左电机连接,out3、out4用导线和右电机连接。驱动模块的IN1、IN2与单片机的p1.2、p1.3连接,IN3、IN4与单片机 的p1.6、p1.7连接。使能端ENA、ENB通过跳帽连接。

2.1.5 红外寻迹模块分析

红外寻迹采用两个集成的红外对管。红外对管有发射管和接收管,发射管发射红外线,接收管接收。一个红外对管有3个引脚,VCC引脚接5v电平,GND引脚接地,OUT引脚输出高低电平并通过杜邦线与单片机连接。左红外对管与单片机p3.7引脚连接,右红外对管与单片机p3.6引脚连接。若没有寻

到黑线,接收管接收到反射的红外光,光敏电阻变小,输出低电平‘0’;若寻到黑线,接收管不能接收到红外光,光敏电阻大小不变,输出高电平‘1’;单片机处理高低电平并给电机驱动模块输出命令,从而控制电机的运行。

3 电路与程序设计

根据题目要求,把技术指标分配到方框图或主流程图中各部分(即各单元电路或程序模块中)。设计各单元之间的匹配关系对各单元的技术要求。

3.1 电路的设计
3.1.1系统总体框图
图4 系统总体框图
3.2 程序的设计
3.2.1程序功能描述与设计思路

程序有小车直走,左转,右转,停止,延时,寻迹子程序。

用If和while等语句将小车寻到黑迹以及走在白线上用‘0、1’表示。寻到黑迹输出为‘1’,未寻到输出为‘0’。‘IN1=1,IN2=0’表示小车左轮正转;‘IN3=1,IN4=0’表示小车右轮正转;‘IN1=0,IN2=1’表示小车左轮倒转;‘IN3=0,IN4=1’表示小车右轮倒转;‘IN1=1,IN2=0,IN3=1,IN4=0’表示小车直走;通过红外寻迹模块向单片机引脚输出‘0、1’电平,从而单片机控制电机驱动芯片驱动电机寻迹行走。

3.2.2程序流程图:见附录1

4 测试方案与测试结果

根据总体设计对各单元电路的要求,实测该单元电路的对应指标。用表格的形式列出实测数据及实测时所用仪器设备的名称、型号。有些数据最好能画出实测曲线。要求数据、曲线必须真实。

根据题目技术要求,测试作品整体技术指标。用表格的形式列出实测数据及实测时所用仪器设备的名称、型号。有些数据最好能画出实测曲线。要求数据、曲线必须真实。

4.1 测试方案

将设计的程序烧录到单片机中,并用自制的赛道测试小车的行走情况;通过小车在运行中出现的问题在程序中进行更改,并继续进行行走测试。

4.2 测试条件与仪器

条件:光线正常的房间。

工具:焊枪,焊锡,螺丝,螺丝刀,小道,钳子等。

仪器:万用表,计算机。

4.3 测试结果及分析            
4.3.1 测试结果(数据)

结果:小车只能进行单黑线寻迹

4.3.2测试分析与结论

分析:小车硬件缺少红外收发管,只能进行黑线寻迹;软件编程不熟练,超声波避障程序未能调试成功。

5 心得体会

在收到长通杯竞赛通知后,凭借着心中的热情与好奇,我们便迅速的组队参加,但参与过程是异常艰辛与困难的,靠热情无疑难以脱颖而出,在众多的课题中,经过认真考虑,综合实际因素,我们便选择了循迹小车的题目。
  由于脑中没有丝毫头绪,我们就疯狂的在网络上寻找信息,向专业性更强的伙伴求援,还购买了一个成品小车认真研究。然而制作过程仍然坎坷异常,小车的拼接算是最简单的一个环节,但如何在有限的面板合理美观的安装上各种系统还是让我们费尽了心思。另外,各模块的焊接也是个精细活,虽然反复的修正,尝试结果也只能算是差强人意。
  当小车可以做简单的直线运动后,我们便想让其实现更多的功能,可程序的编写烧入又是横亘在我们面前的一道难题,纵然是废寝忘食,我们也只是做出了简单的循迹模块。对于更加困难的功能,由于能力不足,时间紧迫,课程紧张,终究未能实现,我们实在是感到遗憾与羞愧。
  最后,虽然我们的成品十分简陋,功能不全,但这终归是我们小组努力的成果,是我们的心血之作。我们对自己所做的感到骄傲,对未能实现的会继续研究,完善作品。我们小组不是最强的,但我们用尽全力,坚如磐石!

附录1:电路原理图
图12 程序流程图
  1. #include<ZY-4WD_PWM.H>            
  2. #ifndef _LED_H_
  3. #define _LED_H_


  4.     //定义小车驱动模块输入IO口
  5.               sbit IN1=P1^2;
  6.               sbit IN2=P1^3;
  7.               sbit IN3=P1^6;
  8.               sbit IN4=P1^7;
  9.               sbit EN1=P1^4;
  10.               sbit EN2=P1^5;
  11.             

  12.               /***蜂鸣器接线定义*****/
  13.     sbit BUZZ=P2^3;

  14.     #define Left_1_led        P3_7              //左循迹传感器
  15.             
  16.     #define Right_1_led       P3_6              //右循迹传感器
  17.             
  18.     #define LeftIRBZ          P3_5              //左避障传感器            
  19.             
  20.               #define RightIRBZ         P3_4              //右避障传感器               

  21.               #define Left_moto_pwm                P1_6              //PWM信号端

  22.               #define Right_moto_pwm                P1_7              //PWM信号端
  23.             
  24.               #define Left_moto_go      {P1_2=1,P1_3=0;}  //左电机向前走
  25.               #define Left_moto_back    {P1_2=0,P1_3=1;}               //左边电机向后转
  26.               #define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                    
  27.               #define Right_moto_go     {P1_6=1,P1_7=0;}              //右边电机向前走
  28.               #define Right_moto_back   {P1_6=0,P1_7=1;}              //右边电机向后走
  29.               #define Right_moto_Stop   {P1_6=0,P1_7=0;}                    //右边电机停转  

  30.               unsigned char pwm_val_left  =0;//变量定义
  31.               unsigned char push_val_left =0;// 左电机占空比N/20
  32.               unsigned char pwm_val_right =0;
  33.               unsigned char push_val_right=0;// 右电机占空比N/20
  34.               bit Right_moto_stop=1;
  35.               bit Left_moto_stop =1;
  36.               unsigned  int  time=0;

  37. /************************************************************************/            
  38. //延时函数            
  39.    void delay(unsigned int k)
  40. {   
  41.      unsigned int x,y;
  42.               for(x=0;x<k;x++)
  43.                  for(y=0;y<2000;y++);
  44. }
  45. /************************************************************************/
  46. //前速前进
  47.      void  run(void)
  48. {
  49.      push_val_left=15;              //速度调节变量 0-20。。。0最小,20最大
  50.               push_val_right=15;
  51.               Left_moto_go ;   //左电机往前走
  52.               Right_moto_go ;  //右电机往前走
  53. }

  54. //后退函数
  55.      void  backrun(void)
  56. {
  57.      push_val_left=15;              //速度调节变量 0-20。。。0最小,20最大
  58.               push_val_right=15;
  59.               Left_moto_back;   //左电机往后走
  60.               Right_moto_back;  //右电机往后走
  61. }

  62. //左转
  63.      void  leftrun(void)
  64. {            
  65.      push_val_left=5;
  66.               push_val_right=15;
  67.               Right_moto_go ;  //右电机往前走
  68.      Left_moto_back   ;  //左电机后走
  69. }

  70. //右转
  71.      void  rightrun(void)
  72. {
  73.               push_val_left=16;
  74.               push_val_right=8;
  75.      Left_moto_go  ;   //左电机往前走
  76.               Right_moto_back    ;  //右电机往后走            
  77. }

  78. //停止
  79.      void  stop(void)
  80. {            

  81.               Right_moto_Stop ;  //右电机停止
  82.      Left_moto_Stop  ;  //左电机停止
  83. }

  84. /************************************************************************/
  85. /*                    PWM调制电机转速                                   */
  86. /************************************************************************/
  87. /*                    左电机调速                                        */
  88. /*调节push_val_left的值改变电机转速,占空比            */
  89.                             void pwm_out_left_moto(void)
  90. {
  91.    if(Left_moto_stop)
  92.    {
  93.     if(pwm_val_left<=push_val_left)
  94.                      {
  95.                                  Left_moto_pwm=1;
  96. //                                 Left_moto_pwm1=1;
  97.                                }
  98.               else
  99.                      {
  100.                        Left_moto_pwm=0;
  101. //                                 Left_moto_pwm1=0;
  102.                                }
  103.               if(pwm_val_left>=20)
  104.                      pwm_val_left=0;
  105.    }
  106.    else   
  107.           {
  108.            Left_moto_pwm=0;
  109. //           Left_moto_pwm1=0;
  110.                               }
  111. }
  112. /******************************************************************/
  113. /*                    右电机调速                                  */
  114.    void pwm_out_right_moto(void)
  115. {
  116.   if(Right_moto_stop)
  117.    {
  118.     if(pwm_val_right<=push_val_right)
  119.                     {
  120.                      Right_moto_pwm=1;
  121. //                               Right_moto_pwm1=1;
  122.                                }
  123.               else
  124.                     {
  125.                                Right_moto_pwm=0;
  126. //                               Right_moto_pwm1=0;
  127.                               }
  128.               if(pwm_val_right>=20)
  129.                      pwm_val_right=0;
  130.    }
  131.    else   
  132.           {
  133.            Right_moto_pwm=0;
  134. //           Right_moto_pwm1=0;
  135.                     }
  136. }

  137. /***************************************************/
  138. ///*TIMER0中断服务子函数产生PWM信号*/
  139.               void timer0()interrupt 1   using 2
  140. {
  141.      TH0=0XFc;                //1Ms定时
  142.               TL0=0X18;
  143.               time++;
  144.               pwm_val_left++;
  145.               pwm_val_right++;
  146.               pwm_out_left_moto();
  147.               pwm_out_right_moto();
  148. }            

  149. /*********************************************************************/            

  150. #endif
  151.               #include<AT89X52.H>                              //包含51单片机头文件,内部有各种寄存器定义
  152.               #include<ZY-4WD_PWM.H>                              //包含HL-1蓝牙智能小车驱动IO口定义等函数

  153. //主函数
  154.               void main(void)
  155. {            

  156.               unsigned char i;
  157.     P1=0X00;   //关电机            
  158.                                           TMOD=0X01;
  159.                       TH0= 0XFc;                              //1ms定时
  160.                        TL0= 0X18;
  161.                          TR0= 1;
  162.                       ET0= 1;
  163.                       EA = 1;                                             //开总中断


  164.               while(1)              //无限循环
  165.               {
  166.             
  167.                                           //有光信号输出为0  没有光信号输出为1
  168.                             /*              if( LeftIRBZ == 0 || RightIRBZ == 0 )

  169.                                           {
  170.                                          
  171.                                             stop();                               //调用小车停止

  172.                                           }

  173.                                          

  174.                                             else                            */

  175.                             /*              {              */                                               if(Left_1_led==0&&Right_1_led==0)

  176.                                              {
  177.                                                run();   //调用前进函数

  178.                                           
  179.                                              }
  180.                                                                      
  181.                                                                                                      if(Left_1_led==1&&Right_1_led==0)                  //左边检测到黑线
  182.                                                         {
  183.                                                                         leftrun();                              //调用小车左转  函数
  184.                                                                       // delay(2);

  185.                                                }
  186.                                             
  187.                                                                                                       if(Right_1_led==1&&Left_1_led==0)                            //右边检测到黑线
  188.                                                           {               
  189.                                                               rightrun();                               //调用小车右转              函数
  190.                                                                       // delay(2);

  191.                                                           }
  192.                                                                                         if(Right_1_led==1&&Left_1_led==1)                            //悬空状态  避悬崖
  193.                                                           {               
  194.                                                               stop();                               //调用小车停止

  195.                                                           }

  196.                                           }            
  197.               }
复制代码

完整的Word格式文档51黑下载地址:
循迹小车 电子版.docx (499.79 KB, 下载次数: 44)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表