




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用51做小车的相关思路和程序51小车作为一种入门小车,其基本原理与飞思卡尔比赛的小车相似,共分为硬件和软 件两个部分。其中软件部分可分为传感器数据采集,舵机控制,速度控制等,这里现在对 51小车的软件进行一个详细的介绍1.程序思路概述:首先51单片机需要通过红外传感器监测道路信息,然后将传感器得到的数据进行转换。最 后将转换后的数据通过某种控制算法,计算出舵机和电机的控制量,使小车能够沿着跑道行 驶。主体控制流程可以表示为如下图形:能机偏转:路况信息J 数据处理二车速改变2.程序算法2.1数据采集小车传感器为8个红外对管,经过电压比较器后,每个红外对管都有。和1两种状态。因此,8个红外对管产生
2、的数据刚好为1个字节。因此程序有两种方式将这8位数据读入:1、可 以将i/o 口数据当做一个字节,直接赋给一个字符变量;2、将8位数据按位读取,分别赋 给字符变量的每一位。我们的示例程序中采用的就是第二种方法。2.2数据处理由于读入的数据并不方便直接参与控制计算,因此先将该数据集分成16类,分别对应于小 车不同的位置信息,由-7+7表示,其中+7表示引导线位于小车最左侧,0表示引导线位 于小车中部,-7表示引导线位于小车最右侧,8表示未检测到引导线或其他错误情况。2.3控制算法上面的转换后的数据可以作为控制计算的输入,即小车与赛道的偏差信息。方向的控制算法 可以采用位置型PD算法。其中P为比例
3、环节,简单的说就是根据当前小车与赛道的偏差直接进行控制,偏离多少就转 多少,偏离越多,舵机转向越多。可以通过调节比例系数改变转向的幅度。系数越大,转向 幅度越大,转向越快。D称为微分环节,这里的微分信息指上面偏差信息的微分,可以简单理解为小车偏离赛道的 速率。可以简单的将本次的偏差信息与上一次偏差的差值算作微分项。微分项的控制方法是 说,小车偏离跑道越快,方向就要转的越多,反之则转向越小。因此当小车逐渐靠近跑道时, 微分项可以使小车偏转量减小,使小车不至于偏向另一边。可以通过改变微分项的系数来改 变这种调节作用的程度。一般来讲,微分系数越大,小车对于弯道的响应就越灵敏,行驶时 也更稳定。由于小
4、车在不同的位置时,可能需要不同的比例系数或微分系数,因此可以考虑在不同的情 况下,采用不同的系数进行运算。示例程序中采用的就是这种方法。速度控制也可以采用PD算法进行控制。为了使程序简单化,示例程序中采用了匀速的控制 方式。想要提高成绩的同学可以自行加入速度控制程序2. 4生成PWM由于51单片机没有PWM模块,因此需要通过通用I/O 口进行模拟来输出舵机和电机所需 的PWM波。可以分别使用一个定时器来作为一路PWM波的计时器。先将I/O 口置位,通过高电平时间 确定好定时器的初值,当定时器产生中断时,再将I/O 口清零,并设定低电平时间,由此循 环即可产生PWM波。其中,高电平时间由上面的控
5、制计算得出,低电平时间由PWM周期 减去高电平时间得到。鲫鱼电子工作室开发的51智能车是一种入门型智能小车,基本原理和参加飞思卡尔比赛的 小车相似,但是其制作要比正式比赛的小车简单。目的是为了让大家更快地进入飞思卡尔小 车的制作,对智能小车有个更好的理解。51小车分为硬件和软件两个部分,其中硬件又分为三个主要模块,51核心板模块,传感器 模块,扩展板模块。软件部分分为传感器数据采集,舵机控制,速度控制等。51核心板51核心板包括几个小的部分,下载部分,单片机最小系统部分,led用户灯,通用IO接口。 这次开发的51核心板的主控芯片为STC,选择这块芯片的一个重要原因是他的下载调试方 便,可以通
6、过串口直接下载,同时又有51单片机的所有资源。下载部分主要使用了一片PL2303,它是一片USB转串口功能的芯片,由于现在大部分计 算机都不包括串口,但每台计算机都有USB 口,于是我们想是否可以通过USB下载,最后 在网上找到了一片USB转串口的芯片,这样我们下载程序将更简单,不需要再单独购买51 下载器,极大地方便了同学们的调试。下载部分具体原理图如下:#include /包括一个52标准内核的头文件#include /*定义数据类型(方便移植)*/typedef unsigned char UINT8;typedef char SINT8;typedef unsigned int UIN
7、T16;typedef int SINT16;/*定义布尔值(增强程序可读性)*/#define HIGHLEVEL 1 #define LOWLEVEL 0/*定义相关常数(移植于不同的小车时,需根据实际情况改变该常数*/#define SERVOMID 1270 /舵机中值#define SERVOMOSTLEFT 1680 /舵机左值#define SERVOMOSTRIGHT 870 /舵机右值#define SERVO_PERIOD 20000 /舵机PWM周期:20ms,晶振12M 公式:计数值=定时时间 *晶振频率/12,如 20ms: 计数值=0.02 s * 12 000 0
8、00 Hz/12 = 20000#define MOTOR_PERIOD 10000 /电机 PWM 周期:10ms,晶振 12M/* 输出口定义 */sbit SevorPort = P0A1;sbit MotorPort = P0A6;sbit P20 = P2A0;sbit P21 = P2A1;sbit P22 = P2A2;sbit P23 = P2A3;sbit P24 = P2A4;sbit P25 = P2A5;sbit P26 = P2A6;sbit P27 = P2A7;/定义公共变量/UINT8 KServoD=10; /舵机 D 参数UINT8 KServoP5=65,
9、40,10,40,65; /舵机分段 P 参数UINT8 SampleData=0; /采样数据SINT8 Offset=0; /当前赛道位置SINT8 LastOffset2=0; 上一次赛道位置UINT16 SevorPWM=0; /舵机 PWM 高电平时间UINT16 MotorPWM=0; /电机 PWM 高电平时间/* void Init(void) /*初始化函数*/*初始化函数*/TMOD=0 x11; 定时器0, 16位工作方式;定时器1, 16位工作方式TR0=1;/启动定时器0TR1=1;/启动定时器1ET0=1; /打开定时器0中断ET1=1; /打开定时器0中断EA=1
10、;/打开总中断开启中断和定时器/* 数据采样函数 */void Sample(void)SampleData=0;if(P20=0)SampleData|=0 x01;if(P22=0)SampleData|=0 x02;if(P21=0)SampleData|=0 x04;if(P23=0)SampleData|=0 x08;if(P24=0)SampleData|=0 x10;if(P26=0)SampleData|=0 x20;if(P25=0)SampleData|=0 x40;if(P27=0)SampleData|=0 x80;/* *福 电襄 渚冷皆 */确定赛道位置/void
11、ConfirmLocation(void)switch(SampleData) /根据采集到的值进行判断/1000 0000/1000 0000最左边1个光电传感器检测到黑线/1100 0000最左边2个光电传感器检测到黑线/0100 0000依次类推/0110 0000/0010 0000/0011 0000/0001 0000/0001 1000case 0 xc0:Offset=6;break;case 0 x40:Offset=5;break;case 0 x60:Offset=4;break;case 0 x20:Offset=3;break;case 0 x30:Offset=2;
12、break;case 0 x10:Offset=1;break;case 0 x18:Offset=0;break;case 0 x08:Offset=-1;break; /)000 1000case 0 x0c:Offset=-2;break; /)000 1100case 0 x04:Offset=-3;break; /)000 0100case 0 x06:Offset=-4;break; /0000 0110case 0 x02:Offset=-5;break; /0000 0010case 0 x03:Offset=-6;break; /)000 0011case 0 x01:Off
13、set=-7;break; /)000 0001default: Offset=8;break; /其余情况包括跑道丢失于检测错误 /*赛道位置数据滤波(减少某次采样错误对系统的干扰)*/void Filter(void)if (Offset=8) 滤除错误信号,没有检测到黑线(是需要保持上一次测量值的)Offset=LastOffset0;else if(abs(Offset-LastOffset0)5) /滤除尖峰信号Offset=LastOffset0;/* 舵机控制函数 */ void ServoCtrl(void) UINT8 p=0,d=0;SINT16 PID=0;if(Offs
14、et=-7&Offset=-4&Offset=-7&Offset=-4&Offset=-1&Offset=2&Offset=5&OffsetSERVOMOSTLEFT)SevorPWM=SERVOMOSTLEFT;if(SevorPWMSERVOMOSTRIGHT)SevorPWM=SERVOMOSTRIGHT;/PID位置型算式舵机输出量限幅限幅/* 舵机测试函数 */ ServoTest()/ SevorPWM=SERVOMID; 测试舵机中值SevorPWM=SERVOMOSTLEFT; /测试舵机极左值/ SevorPWM=SERVOMOSTRIGHT; /测试舵机极右值 /* 速度控
15、制函数 */void MotorCtrl(void)MotorPWM=3000; /* 数据存储函数 */void SaveData(void)static UINT8 TCnt2=0;if(TCnt2=20)LastOffset1=LastOffset0;TCnt2=0;TCnt2+;LastOffset0=Offset; /* 主函数 */void main(void)Init(); /初始化while (1)Sample(); /采样ConfirmLocation(); 确认黑线位置Filter(); / 滤波ServoCtrl(); /舵机控制/ServoTest(); /舵机测试Mo
16、torCtrl(); / 电机控制SaveData();定 时 器 中 断 函 数/* 舵 机定 时 器 中 断 函 数void TC0Isr(void) interrupt 1static UINT8 TC20msFlag=LOW_LEVEL; /舵机输出状态标志UINT16 LowlvlTime=0;UINT16 HighlvlTime=0;if(TC20msFlag=HIGH_LEVEL)LowlvlTime=65535-(SERVO_PERIOD-SevorPWM);TH0=LowlvlTime/256;TL0=LowlvlTime%256;SevorPort=LOW_LEVEL;TC
17、20msFlag=LOW_LEVEL;elseHighlvlTime=65535-SevorPWM;TH0=HighlvlTime/256;TL0=HighlvlTime%256;SevorPort=HIGH_LEVEL;TC20msFlag=HIGH_LEVEL;电 机 定 时 器电 机 定 时 器*/void TC1Isr(void) interrupt 3static UINT8 TC10msFlag=LOW_LEVEL; 电机输出状态标志UINT16 LowlvlTime=0;UINT16 HighlvlTime=0;if(TC10msFlag=HIGH_LEVEL)LowlvlTim
18、e=65535-(MOTOR_PERIOD-MotorPWM);TH1=LowlvlTime/256;TL1=LowlvlTime%256;MotorPort=LOW_LEVEL;TC10msFlag=LOW_LEVEL;elseHighlvlTime=65535-MotorPWM;TH1=HighlvlTime/256;TL1=HighlvlTime%256;MotorPort=HIGH_LEVEL;TC10msFlag=HIGH_LEVEL;传感器部分相对比较容易,由8个相同的传感器单元构成,每个传感器单元由红外对管和 比较器构成,红外对管使用的是ST178,正向电流最大为50mA,电压最
19、大为6V;比较器 用的是LM324,是一个四比较器集成的芯片;基本原理是利用红外接收管随接受强度不一 样,导通程度不一样,从而使信号输出端的电压不同,与设置的阈值进行比较,得到二值化 的数据。备注:传感器模块中有两个比较器,比较器的参考电压是REF1和REF2, REF1,2是通过配 置上图左边的电阻分压而得,具体取多少,可以根据实验效果得到,上图我们取的阈值电压 是2.5V也就是电源电压的一半,同学们可以通过改变上下两边的电阻调整阈值电压,注意 电阻的单位最好是K欧级,5100K内更换电阻。关于上面的电阻功能及替换介绍,上面的 R1是红外发射端的限流电阻,电阻的大小根据所采用的元件特性决定,我们这次使用的是 ST178,他的电流范围为050mA左右,因此电阻大小在100以上都是可以的,不过建议150 欧以上,另外有的同学买的可能是与ST178兼容的红外对管,这时电阻大小要根据你们使用 的元件选择。图中R6是下拉电阻,使用的原因是我们希望
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届江西省抚州市临川第二中学高三(最后冲刺)化学试卷含解析
- 大班消防安全教案
- 传统文化教育
- 2025届青海省湟川中学高三(最后冲刺)化学试卷含解析
- 河南省南阳市六校2024-2025学年高一下学期(3月)第一次联考生物试卷
- 湖南省湘潭市2025届高三考前热身化学试卷含解析
- 江苏省盐城市盐都区2025年高三第二次调研化学试卷含解析
- 河南省鹤壁市淇县一中2025届高考化学倒计时模拟卷含解析
- 声门下吸引气管导管的护理
- 中医水肿诊断思维
- 2022浪潮英信服务器NF5280M6产品技术白皮书
- 高二下英语单词
- 2024年国家危险化学品经营单位安全生产考试题库(含答案)
- 加油站事故隐患报告和举报奖励制度(3篇)
- 【MOOC】数据库系统(下):管理与技术-哈尔滨工业大学 中国大学慕课MOOC答案
- 肥胖症外科治疗
- 路径规划与导航
- 短暂性脑缺血发作
- 20222023银行招聘考试题库1000题第4372期含答案解析
- 传染病报告卡
- 国画基础知识题库单选题100道及答案解析
评论
0/150
提交评论