51红外循迹小车报告(舵机版)最终版.doc
《51红外循迹小车报告(舵机版)最终版.doc》由会员分享,可在线阅读,更多相关《51红外循迹小车报告(舵机版)最终版.doc(23页珍藏版)》请在冰豆网上搜索。
![51红外循迹小车报告(舵机版)最终版.doc](https://file1.bdocx.com/fileroot1/2022-11/2/68b32339-3da0-4753-afb1-9434f68059c2/68b32339-3da0-4753-afb1-9434f68059c21.gif)
简
易
教
程
前言
往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。
整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。
系统分为检测、控制、驱动三个模块。
首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。
个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。
谢谢!
李学云王维
2016年7月27号
目录
前言 1
第一部分 硬件设计 1
1.1车模选择 1
1.2传感器选择 1
1.3控制模块选择 2
第二部分 软件设计及调试 3
2.1开发环境 3
2.2总体框架 3
2.3舵机程序设计与调试 3
2.3.1程序设计 3
2.3.2调试 3
2.3.3程序代码 4
2.4传感器调试 5
2.4.1传感器好坏的检测 5
2.4.2单片机能否识别信号并输出信号 5
2.5综合调试 7
附录1 9
第一篇舵机(舵机及转向控制原理) 9
1.1概述 9
1.2舵机的组成 10
1.3舵机工作原理 11
1.4舵机使用中应注意的事项 12
1.5如何利用程序实现转向 12
1.6舵机测试程序 13
附录2 14
第二篇光电红外传感器 14
2.1传感器的原理 14
2.2红外光电传感器ST188结构图 15
2.3传感器的选择 15
2.4传感器的安装 15
2.5使用方法 16
2.7红外传感器输入输出调试程序 17
一、课题任务及要求
用360°连续舵机设计一个自动循迹小车,可以自动行驶并检测到地面黑色轨迹,沿着黑色轨迹行驶.
二、小车行驶基本原理
小车在白色地板上循黑线行走,由于黑线和白色地板对光线的反射系数不同,可以根据接收到的反射光的强弱来判断“道路”。
通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
三、总体设计方案
通过51单片机,在“while
(1){}”里面不断扫描外部输入I/O口,若能读到高电平,则输出相应的舵机控制程序。
(要求:
51I/O口TTL门输入电压3.5V以上为高电平,1.2V以下为低电平。
读取引脚时,先置1再读取).
第一部分 硬件设计
1.1车模选择
本教程选择带有两舵机和一万向轮的车模。
舵机型号:
SM-S4303R(360°旋转舵机).其原理及详细操作说明,见附录1.车模实物如图1.1.
图1.1
1.2传感器选择
本教程选择ST188红外对管光电传感器,使用左、前、右分布的三个传感器(前伸为了检测十字路口)。
传感器应用电路图如图1.2。
光电传感器原理详情,请看附录2->传感器篇。
图1.2
应用原理:
红外探测法
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
1.3控制模块选择
因为循迹小车,只需要做简单的输入输出操作,普通51单片机都能实现其功能.本教程选用是51单片机型号为STC89C52RC的最小系统板(有引脚引出的)。
本教程里的程序理论上具有51内核的单片机都可使用。
最小系统原理图,如图1.3.
图1.351最小系统原理图
1.4供电扩展版
为了控制的稳定,舵机直接从电源VCC串个二极管供电。
这里采用简单的电源扩展,将5V电源引入扩展板,再引出供给电机和控制模块。
(这里最好把二极管接上,消除电机感性对单片机的影响)
注意:
当舵机与控制板供电电源不同时,两边必须共地,数字信号才能同步。
否则控制信号会发生混乱,导致无法控制。
第二部分 软件设计及调试
2.1开发环境
KeilC51v9.54a、stc-isp-15xx-v6.85H、USB-TLL51下载器(烧录程序用)
2.2总体框架
2.3舵机程序设计与调试
2.3.1程序设计
通过了解,知道89S51单片机自身没有PWM接口,故使用定时器模拟产生PWM波,进行舵机速度调试。
使用51单片机的定时器T0工作在方式1,赋予初值“TH0=(65535-100)/256;TL0=(65535-100)%256;”定时0.1ms(晶振频率12MHz),用count计数200,产生50HZ的脉冲频率(舵机最适频率)。
设全局变量LS、RS来控制占空比,从P1.0P1.1输出PWM信号,两口外接舵机。
附:
1.脉冲产生原理:
周期20ms,定时1.2ms为高电平,其他时间为低电平.即可 产生占空比 为6%(一周期内高电平占比)的脉冲信号.
2.pwm控制舵机原理,可理解为一个高电平舵机一动,给的多动的快, 但有范围。
2.3.2调试
调试目的:
得到正反转占空比范围。
我的调试数据为:
正转范围0.5%~6%(即:
LS=1,LS=12)
反转范围6.5%以上(即:
LS>=13)
2.3.3程序代码
/******************************************************
51单片机舵机调试程序
调试参数:
1.定时器定时0.1ms,计数200,定时20ms(50HZ)
. (360°左舵机为例):
频率50HZ
LS=12(即占空比%6),电机正转最慢
*******************RS=13(即占空比%6.5),电机正转最慢****************/
/*提示:
1.调试舵机时,最好单独供电(控制信号与电源供电分离)
.2.控制信号与供电电源必须共地。
*/
/*****************作者:
李学云 2016.7.23****************/(......排版好乱)
#include"reg52.h"
#defineucharunsignedchar
ucharcount=0,LS=2,RS=15;//count:
定时计数 LS:
左路舵机脉宽调试
sbitpwm_L=P1^0;//左路电机输出
sbitpwm_R=P1^1;
voidinit()
{
pwm_L=0;//占空比控制变量初始化
pwm_R=0;
//定时器,初始化,定时器T0工作方式1
TMOD=0x01;
TH0=(65535-100)/256;//基准定时时间为0.1ms
TL0=(65535-100)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
{
init();
while
(1)
{}
}
voidtimer0()interrupt1//定时器T0中断服务函数,1为T0中断号,3为T1中断号
{
TH0=(65535-100)/256;
TL0=(65535-100)%256;
count++;
if(count<=LS){pwm_L=1;}else{pwm_L=0;}
if(count<=RS) {pwm_R=1;}else{pwm_R=0;}
count=count%200;//定时20ms频率50hz
}
2.4传感器调试
2.4.1传感器好坏的检测
给传感器通上电,使传感器高度在0.3mm-10mm,并来回的在黑白线间移动,同时用万用表检测,看在黑线时,电压输出是否大于3.5V,白线时电压是否低于1.2V。
2.4.2单片机能否识别信号并输出信号
三路传感器分别接到单片机P1.5P1.6P1.7口,P0口接8个LED灯。
下好程序,接好线,通电并移动传感器在黑白之间(高度0.5mm左右),观察P0.5P06P0.7口LED是否有闪烁,有则单片机能识别信号并输出信号。
/******三路红外光电传感器测试程序*********/
/*****P0口接上一排LED灯做指示用*********/
/****现象:
单片机能识别到传感器信号,则对应P0.5P06P0.7口LED闪烁,否则只有P0.1P02P0.3 闪烁。
***********/
#include"reg52.h"
#defineucharunsignedchar
ucharcount=0,LS=0,RS=0;
sbitpwm_L=P1^0;//左路电机输出
sbitpwm_R=P1^1;
sbitk1=P1^5;
sbitk2=P1^6;
sbitk3=P1^7;
sbitled1=P0^1;
sbitled2=P0^2;
sbitled3=P0^3;
sbitled4=P0^5;
sbitled5=P0^6;
sbitled6=P0^7;
voiddelay(uchark)
{
uchari;
for(;k>0;k--)
for(i=0;i<=128;i++);
}
voidinit()
{
pwm_L=0;
pwm_R=0;
P1=0xff;
TMOD=0x01;
TH0=(65535-100)/256;
TL0=(65535-100)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
{
init();
while
(1)
{
if(k1==1){LS=0;RS=5;led1=0;delay(100);led1=1;}
if(k2==1){LS=16;RS=0;led2=0;delay(100);led2=1;}
if(k3==1){LS=0;RS=5;led3=0;delay(100);led3=1;}
if(k1==0){LS=16;RS=0;led4=0;delay(100);led6=1;}
if(k2==0){LS=0;RS=5;led5=0;delay(100);led5=1;}
if(k3==0){LS=16;RS=0;led6=0;delay(100);led6=1;}
}
}
voidtimer0()interrupt1
{
TH0=(65535-100)/256;
TL0=(65535-100)%256;
count++;
if(cou