Donald's BLOG

回忆是一缕淡淡的月光,握紧了便成黑暗

« 校赛作品完成配置Apache+MySQL+PHP »

电子设计大赛校赛报告

一 摘要

本设计采用MC9S12DG128单片机作为智能消防小车的核心。整个系统闭环控制,系统稳定性增强。电机控制模块使用TIP122TIP127功率管设计的电机驱动板,MC9S按预定的运行规则和程序,发PWM控制信号给电机控制芯片,对两电机转速进行调节,从而控制小车的运行和调整。路线检测模块采用单排5个红外发射接收传感器,通过简单的比较算法,调整运行轨迹为直线并计算坐标。用舵机控制光敏二极管电路寻找火源,采用AD采样并比较出火源的方向。在调试的过程中采用串口和车载LCD等友好的人机接口界面,清楚地显示小车运行的各项参数。

本设计方案的主要特色有以下几方面:

MCU的电路简单,并适当扩展出按钮和LCD、蜂鸣器等接口,简化了外围电路的设计,使主控系统较优。

采用了单排5个红外反射式的传感器对场地路线,传感器采用施密勒触发器,能较稳定地分辨出路线。

调试时采用了串口及1602的液晶显示,显示信息丰富,调试方便。

本小车具有两个电机,能实现原地转圈,方便小车坐标的定位。

1.1

整个系统的系统构成如图1.1


二 各模块电路的方案选择和具体设计

2.1中央控制电路的选择

中央控制电路是整个系统的核心,控制器完成两电机控制、场地判断、舵机转动控制和输出等功能。其中对电机和舵机的控制非常重要,将直接导致消防车能否正常寻找火源,灭火并返回原地。通常采用PWM信号来调节电机转速和舵机转角。Freescale公司推出的MC9S12DG128单片机拥有丰富的片上资源:128K Flash存储器,8K RAM 2K EEPROM2SCI模块;1610AD88PWM输出功能,可调整16位精度,等等功能。极大简化了系统电路的设计。

在硬件设计上,采取了模块化的设计思想,整个电路由清华的系统板和自己设计的扩展板构成。清华的系统板囊括了MC9S12DG128单片机系统的必要组成部分,包括时钟电路、锁相环滤波电路、A/D转换器滤波电路、调试用的LED、电源以及各I/O口接口和BDM调试器接口等。扩展板上规划了小车的各个设备的接口电路。

 

单片机端口资源的分配情况如下:

MC9S12DG128单片机有ABEHKJMPST等数字I/O口,还具有两个10位精度A/D输入端口。本作品中用PortS口采集红外发射接收传感器检测送出的数字信号,PortP端口实现对主电机转速和舵机的驱动,PortK口完成对运动方向的控制,PortA用作LCD1602的数据口。

2.2主电机驱动电路的选择和设计

电机驱动电路采用创新院的由TIP122TIP127功率管组成的模块。该模块性能优良,能同时控制两个电机,并能改变电机转动方向。非常适合本次赛题。电路原理图如图2.2

 

 

 

2.2

TIP122TIP127的最大集电极电流可达5A。在本电路中,当M1为低电平时,MCC接入电机1,此时M1D为高电平时,电机正转,当M1D为低电平时,电机反转。电机2同理。

本消防车电机的控制采用PWM控制,可进行电机转速调节。PWM输出接入M1M2口,再用P 控制电机转动方向,即可方便进行控制。

 

2.3

2.3 场地检测传感器的选择和电路设计

场地的检测一般采用红外线反射接收传感器。红外线反射传感器利用物体对红外线的反射程度大小来确定物体颜色的深浅。该传感器由发射管和接收管组成。当发射管发射的红外线射向深色物体时,红外线大部分被深色物体吸收,接收管几乎接收不到红外线,则接收管导通电阻增大;当发射出的红外线射向浅色物体时,红外线被浅色物体漫反射,此时大部分红外线就可以被红外接收管接收,导通电阻减小。

采用红外对管可用AD采集或迟滞比较器。AD采集主要是通过软件实现滤波,准确地检测出场地。但这样加大了程序大小,增加处理时间。而采用迟滞比较设计,则直接输出的是数字开关量,方便对场地进行精准检测,同时也能消除传感器由于检测距离变化或环境干扰而产生的误差。

因此本设计采用CD40106施密勒触发器方案,直接输出数字开关量。

电路如图2.3

2.4 火源检测电路

火源检测电路分为两部分,第一部分为光敏二极管电路,用于检测是否有火源,因为光敏二极管对光亮非常敏感,对着蜡烛时,管电阻可降到非常小。但其缺点是对距离不敏感。在对着火源的同一方向上,离得远时(12之间)所测得的值与不到10厘米所测得的值相差不大。

第二部分是红外接收管电路。红外接收管对距离较为敏感。当距离为10厘米左右时,电阻就有较大变化,这样就可以决策是否可以开始开启风扇了。

2.4

电路如图2.4

 

 

 

 

2.5 舵机光耦隔离电路

2.5


 


通过PC817光电耦合器,用5V的信号控制工作在7.2V的舵机。虽然通过示波器观测到耦合后的PWM信号有点失真,即不是理想的方波,但经过测试,发现并不影响舵机的响应。如图2.5

2.6 风扇继电器电路


如图2.6。输入端INPUT通过功率三极管Q1控制继电器导通。D1为保护二极管,吸收掉继电器断电时产生的较大感生电流。

2.6

 


2.7 系统供电设计

由于消防小车的动力主要来源于电池,必须采用集中供电的办法,而控制板、舵机和主电机的供电又不能采用同一电压值的电源,因此必须设计合理的电源电路,为系统各模块供电。

电源的选择可以是开关电源,或是线性稳压电源。开关电源使用功率开关芯片,以100KHz以上的开关频率进行DC-DC变换,消耗功率小,电压稳定,缺点是PCB设计要求较高,滤波部分要求较高。线性直流稳压电源非常常用,主要缺点是功耗较大。本设计只采用7805线性稳压电源芯片。


电源电路如图2.7

2.7

 


2.7.1 主控制板的供电

MCU板的电流需求较小,且清华的开发板已经有免短路和过压保护,所以直接从+5V电源取电。板上还引出了若干路电源,供电流不大的外围电路取电。例如本设计就提供给火源检测电路红外传感器和光敏二极管传感器的电源。

2.7.2 场地检测电路的供电

火源检测电路的电流不大,供电较灵活,可以从MCU板上取电。而为了提高场地检测传感器的灵敏度和抗干扰能力,增大了红外发射管的发射功率,这样电流就大大增加,所以传感器电路不从MCU板取电而直接从+5V电源取电,以避免电流大时主控板保护电路误动作,造成系统不稳定。

2.7.3 电机的供电

为了使电机达到理想的转速,获得理想的转矩,电机直接从+7.2V电池取电。因为主电机驱动芯片中已经集成了电机电源和逻辑电源的隔离电路,因此电机转动时对其它电源的干扰大大降低了。

2.7.4 舵机的供电

舵机的电源电压范围较大,影响的只是响应速度。开始时采用5V供电,由于舵机转动时电流较大,影响到了MCU控制板的稳定,因此,采用了光耦隔离电路,这样舵机可直接从电池取电。加强了系统稳定性。

 

2.8 人机接口模块的设计

为了能方便地调试消防小车的各项参数,在小车上装了LCD1602模块且利用串口编写了简单的调试指令。调试的过程中,可以显示主要参数,监控小车的运行。

2.8.1 LCD1602模块

LCD1602模块的数据口用了PortA口,并通过PortE.2控制数据指令端,PortH.0控制读写端,PortH.2控制LCD使能端。电路如图2.8

2.8


 


2.8.2 串行口模块

清华的飞思卡尔开发板已经引出了SCI0串口。通过在程序中编写串口中断响应函数,响应从上位机超级终端发来的ASCII码,并作相应的输出回应。

串口配置如下:

  SCI0BDH = 0;        // 内部总线 = 8M, SCI 波特率 9600

  SCI0BDL = 0x34;     // SCI 波特率= SCI 模块时钟 / (16 * BR)

  SCI0CR1_PE = 0;     // 禁用奇偶校验

  SCI0CR2_TE = 1;     // 发送使能

  SCI0CR2_RE = 1;     // 接收使能

  SCI0CR2_RIE = 1;    // 接收中断使能

 

三 控制的程序设计

3.1 驱动层程序设计

3.1.1.系统时钟设置

考虑到消防小车的运行速度较慢,为了降低损耗,系统时钟只使用16MHz的外部晶体振荡器的时钟。这样,总线频率即为8M

3.1.2. 主电机和舵机驱动

考虑舵机对PWM信号的要求较高,为了提高精度,将MCU其中PWM6PWM7两路88位的PWM输出调整为一路16位的PWM输出。

电机驱动采用PWM输出控制,利用MC9S12DG128PWM0PWM1输出,将调制信号送到电机驱动板的M1M2信号输入端,通过调整占空比调整电机转速。电机运动方向的控制则通过PortK的第0和第1端口控制。

舵机的控制同样采用PWM输出控制,舵机的转角是通过调整高电平的宽度来控制的。根据要求,HS-925型舵机的PWM周期为18ms~20ms,两侧的极限位置的高电平宽度为1ms2ms

舵机PWM的设置如下:

PWMCTL = 0X80;      // 使用PWM6PWM7

PWMPRCLK = 0X30;    // B = bus / 8 = (8M) / 8 = 1MHz

PWMSCLB = 5;        // SB = B / (2 * PWMSCLB) = 100 kHz,周期是10us

PWMCLK_PCLK7 = 1;   // 16PWM67时钟源是SB

PWMPOL = 0X80;

PWMDTY6 = 0X00;

PWMDTY7 = 0X98;     // PWM高电平时间是1520us,舵机0

PWMPER6 = 0X07;     // 周期T20000us (20ms)

其中一路电机PWM的设置如下,另一路类似:

PTP = 0xFF;         // PortP但禁用PWM时输出为高。电机不转。

PWMPRCLK = 0x06;    // A = bus / 64 = 8M / 64 = 125kHz

PWMSCLA = 10;       // Clock SA = 1000Hz

PWMCLK_PCLK0 = 1;   // 通道0的时钟源是SA

PWMPOL |= 0x01;

PWMDTY0 = 180;

PWMPER0 = 255;      // 电机PWM周期T40ms

 

3.1.3 火源检测数据的采集和处理

火源检测一共用了三个8AD通道。AD0为光敏二极管通道,AD1AD2为红外接收管通道。通过三个通道数据的分析比较,能较为准确地发现火源并检测出火源的距离,当达到一定的灭火距离时开始灭火。

具体的设置如下:

  ATD0CTL2 = 0xC0;      // AD 自动标志清零,无中断

  ATD0CTL3 = 0x20;      // 使用AD0 - AD5

  ATD0CTL4 = 0x83;      // bus clock / (2 * (PRS + 1)), 8

  ATD0CTL5 = 0xB0;      // 右对齐,多路

  ATD0DIEN = 0x00;      // 数字使能关

3.1.4 场地检测及其它设置

场地检测共用了5个红外对管。数字输入量占用PortP口。

DDRS = 0x00;  // PortS作为输入,数字开关量

风扇的控制使用PortT的第三个端口

DDRT = 0xFF;  // 设置PortT为输出模式

PTT = 0xFF;        // 初始为关。

3.2 决策层程序算法设计

主程序流程框图,如图3.1

程序开始时处于一个等待状态,当按下开始键时,消防小车开始寻找转动传感器寻找蜡烛,发现时一步一步接近它,当距离合适时灭火,再判断灭火的个数是否达到2个,如果是则完成任务,回到原点。

寻找并接近火源程序流程图,如图3.2

这部分程序是重点。开始时转动传感器,当发现火源时,判断距离是否合适,合适时退出,接下来会调用灭火程序。如果距离不合适,走一步,再次探测火源。当舵机停住时发现不了火源时,转动10度,再次AD采集数据,分析是否为火源。如此直到距离合适为止。

3.1

3.2

四 调试说明

以下的几个问题是调试中遇到的难点:

4.1 硬件电路设计调试

对于场地检测电路,红外对管传感器容易受外界干扰。开始时,本设计只用了三个红外传感器,但其中一个的变化极为迟钝。更换红外对管和增加发射功率都无法解决问题。最后换为采用施密勒触发器的比较电路,并使用了五路,解决了此问题。

舵机在开始时是个较大的问题,因为耗电量较大,当它和MCU用同一路电源时,极易使MCU复位。通过光耦隔离电路,才把这个问题解决。

风扇由于转速较小,在接到电池电压的条件下,无法将蜡烛吹灭,固多串了两节五号电池,以增加其电压,增大转速,达到灭火目的。

4.2 程序及算法的测试

本环节是最困难的阶段。程序及算法是消防小车的灵魂,也是最难调试的部分。

在实际的调试中,运用了几种调试方法。首先是BDM调试,由于BDM提供了许多调试命令,能够方便地进行单步、连续、设断点等调试手段,还能实时查看寄存器变量,内存变量,所以它是调试的主要方法。第二,由于清华的飞思卡尔开发板上已经将串口引出,通过PC机上的超级终端和已经编写好的简单SCI中断程序,就能方便地通过串口给小车发送包括前进、后退、转弯、查找火源等命令,使调试更有效率。第三,就是通过引出的LCD,在与BDM和串口断开时,及时显示出简单的参数,达到及时发现问题目的。

算法的测试中,经常发生写程序出错的毛病。也有不少是算法上的问题。在考虑找火算法上,由于传感器采回来的值极易受环境和高度变化的影响,经常发生火源就在小车眼前而小车视而不见的情况。在多次调整后,才找到了较为合适的参数。小车的运动也是相当关键的一环。小车的运动是靠两个直流电机带动。两个电机性能不一,因此不能给同一个PWM脉冲值,且要时刻调整两个电机的转速以达到走直线的目的。总之,经过一次一次的讨论和修改,才使程序日趋完善。

五 测试数据

光敏二极管和红外接收管测试时,按距离不同,但高度平行。其中AD0为光敏二极管,AD1为上红外接收管,AD2为下红外接收管。测得数据如下。

5.1 与火源0度角不同距离AD量化值(8位精度)