小车循迹壁障等流程图
智能循迹避障小车设计分析解析

毕业设计(论文)课题名称智能循迹避障小车设计学生姓名XXX学号00000000000000系、年级专业XXXXXXXXXXXXXXXXXXX指导教师XXX职称讲师2016年5月18日摘要自从首个工业智能设施诞生以来,智能设施的发展已经扩展到了包括机器、刻板、电子、冶金、交通、宇航、国防等产业领域。
近年来智能设施水平迅速上升,大大的改变了大多数人类的生活方式。
在人类的智能化技术不断飞速进步的过程中,能够取代手动的机器人在更加人性化的同时也越来越智能化。
本文主要讨论了基于单片机的智能循迹避障小车的设计。
智能自动循迹制导系统在驱动电路的基础上,实现自动跟踪汽车导线,而智能避障是使用红外传感器测距系统来实现功能来规避障碍。
智能寻光避障小车是一种采用了多种传感器,以单片机为核心,电力马达驱动和自动控制为技术,根据程序预先确定的模式,而不是人工管理来实现避障导航的自动跟踪高新技术。
这项技术已广泛应用于智能无人驾驶、智能机器人、全自动工厂等许多领域。
这个设计使用STC89C52单片机[1]作为小车的智能核心,使用红外传感器对智能小车跟踪模块识别引导线跟踪,收集模拟信号并将信号转换成为数字信号,使用C 语言编写程序,设计的电路结构简单,易于实现,时效性高。
关键词:智能化;单片机最小系统;传感器;驱动电路ABSTRACTFrom the first level of industrial intelligent facilities since birth, the development of intelligent facilities has been broadened to include machinery, electronics, metallurgy, transportation, aerospace, defense and other fields. Intelligent facilities level rising in recent years, and rapidly, significantly changed the way people live. People in the process of thinking, improvement, learning and intelligence of replace the manual machine is more and more.This paper mainly discusses the intelligent tracking based on single chip microcomputer control process of the obstacle avoidance car. Intelligent automatic tracking is based on the driving circuit of the guidance system, to achieve automatic tracking car line; obstacle avoidance is the use of infrared sensor ranging system to realize the function to evade obstacles. Intelligent tracking obstacle avoidance car is a use different sensor , motor drive for power and automatic control technology to realize according to the procedures predetermined mode, not by artificial management can realize the automatic tracking of obstacle avoidance navigation of high and new technology. The technology has been widely used in unmanned intelligent unmanned line, intelligent robot and so on many fields.Using infrared sensors for car tracking module to identify the guide line tracking, collecting analog signal and converts the signal into digital signal; Using C language to write the program, the design of the circuit structure is simple, easy to implement,timeliness is high.Keywords: Intelligent; Single chip microcomputer minimum system; The Sensor; Driver circuit目录第1章绪论 (1)1.1智能小车的发展近况与趋势 (1)1.2课题研究的目的及意义 (1)1.3课题研究的主要内容 (2)第2章方案设计 (3)2.1系统概述 (3)2.2硬件模块方案 (3)2.3软件模块方案 (5)第3章硬件设计 (6)3.1电源模块 (6)3.2核心控制模块 (6)3.3循迹模块 (7)3.4避障模块 (8)3.5无线遥控模块 (9)3.6电机驱动模块 (10)3.7拓展模块 (13)第4章软件模块 (15)4.1循迹程序模块 (15)4.2避障程序模块 (16)4.3无线遥控程序模块 (17)4.4寻光拓展程序模块 (18)4.5驱动电机程序模块 (19)第5章系统测试与分析 (20)5.1硬件调试 (20)5.2软件调试 (21)总结 (22)参考文献: (23)附录 (24)致谢 (25)第1章绪论1.1智能小车的发展近况与趋势1.1.1智能小车的发展近况现阶段智能汽车的发展十分的迅速,从智能玩具到其他各行各业都有实质性的结果[1]。
循迹小车全资料

寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。
笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。
整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。
总体方案整个电路系统分为检测、控制、驱动三个模块。
首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图1所示。
图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。
ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。
ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。
笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。
R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。
智能循迹避障小车设计

目录摘要 (2)绪论 (2)2方案设计与论证 (3)2.1 主控系统 (3)2.2 电机驱动模块 (4)2.3 循迹模块 (5)2.4 避障模块 (6)2.5 机械系统 (7)2.6电源模块 (7)3硬件设计 (7)3.1总体设计 (7)3.2驱动电路 (8)3.3信号检测模块 (9)3.4主控电路 (10)4 软件设计 (12)4.1主程序模块 (12)4.2电机驱动程序 (12)4.3循迹模块 (13)4.4避障模块 (15)结束语 (19)致谢 (19)参考文献 (19)智能循迹避障小车李庆滨(德州学院物理系,山东德州253023)摘要利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。
其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM 波控制。
关键词智能小车;STC89C52单片机;L298N;红外对管1 绪论自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。
人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。
随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。
视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。
但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。
机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。
避障控制系统是基于自动导引小车(AVG—auto-guide vehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。
循迹小车基本原理

寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。
笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。
整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。
总体方案整个电路系统分为检测、控制、驱动三个模块。
首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图1所示。
图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。
笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。
红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。
传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。
ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。
ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。
笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。
R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。
循迹小车基本原理

正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好 坏的一个重要因素。从简单、方便、可靠等角度岀发,同时在底盘装设4个红外探测头,进行两级方向纠
正控制,将大大提高其循迹的可靠性,具体位Fra bibliotek分布如图3所示。
图3红外探头的分布图
图中循迹传感器全部在一条直线上。其中X1与Y1为第一级方向控制传感器,X2与Y2为第二级方向控制
压的大小输岀不同的电压和功率,解决了负载能力不够这个问题。
结语
此方案选择的器件比较简单,实际中也很容易实现。经过多次测试,结果表明在一定的弧度范围内,小车 能够沿着黑线轨迹行进,达到了预期目标。不足之处,由于小车采用直流电机,其速度控制不够精确和稳 定,不能实现急转和大弧度的拐弯。
程序
#include<reg51.h>
软件控制单元
单片机选型及程序流程
此部分是整个小车运行的核心部件,起着控制小车所有运行状态的作用。控制方法有很多,大部分都
采用单片机控制。由于51单片机具有价格低廉是使用简单的特点,这里选择了ATMEL公司的AT89S51
作为控制核心部件,其程序控制方框图如图4所示。
图4系统的程序流程图
小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信
传感器的选择
市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构
简单、工作性能可靠的集成式红外探头。ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、
用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接
图2ST168检测电路
智能小车的循迹避障行驶说明书

智能小车的循迹避障行驶目录摘要 (III)Abstract (IV)第一章绪论 (1)1.1 课题背景 (1)1.2 研究目的及意义 (1)1.3 本设计完成的工作 (2)第二章总体设计方案 (3)2.1 方案选择及论证 (4)4446662.2 最终方案 (7)第三章硬件设计 (8)3.1 主控器STC89C52 (8)3.2 单片机复位电路设计 (10)3.3 单片机时钟电路设计 (10)3.4 避障模块 (10)3.5 电源设计 (11)3.6 电机驱动模块 (12)3.7 红外循迹模块 (13)3.8 小车车体总体设计 (15)第四章软件设计 (16)4.1 主程序流程图 (16)第五章系统的安装与调试 (18)5.1 系统的安装 (18)5.2 电路的调试 (19) (20)205.3 测试结果与分析 (20)结论 (21)参考文献 (22)致谢........................................................ 错误!未定义书签。
附录1 整机电路原理图.. (22)附录2 部分源程序 (23)智能小车的循迹避障行驶摘要在现代化的生产生活中,智能机器人已经渐渐普及到国防、工业、交通、生活等各个领域。
为了使生产更加有效率更加安全,使生活更加方便、轻松,智能机器人起到了越来越重要的作用。
智能小车属于智能机器人的一种,同样能给生产生活带来极大的便利。
它能够自己判断路面情况,并将各种信息反馈给单片机。
所用到的学科有自动控制原理、传感器技术、计算机和信息技术等多门学科。
智能车能够在一定程度上解放人的双手、减小工作强度从而改善人们的生活,提高生产的质量和效率。
能够自动循迹和避绕障碍物行驶则是智能小车需要的最基本的功能。
小车之所以能够自动避开障碍物并进行循迹是因为它可以感测引导线和行进路上的障碍物,因此这里采用超声波测距模块和红外传感器来实现这些功能。
本文先介绍了选题的背景及发展前景,描述了智能车在生产和生活中发展和应用的情况;接着对硬件部分所用器件的原理和特点进行了介绍;然后对软件设计和机械部分进行说明;在文章的最后就整个过程的体会及智能机器人的发展进行了总结和展望。
智能寻迹避障小车寻线、避障控制程序设计

1.1.2 寻迹电路原理
小车处于白色区域,这时小车就会沿直线行走 ,当红外发射管左边对准黑线(黑胶带),右 边对准白线(白色地面)时,左边的红外线被 黑线吸收,红外线无法反射回,则左边呈现高 电平,即单片机检测到P3.5=1(左边)、 P3.6=0,这时,小车便向左边修正(左转弯 ),使左边传感器重新回到白色区域。右转弯 过程与左转弯相类似,请学员自行分析。
//左边往前
//右边往前
湖南创博龙智信息 科技有限公司
2.1.4 参考程序代码
void hou() { zuo1=1; zuo2=0; you1=1; you2=0; } void zuo() { zuo1=1; zuo2=0; you1=0; you2=1; } void you() { zuo1=0; zuo2=1; you1=1; you2=0; } //左边往后 //右边往后
智能寻迹小车设计与制作 (寻线、避障控制程序设计)
主讲:雷道仲
湖南创博龙智信息 科技有限公司
任务及要求
任务一:智能寻迹避障小车寻线程序设计 固定路线寻线:学员编写程序使智能
寻线、避障控制模块共设置了两个任务,分别如下:
寻迹避障小车沿黑色圆圈行走,行走过程
中小车一直压着黑线走,不得冲出黑线圆
圈之外或之内。
湖南创博龙智信息 科技有限公司
1.1.4 程序代码
void you() { zuo1=0; zuo2=1; you1=1; you2=0; } void main() { while(1) { if(zuod==0&youd==0) { qian(); out=ZM[1]; } if(zuod==1&youd==0) { while(1) { zuo(); out=ZM[3]; D1=0; if(zuod==0)
小车循迹壁障等流程图

#include<reg51.h> #include<math.h> #define uchar unsigned char #define uint unsigned int sbit en1=P1^0; /* L298的Enable A */ sbit en2=P1^1; /* L298的Enable B */ sbit s1=P1^2; /* L298的Input 1 */ sbit s2=P1^3; /* L298的Input 2 */ sbit s3=P1^4; /* L298的Input 3 */ sbit s4=P1^5; /* L298的Input 4 */ uchar t=0; /* 中断计数器*/ uchar m1=0; /* 电机1速度值*/ uchar m2=0; /* 电机2速度值*/ uchar tmp1,tmp2; /* 电机当前速度值*/ /* 电机控制函数index-电机号(1,2); speed-电机速度(-100—100) */ void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) /* 电机1的处理*/ { m1=abs(speed); /* 取速度的绝对值*/ if(speed<0) /* 速度值为负则反转*/ { s1=0; s2=1; } else /* 不为负数则正转*/ { s1=1; s2=0; } } if(index==2) /* 电机2的处理*/ { m2=abs(speed); /* 电机2的速度控制*/ if(speed<0) /* 电机2的方向控制*/ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void delay(uint j) /* 简易延时函数*/ { for(j;j>0;j--); } void main() { uchar i; TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值*/ TL0=0x9B; EA=1; /* 开中断*/ ET0=1; /* 定时器0允许中断*/ TR0=1; /* 启动定时器0 */ while(1) /* 电机实际控制演示*/ { for(i=0;i<=100;i++) /* 正转加速*/ { motor(1,i); motor(2,i); delay(5000); } for(i=100;i>0;i--) /* 正转减速*/ { motor(1,i); motor(2,i); delay(5000); } for(i=0;i<=100;i++) /* 反转加速*/ { motor(1,-i); motor(2,-i); delay(5000); } for(i=100;i>0;i--) /* 反转减速*/ { motor(1,-i); motor(2,-i); delay(5000); } } } void timer0() interrupt 1 /* T0中断服务程序*/ { if(t==0) /* 1个PWM周期完成后才会接受新数值*/ { tmp1=m1; tmp2=m2; } if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号*/ if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号*/ t++; if(t>=100) t=0; /* 1个PWM信号由100次中断产生*/ 有两路PWM,希望对你有帮助!#include "reg52.H"#include "MyType.h"//=============L298端口定义===============sbit ENA = P3^6; //左轮驱动使能sbit IN1 = P0^3; //左轮黑线(-)sbit IN2 = P0^4; //左轮红线(+)sbit IN3 = P0^5; //右轮红线(-)sbit IN4 = P0^6; //右轮黑线(+)sbit ENB = P3^7; //右轮驱动使能//=============PWM================#define PWM_COUST 100 //PWM细分等份100uchar MOTO_speed1; //左边电机转速uchar MOTO_speed2; //右边电机转速uchar PWM_abs1; //左边电机取绝对值后占空比uchar PWM_abs2; //左边电机取绝对值后占空比uchar PWM_var1=20; //左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20; //右边电机直走速度uchar PWMAnd = 0; //PWM自增变量/******************************************************************名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM 值;speed2:电机2的PWM值speed>0.正转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){ //==============左边电机============= if (speed1>0) { IN1 =0;IN2 =1;//正转} else if (speed1<0) { IN1 =1;IN2 =0;//反转} //==============右边电机============= if (speed2>0) { IN3 =1;IN4 =0;//正转} else if (speed2<0) { IN3 =0;IN4 =1;//反转}} /******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/voidmotor_PWM (){ uchar PWM_abs1; uchar PWM_abs2; PWM_abs1=MOTO_speed1; PWM_abs2=MOTO_speed2; if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空比输出else ENA=0; if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空比输出else ENB=0; if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零else PWMAnd+=1;} /******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/ void TIME_Init () {//=========定时器T2初始化PWM================== TCON = 0x00; TMOD = 0x00; RCAPH = 0xff; //定时0.1ms RCAPL = 0x47; TH0 = 0xff; TL0 = 0x47; ET0 = 1; //定时器2中断开TR0 = 1; //PWM定时器关,PWM周期为10ms }/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM 占空比输出返回:/******************************************************************/ void PWM_Time2 () interrupt 5{ TR2 = 0; TF2 = 0; ET2 = 0; //定时器0中断禁止motor_PWM();//PWM占空比输出ET2 = 1; //定时中断0开启TR2 = 1;}main(){ TIME_Init () ;motor(50,50);//左右电机的转速都是50}图 3-1 ST188实物图图 3-2 ST188管脚图及内部电路通过ST188检测黑线,输出接收到的信号给LM324 ,接收电压与比较电压比较后,输出信号变为高低电平,再输入到单片机中,用以判定是否检测到黑线。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg51.h> #include<math.h> #define uchar unsigned char #define uint unsigned int sbit en1=P1^0; /* L298的Enable A */ sbit en2=P1^1; /* L298的Enable B */ sbit s1=P1^2; /* L298的Input 1 */ sbit s2=P1^3; /* L298的Input 2 */ sbit s3=P1^4; /* L298的Input 3 */ sbit s4=P1^5; /* L298的Input 4 */ uchar t=0; /* 中断计数器*/ uchar m1=0; /* 电机1速度值*/ uchar m2=0; /* 电机2速度值*/ uchar tmp1,tmp2; /* 电机当前速度值*/ /* 电机控制函数index-电机号(1,2); speed-电机速度(-100—100) */ void motor(uchar index, char speed) { if(speed>=-100 && speed<=100) { if(index==1) /* 电机1的处理*/ { m1=abs(speed); /* 取速度的绝对值*/ if(speed<0) /* 速度值为负则反转*/ { s1=0; s2=1; } else /* 不为负数则正转*/ { s1=1; s2=0; } } if(index==2) /* 电机2的处理*/ { m2=abs(speed); /* 电机2的速度控制*/ if(speed<0) /* 电机2的方向控制*/ { s3=0; s4=1; } else { s3=1; s4=0; } } } } void delay(uint j) /* 简易延时函数*/ { for(j;j>0;j--); } void main() { uchar i; TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值*/ TL0=0x9B; EA=1; /* 开中断*/ ET0=1; /* 定时器0允许中断*/ TR0=1; /* 启动定时器0 */ while(1) /* 电机实际控制演示*/ { for(i=0;i<=100;i++) /* 正转加速*/ { motor(1,i); motor(2,i); delay(5000); } for(i=100;i>0;i--) /* 正转减速*/ { motor(1,i); motor(2,i); delay(5000); } for(i=0;i<=100;i++) /* 反转加速*/ { motor(1,-i); motor(2,-i); delay(5000); } for(i=100;i>0;i--) /* 反转减速*/ { motor(1,-i); motor(2,-i); delay(5000); } } } void timer0() interrupt 1 /* T0中断服务程序*/ { if(t==0) /* 1个PWM周期完成后才会接受新数值*/ { tmp1=m1; tmp2=m2; } if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号*/ if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号*/ t++; if(t>=100) t=0; /* 1个PWM信号由100次中断产生*/ 有两路PWM,希望对你有帮助!#include "reg52.H"#include "MyType.h"//=============L298端口定义===============sbit ENA = P3^6; //左轮驱动使能sbit IN1 = P0^3; //左轮黑线(-)sbit IN2 = P0^4; //左轮红线(+)sbit IN3 = P0^5; //右轮红线(-)sbit IN4 = P0^6; //右轮黑线(+)sbit ENB = P3^7; //右轮驱动使能//=============PWM================#define PWM_COUST 100 //PWM细分等份100uchar MOTO_speed1; //左边电机转速uchar MOTO_speed2; //右边电机转速uchar PWM_abs1; //左边电机取绝对值后占空比uchar PWM_abs2; //左边电机取绝对值后占空比uchar PWM_var1=20; //左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20; //右边电机直走速度uchar PWMAnd = 0; //PWM自增变量/******************************************************************名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM 值;speed2:电机2的PWM值speed>0.正转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){ //==============左边电机============= if (speed1>0) { IN1 =0;IN2 =1;//正转} else if (speed1<0) { IN1 =1;IN2 =0;//反转} //==============右边电机============= if (speed2>0) { IN3 =1;IN4 =0;//正转} else if (speed2<0) { IN3 =0;IN4 =1;//反转}} /******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/voidmotor_PWM (){ uchar PWM_abs1; uchar PWM_abs2; PWM_abs1=MOTO_speed1; PWM_abs2=MOTO_speed2; if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空比输出else ENA=0; if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空比输出else ENB=0; if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零else PWMAnd+=1;} /******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/ void TIME_Init () {//=========定时器T2初始化PWM================== TCON = 0x00; TMOD = 0x00; RCAPH = 0xff; //定时0.1ms RCAPL = 0x47; TH0 = 0xff; TL0 = 0x47; ET0 = 1; //定时器2中断开TR0 = 1; //PWM定时器关,PWM周期为10ms }/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM 占空比输出返回:/******************************************************************/ void PWM_Time2 () interrupt 5{ TR2 = 0; TF2 = 0; ET2 = 0; //定时器0中断禁止motor_PWM();//PWM占空比输出ET2 = 1; //定时中断0开启TR2 = 1;}main(){ TIME_Init () ;motor(50,50);//左右电机的转速都是50}图 3-1 ST188实物图图 3-2 ST188管脚图及内部电路通过ST188检测黑线,输出接收到的信号给LM324 ,接收电压与比较电压比较后,输出信号变为高低电平,再输入到单片机中,用以判定是否检测到黑线。
图3-5 传感器模块电路图PWM1为1,PWM2为1时,Q1和Q2导通,节点1和节点2都是低电平,Q15和Q16导通,电机不工作。
PWM1为0,PWM2为0时,Q1和Q2导通,节点1和节点2都是高电平,Q13和Q14导通,电机不工作。
PWM1为1,PWM2为0时,Q1导通但Q2不导通,节点1是低电平而节点2是高电平,Q14和Q15导通,电机逆时针转动。
PWM1为0,PWM2为1时,Q1不导通但Q2导通,节点1是高电平而节点2是低电平,Q13和Q16导通,电机顺时针转动。
传感器循迹检测通信协同小车运行交替超车信息采集产生控制信号无线通信控制行进STC89C52主控系统 图2-1 系统实现原理结构图小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O 口,一旦检测到某个I/O 口有信号,即进入判断处理程序,先确定4个探测器中的哪一个探测到了黑线,如果左面第一级传感器或者左面第二级传感器探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是右面第一级传感器或右面第二级传感器探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。