电子设计方案大赛设计方案报告.docx
《电子设计方案大赛设计方案报告.docx》由会员分享,可在线阅读,更多相关《电子设计方案大赛设计方案报告.docx(24页珍藏版)》请在冰豆网上搜索。
电子设计方案大赛设计方案报告
2012年福建省大学生电子设计竞赛
指导教师:
林惠君
吴建宁
连桂仁
姓名
学院
专业
年级
联系方式
陈建平
数学与计算机科学学院
电子信息科学与技术
10
黄健
数学与计算机科学学院
电子信息科学与技术
10
黄志鹏
数学与计算机科学学院
电子信息科学与技术
10
自平衡小车系统
摘要
我们采用模块化设计的方法,设计了一款基于STC12C5A60S2单片机的自平衡小车系统,实现了题目中的基本要求和发挥部分的全部内容。
本系统基于STC12C5A60S2单片机为核心处理器,用软件实现直流电机PWM调速,为了实现控制小车直立行走,我们对小车的平衡控制和速度控制进行了建模分析,设计出一套合理的控制方案。
本系统设计了相关的硬件电路和相关应用程序,硬件电路主要包括STC12C5A60S2单片机最小系统、循迹探测模块、速度检测模块、倾角检测模块、转向角速度检测模块、电机驱动模块等单元电路模块;系统程序主要包括循迹探测程序、直立运行程序、PWM调速程序等。
关键词:
STC12C5A60S2单片机循迹PWM调速平衡
1.系统方案的比较与选择
根据设计要求,可以有多种方法来实现系统的功能。
我们采用模块化思想,从各个单元电路选择入手进行整体方案的论证、比较与选择。
1.1控制器方案的比较与选择
方案一:
采用FPGA或CPLD作为系统的控制器,可以实现复杂逻辑功能,规模大,速度快,密度高,体积小,稳定性高,容易实现仿真、调试和功能扩展。
但成本高,引脚多,PCB布线复杂。
方案二:
采用增强型51系列STC12C5A60S2单片机,运算速度快,软件编程灵活,自由度大,技术成熟,体积小,成本低,容易实现仿真、调试和功能扩展。
方案三:
采用嵌入式处理器(ARM),运算功能强大,速度较快,编程灵活,自由度大,外围器件少,成本适中,容易实现仿真、调试和功能扩展。
但PCB设计及焊接技术要求高。
综合考虑系统设计的需要,我们选择了方案二。
1.2循迹探测方案的比较与选择
方案一:
采用热探测器,电路简单,但易受外界干扰,不灵敏。
方案二:
采用简易光电传感器结合外围电路探测,但实际效果并不理想,对行驶过程中的稳定性要求很高,且误测几率较大,易受光线环境和路面介质影响。
在使用过程极易出现问题,而且容易因为该部件造成整个系统的不稳定。
方案三:
采用两个五路循迹BFD-1000模块,分别应用于小车水平运行循迹和直立运行循迹。
BFD-1000专门设计用作黑(白)线检测的传感器,特别适合复杂黑白线、交叉黑白线的检测,它有六路高灵敏度的红外传感器(5路巡线、1路蔽障),能够对黑白线准确的识别。
应用此模块方便简单,抗干扰能力强。
综合考虑系统设计的需要,我们选择了方案三。
1.3电机驱动方案的比较与选择
方案一:
采用继电器,电路简单可靠,但不容易实现精细控制。
方案二:
采用分立元件构成电机驱动电路的方法,结构简单,价格低廉,在实际应用中应用广泛,但是这种电路工作性能不够稳定。
方案三:
采用专用芯片L298N作为电机驱动芯片,L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
综合考虑系统设计的需要,我们选择了方案三。
2.理论分析与计算
为了实现控制小车直立行走,我们假设小车直立、运行的动力均来自两个驱动轮,且由两个直流电机来驱动后轮转动。
因此,小车整体作为一个控制对象,它的输入量是两个直流电机的转动速度。
我们认为,小车直立行走控制任务可以分解为平衡控制和速度控制两个基本控制模块,以下分别对这两个控制模块进行建模分析与计算。
2.1小车平衡控制的建模分析与计算
小车直立平衡控制是通过负反馈来实现的,系统可以类比为一个倒立的单摆模型,由于小车只有两个驱动轮着地,因此车体会在轮子滚动的方向上发生倾斜。
保持车体平衡的方法就是控制轮子转动,抵消其在这个维度上倾斜的趋势。
下面,我们对小车进行数学建模,建立速度的比例微分负反馈控制,根据基本控制理论讨论小车通过闭环控制保持稳定的条件。
我们把小车简化为高度为
,质量为
的简单倒立摆,它放置在可以左右移动的车轮上。
假设外力干扰引起小车产生角加速度
,沿着垂直于小车地盘方向进行受力分析,如下图2-1所示。
图2-1小车运动模型受力分析图
由上图2-1我们推导出小车倾角与车轮运动加速度
以及外力干扰加速度
之
间的运动方程:
(2.1-1)
在角度
很小时,
,运动方程简化为:
(2.1-2)
小车静止时,
(2.1-3)
对应小车静止时,系统的输入输出的传递函数为:
(2.1-4)
此时系统具有两个极点
,一个极点位于
平面的右半开面,小车不稳定。
通过对系统的拉氏分析,我们可以知道当小车静止时,此时系统的一个极点位于
平面的右半平面,小车不稳定。
因此我们引入比例、微分反馈控制(在角度控制中,与角度成比例的控制量称为比例控制,与角速度成比例的控制量称为微分控制,其中角速度是角度的微分)之后的系统框图如下图2-2所示,其中
。
图2-2加入比例微分反馈控制后的系统框图
系统的传递函数为:
(2.1-5)
此时,系统的两个极点位于:
(2.1-6)
若使系统稳定,则需两个极点都位于
平面的左半平面,此时要满足
,由此,我们得出结论,当
时,直立小车可以达到稳定。
因此,我们总结出小车直立稳定的条件是:
1.能够准确测得小车倾角
的大小和角速度
的大小;
2.可以控制车轮的加速度。
2.2小车速度控制的建模分析与计算
对于小车直立运行速度的控制相对于普通小车的速度控制则比较复杂,由于在速度控制过程中需要始终保持小车的平衡,因此小车速度控制不能够直接通过改变电机转速来实现。
经过深入思考,我们认为具体需要解决以下三个问题:
1.如何测量小车速度?
2.如何通过小车直立控制算法实现小车倾斜角度的改变?
3.如何依据速度误差控制小车倾斜角度?
第一个问题可由安装在电机输出轴上的光码盘来测量,利用主控单片机的计数器来测量在固定时间间隔内速度脉冲信号的个数来反映出电机的转速,从而得到小车的运行速度。
第二个问题可由倾角控制中的给定值来解决,假如给定了小车平衡控制的设定值,在直立控制调解下,车体将会自动维持在一个角度。
由分析得知,车体倾角最终是跟踪重力加速度Z轴的角度,则将小车的倾角给定值与重力加速度Z轴角度相减,就可以最终决定车体的倾斜角度。
分析第三个问题时,由于在直立平衡控制下小车速度与车体倾角之间传递函数是一个非最小相位系统,反馈控制下容易造成系统的不稳定,在此,作出如下假设:
1.小车角度在直立控制下简化成一个一阶过渡过程。
2.车体倾角是由车轮运动所产生,因此车轮速度是倾斜角度变量积分再乘以车体长度。
3.忽略车体倾斜引起车轮加速度,因为这个假设仅对控制刚开始的短暂过渡阶段而言,此时车体倾斜还比较小,引起的速度变化不大。
4.系统只进行速度比例负反馈。
进行了假设之后,就可以通过程序方法实现了,具体方式是编写程序时改变控制周期、减小控制参数、进行信号平滑滤波等。
为了提高速度控制的稳定性,还必须在反馈控制里加上微分控制,但由于信号中存在着噪音,增加微分控制后会加大噪声对速度控制信号的影响,为解决这一点,可以加进积分控制,将微分控制和积分控制环节合并,形成一个比例控制环节。
这样可以保持系统控制传递函数不变,同时避免了复杂的微分计算。
速度控制的原理框图如下图2-3所示。
图2-3速度控制的原理框图
3.系统的硬件设计
3.1系统的总体设计
本系统的硬件电路设计,首先要分析整个系统的输入信号和输出信号,其次是选择合适的微处理器,由微处理器提供的资源,逐步设计各个电路子模块,最终形成整个的控制电路。
经分析,我们知道整个控制系统的输入输出应该包括:
1.AD转换接口(5路)
1 陀螺仪:
两路,分别检测车体的倾斜角速度和转动角速度;
2 加速度计:
一路,检测Z轴方向上的输出电压;
3 调试辅助:
两路,用于调试电路参数的接口。
2.PWM接口(2路或4路)
控制左右两个电极双方向运行,若采用单极性PWM驱动,则需要四路PWM接口;
若采用双极性PWM驱动,则可以使用两路。
3.定时器接口(2路)
需要两个定时器脉冲输入端口来测量左右两个电机的转动速度。
4.通讯接口(备用)
1 SCI(UART):
一路,用于程序下载和调试接口;
2 I2C:
(备用)可以直接读取加速度值。
5.IO接口(备用)
输入输出接口用于小车的倾斜角度、运行速度的显示,功能设置等。
明确了整个系统的输入输出接口后,我们最终选择了STC12C5A60S2单片机作为本系统的微处理器,STC12C5A60S2单片机能够满足上述分析的所有控制要求。
本系统的硬
件总体框图如下图3-1所示。
图3-1本系统的硬件总体框图
3.2单元电路的设计
本系统以STC12C5A60S2单片机为核心处理器,在其最小系统外围设计了循迹探测模块、速度检测模块、倾角检测模块、转向角速度检测模块、电机驱动模块等单元电路。
3.21单片机最小系统设计
微处理器选择STC12C5A60S2单片机,它功耗低,运算速度快,具有丰富的外设模
块,非常适合控制小车运行,其主要性能指标如下:
(1)高速:
1个时钟/机器周期,增强型8051内核,速度比普通8051快8~12倍
(2)工作频率:
0~35MHz,相当于普通8051:
0~420MHz
(3)8通道,10位高速ADC,速度可达25万次/秒,2路PWM还可当2路D/A使用
(4)通道捕获/比较单元(PWM/PCA/CCP),也可用来再实现2个定时器或2个外部中
断(支持上升沿/下降沿中断)
(5)4个16位定时器,兼容普通8051的定时器T0/T1,2路PCA实现2个定时器
(6)芯片内EEPROM功能,擦写次数10万次以上
(7)高速SPI串行通信端口
如下图3-2所示为STC12C5A60S2单片机最小系统电路图,其中包括MCU、晶振电路
和复位电路。
图3-2STC12C5A60S2单片机最小系统电路图
3.22电机驱动模块设计
本电机驱动模块设计采用专用集成芯片L298N作为电机驱动芯片。
L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
本电机驱动模块的电路图如下图3-3所示。
图3-3电机驱动模块的电路图
3.23循迹探测模块设计
本循迹探测模块设计采用两个五路循迹BFD-1000模块,分别应用于小车水平运行循迹和直立运行循迹。
BFD-1000专门设计用作黑(白)线检测的传感器,特别适合复杂黑白线、交叉黑白线的检测,它有六路高灵敏度的红外传感器(5路巡线、1路蔽障),能够对黑白线准确的识别。
3.24速度检测模块设计
本速度检测模块设计采用速度传感器,即固定在电机输出轴上的光码盘以及相互配合的光电管器件,如下图3-4所示为本模块的电路图。
光电管器件直接输出数字脉冲信号,即可以直接将这些脉冲信号连接到单片机的计数器端口就可测得小车运行速度。
每个光电管输出两个脉冲信号,它们波形相同,只是相位相差90度。
如果电机正转,第二个脉冲落后90度;如果电机反转,第二个脉冲超前90度。
由此,我们可以通过这个关系判断电机是否正反转。
在实际电路中,我们只需检测了一路脉冲信号,通过它的频率测量得到电机的转速。
电机的转向则是通过施加在电机上的电压正负进行判断的。
图3-4速度检测模块的电路图
3.25倾角检测模块设计
本倾角检测模块设计采用的是加速度传感器MMA7361和村田公司的ENC-03系列的陀螺仪进行测量,测得的是倾角速度和重力加速度,分别进行积分和微分就可以得到角度和角速度。
由于此加速度传感器的输出信号很大,不需要进行放大,所以本模块只需要对陀螺仪信号进行放大滤波。
本倾角检测模块的电路图如下图3-5所示。
图3-5倾角检测模块的电路图
上图3-5中,经分析可以看出,将陀螺仪的输出信号放大了10倍左右,并将零点偏置电压调整到工作电源的一半(1.65V)左右。
放大倍数需要根据选取的传感器输出灵敏度设计,可以选择5至10倍范围都可以满足车模控制需要。
上图3-5电路只是将传感器的信号进行了放大处理,角度和角加速度的计算都要依靠单片机的软件来完成。
3.26转向角速度检测模块设计
参与控制小车转向的陀螺仪的电路和上图3-5中的倾角检测电路中陀螺仪的电路是一样的。
只是在安装转向陀螺的时候,将该陀螺垂直安装,由此可以测量小车的转向角速度。
故本转向角速度检测模块的设计电路图也如上图3-5所示。
3.27电源模块设计
本电源模块设计采用4节1.5V的干电池供电,并且电源通过7805稳压块稳压,470uF和104电容进行滤波。
本电源模块的电路图如下图3-6所示。
图3-6电源模块的电路图
4.系统软件设计
本系统为了实现小车水平运行和直立运行都可以按轨道行驶,设计了与硬件电路相适应的软件程序。
该系统软件程序主要包括循迹探测程序、直立运行程序、PWM调速程序等。
4.1循迹探测程序流程图
开始
是否有信号?
中间传感器
是否有信号?
右侧传感器
直线行走
是
否
直线行走
小车左转弯
小车右转弯
是
是
是否有信号?
左侧传感器
否
否
图4-1循迹探测程序流程图
4.2直立运行程序流程图
图4-2直立运行程序流程图
4.3PWM调速程序流程图
图4-3PWM调速程序流程图
5.系统测试方案与测试结果
5.1测试仪器
秒表、电池、轨道
5.2测试方案
分两次将小车水平分别放置于F、A之间和C、D之间,打开电源,开始计时,观察小车行驶路线,记录A、B点间加速区行驶时间,B、C点间减速区行驶时间及行驶一周的时间;
分两次将小车直立分别放置于F、A之间和C、D之间,打开电源,开始计时,观察小车行驶路线,记录A、B点间加速区行驶时间,B、C点间减速区行驶时间及行驶一周的时间。
5.3测试结果
小车水平行驶测试结果
位置
能否成功运行一周
加速区行驶时间
减速区行驶时间
加速区与减速区行驶时间之比
行驶一周的时间
F、A之间
能
2s
4s
1:
2
32秒
C、D之间
能
2s
5s
2:
5
34秒
小车直立行驶测试结果
位置
能否成功运行一周
加速区行驶时间
减速区行驶时间
加速区与减速区行驶时间之比
行驶一周的时间
F、A之间
不能
C、D之间
不能
5.4测试结果分析
小车在三轮着地情况下进行循迹测试时,能稳定地在规定时间内行驶完整个赛道,并且在加速区和减速区小车速度有明显变化,所用时间之比大约为1:
2。
6.参考文献
【1】《51单片机C语言常用模块与综合系统设计实例精讲》,于永等著,北京:
电子工业出版社,2008.10
【2】《全国大学生电子设计竞赛——单片机应用技能精解》,蓝和慧等著,北京:
电子工业出版社,2009.4
【3】《全国大学生电子设计竞赛——系统设计》,黄智伟编著,北京:
北京航空航天大学出版社,2006.12
【4】《全国大学生电子设计竞赛--制作实训》,黄智伟编著,北京:
北京航空航天大学出版社,2011.1
【5】《模拟电子技术基础》,童诗白,华成英著,北京:
高等教育出版社,2000.
【6】《数字电子技术基础》,阎石著,北京:
高等教育出版社,2005.
7.附录
附录1:
主要原器件清单
名称
型号
MCU
STC12C5A60S2
陀螺仪
ENC-03MB
加速度计
MMA7361
电机驱动芯片
L298N
循迹模块
BFD-1000
芯片
AS1117-3.3
电阻
102
电容
104
光码盘
电机
附录2:
部分程序代码
#include
#defineuintunsignedint
#defineucharunsignedchar
//#include
//#defineuintunsignedint
//#defineucharunsignedchar
uchari=0,j=0,k,temp;
sbitP10=P1^4;//循迹传感器最左有测得信号低电平有效
sbitP11=P1^3;//循迹传感器次左有测得信号
sbitP12=P1^2;//循迹传感器中有测得信号
sbitP13=P1^1;//循迹传感器次右有测得信号
sbitP14=P1^0;//循迹传感器最右有测得信号
sbitP23=P2^0;//单片机输出到L298N控制电机左后退
sbitP24=P2^1;//单片机输出到L298N控制电机左前进
sbitP25=P2^2;//单片机输出到L298N控制电机右后退
sbitP26=P2^3;//单片机输出到L298N控制电机右前进
voidDelay(uinti)
{
while(i--);
}
voidinit()
{TMOD=0x01;
TH0=(65536-40000)/256;//1ms
TL0=(65536-40000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidzuo()//左走
{P25=1;
P26=0;
P23=1;
P24=1;
}
voidyou()//右走
{P23=1;
P24=0;
P25=1;
P26=1;
}
voidzhi()//直走
{P23=1;
P24=0;
P25=1;
P26=0;
}
voidting()//停止
{P23=1;
P24=1;
P25=1;
P26=1;
}
voidmain()
{init();
while
(1)
{};
}
voidtime0()interrupt1
{TH0=(65536-40000)/256;//1ms
TL0=(65536-40000)%256;
temp=(P1|0xe0);//停僻高三位
if(P12==0)
{
k==4;j=0;i=0;zhi();
}
else
switch(temp)
{case0xf7:
i=1;j=0;you();break;
case0xef:
i=2;j=0;you();break;
case0xe7:
k==3;i=0;j=0;zhi();break;
//case0xe3:
i=4;j=0;you();break;
case0xf3:
i=5;j=0;you();break;
case0xfe:
j=1;i=0;zuo();break;
case0xfc:
j=2;i=0;zuo();break;
//case0xf8:
j=3;i=0;zuo();break;
case0xf9:
j=4;i=0;zuo();break;
//case0xfd:
j=5;i=0;zuo();break;
case0xfb:
k=1;j=0;i=0;zhi();break;
case0xf1:
k=2;j=0;i=0;zhi();break;
case0xe3:
k=5;j=0;i=0;zhi();break;
case0xe8:
k=6;j=0;i=0;zhi();break;
case0xfd:
k=7;j=0;i=0;zhi();break;
case0xe0:
ting();break;
case0xff:
if(i==1||i==2||i==3||i==4||i==5){i=0;you();}
if(j==1||j==2||j==3||j==4||j==5){j=0;zuo();}
if(k==1||k==2||k==3||k==4||k==5||k==6||k==7){k=0;zhi();}break;
default:
break;
}
}