全国大学生电子设计竞赛C题Word文档格式.docx
《全国大学生电子设计竞赛C题Word文档格式.docx》由会员分享,可在线阅读,更多相关《全国大学生电子设计竞赛C题Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
【XX组】
1系统方案
本系统主要由电机驱动模块、显示模块、加速度传感器模块,下面详细介绍各模块的选择与特点。
1.1设计要求
1.1.1任务
设计并制作一套简易旋转倒立摆及其控制装置。
旋转倒立摆的结构如图1-1所示。
电动机A固定在支架B上,通过转轴F驱动旋转臂C旋转。
摆杆E通过转轴D固定在旋转臂C的一端,当旋转臂C在电动机A驱动下作往复旋转运动时,带动摆杆E在垂直于旋转臂C的平面作自由旋转。
图1-1旋转倒立摆结构示意图
1.1.2要求
基本要求:
(1)摆杆从处于自然下垂状态(摆角0°
)开始,驱动电机带动旋转臂作往复旋转使摆杆摆动,并尽快使摆角达到或超过-60°
~+60°
;
(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆周运动;
(3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近165°
位置,外力撤除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于5s;
期间旋转臂的转动角度不大于90°
。
发挥部分
(1)从摆杆处于自然下垂状态开始,控制旋转臂作往复旋转运动,尽快使摆杆摆起倒立,保持倒立状态时间不少于10s;
(2)在摆杆保持倒立状态下,施加干扰后摆杆能继续保持倒立或2s内恢复倒立状态;
(3)在摆杆保持倒立状态的前提下,旋转臂作圆周运动,并尽快使单方向转过角度达到或超过360°
(4)其他。
1.1.3说明
1.旋转倒立摆机械部分必须自制,结构要求如下:
硬质摆杆E通过转轴D连接在旋转臂C边缘,且距旋转臂C轴心距离为20cm±
5cm;
摆杆的横截面为圆形或正方形,直径或边长不超过1cm,长度在15cm±
5cm范围内;
允许使用传感器检测摆杆的状态,但不得影响摆杆的转动灵活性;
图1-1中支架B的形状仅作参考,其余未作规定的可自行设计结构;
电动机自行选型。
2.摆杆要能够在垂直平面灵活旋转,检验方法如下:
将摆杆拉起至水平位置后松开,摆杆至少能够自由摆动3个来回。
3.除电动机A之外,装置中不得有其他动力部件。
4.摆杆自然下垂状态是指摆角为0°
位置,见图2。
5.摆杆倒立状态是指摆杆在-165°
至165°
范围内。
6.基本要求
(1)、
(2)中,超过30s视为失败;
发挥部分
(1)超过90s视为失败;
发挥部分(3)超过3分钟即视为失败;
以上各项,完成时间越短越好。
图2.摆杆位置示意图
7.摆杆倒立时施加干扰的方法是,以15cm长细绳栓一只5克砝码,在摆杆上方将砝码拉起15°
~45°
,释放后用砝码沿摆杆摆动的切线方向撞击摆杆上端1~2cm处;
以抗扰动能力强弱判定成绩。
8.测试时,将在摆杆后1~2cm处固定一如图1-2所示轻质量角器,以方便观察摆杆的旋转角度。
图1-2摆杆位置示意图
1.2总体设计方案
1.2.1设计思路
本设计采用单片机STC89C52作为核心控制芯片,通过角度反馈之控制旋转臂的速度及摆角,从而驱动电机做相应的动作,并通过AD采集角度数据实时显示摆杆状态。
1.2.2方案论证与比较
(1)驱动电路的选择
方案一:
双L298n驱动电路。
该电路能驱动直流电机和步进电机,驱动电流最大2A。
方案二:
达林顿反向驱动电路。
该电路只能最大输出500mA的驱动电流。
综合考虑我们选择了L298N作为电机驱动芯片,因为旋转臂高速正反转需大的驱动电流,L298N可以满足系统设计要求。
(2)控制芯片的选择
stc89c51。
该芯片价格便宜,是8位芯片,功耗低,应用非常普遍。
其他芯片,如16位,32位芯片,PIC,AVR,ARM等,功能很强大,单编程较麻烦,且芯片较贵。
由于时间紧迫根据现有条件我们选择较为熟悉的51单片机作为主控芯片即STC89C52。
(3)电机的选择
直流电机。
该电机运转速度快,控制简单。
步进电机。
该电机控制精准,单速度较慢。
由于控制过程的要求,我们综合考虑选用直流减速电机,电机的转速及力矩是重要考虑的参数,最终选用了DC6V300r/min直流减速电机。
2.单元硬件电路设计
2.1单片机控制系统设计
2.1.1STC89C52最小系统
图2-1最小系统原理图
2.1.2AD采集模块电路设计
采用TCL2543作为AD芯片,12位精度可以满足要求,只用其中一位AD输入即可。
图2-2TCL2543引脚图
2.1.3显示模块电路设计
显示模块通过1602液晶显示屏实时显示角度传感器所测的摆杆位置。
2.2加速度传感器的应用
2.2.1MMA7361L原理及应用
MMA7361L是低功耗、低轮廓电容、微机械型加速度计,具有信号调节,一级低通滤波器具有温度补偿,自我测试,0g-Detect检测线性自由落体,
G-Select允许选择两种的敏感度。
零偏移和灵敏度是出厂设置,不需要外部设备。
因此本设计采用MMA7361L作为摆杆状态的测量。
2.3电机驱动模块
2.3.1L298N驱动电路设计
图2-3驱动电路原理图
L298N驱动能力强,驱动电流大,适合带动小型直流电机。
3.程序结构与设计
3.1程序流程图
3.1.1主程序流程图及算法分析
程序核心算法是基于PID的闭环控制,根据加速度传感器检测的摆杆的位置做出想应的电机转速的调整,利用PWM调速原理,根据直流电机输入高低电平的时间比来调节电机的转速,从而摆杆达到预定的状态。
图3-1主程序流程图
3.1.2显示程序设计
图3-2显示模块流程图
4.系统测试
4.1实验摆角测试
通过角度传感器的监测数据记录如下:
试验次数
1
2
3
5
6
7
8
9
10
15
19
24
35
47
56
68
79
14
23
34
46
74
87
90
98
13
36
44
59
72
86
100
4
27
37
39
49
69
78
97
17
40
48
96
横向为每次摆动至最高位置时角度,纵向为试验次数,单位为度。
4.2实验结果分析
通过多次试验分析可知,通过测试确定倒立摆的固有频率,然后调节旋转臂的转动频率和转动幅度来使倒立摆保持一定摆动幅度,由于是惯性摆受外界影响比较大,频率很难达到统一,需通过多次试验得出优良的参数,摆的机械部分对测量结果影响较大。
5.参考文献
[1]谭浩强.C程序设计.北京:
清华大学出版社,1991
[2]郭天祥.51单片机C语言教程.电子工业出版社,2009
[3]黄智伟.全国大学生电子设计竞赛.北京:
北京航空航天大学出版社,2011
#include<
reg52.h>
intrins.h>
#include<
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
/////////////////////
sbitP1_0=P1^0;
sbitP1_1=P1^1;
ucharnum,pwm;
uintw=0;
floatAD[100];
//////////////////
sbitkey1=P1^2;
sbitkey2=P1^3;
sbitRS=P2^5;
//定义端口
sbitRW=P2^6;
sbitEN=P2^7;
sbiteoc=P2^0;
sbitclk=P2^1;
////输入输出时钟
sbitin=P2^2;
//数据输入端
sbitout=P2^3;
//数据输出端
sbitcs=P2^4;
//片选低电平有效
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
#define_Nop()_nop_()//定义空指令
unsignedintReadADC(unsignedcharport);
floatlvbo(void);
voidkey();
/***************延时函数****************/
//延时函数
voidDelayUs2x(unsignedchart)
{
while(--t);
}
voiddelayms(unsignedintxms)
uinti,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
voiddelayus(unsignedintxus)
{
while(--xus)
{
_nop_;
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)//读P0口
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&
0x80);
写入命令函数
voidLCD_Write_Com(unsignedcharcom)
//while(LCD_Check_Busy());
//忙则等待
delayms(5);
RW_CLR;
DataPort=com;
写入数据函数
voidLCD_Write_Data(unsignedcharData)
//while(LCD_Check_Busy());
RS_SET;
DataPort=Data;
清屏函数
voidLCD_Clear(void)
LCD_Write_Com(0x01);
//命令
写入字符串函数
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
if(y==0)//x是列y是行*s是字符串
{
LCD_Write_Com(0x80+x);
//表示第一行命令
}
else
LCD_Write_Com(0xC0+x);
//表示第二行
}
while(*s)
LCD_Write_Data(*s);
s++;
写入字符函数
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
if(y==0)
LCD_Write_Com(0x80+x);
LCD_Write_Data(Data);
初始化函数
voidLCD_Init(void)
{
LCD_Write_Com(0x38);
/*显示模式设置*/
LCD_Write_Com(0x08);
///*显示关闭*/命令
///*显示清屏*/
LCD_Write_Com(0x06);
///*显示光标移动设置*/命令
LCD_Write_Com(0x0C);
///*显示开及光标设置*/命令
/*****************PWM驱动*********************/
voidmoto1()
uinta,high_time,low_time;
uinti,k,m;
k=1;
m=15;
while(m--)
k++;
switch(k)
case2:
a=600;
high_time=20;
low_time=80;
break;
case3:
high_time=35;
low_time=65;
case1:
case4:
high_time=40;
low_time=60;
k=0;
i=a;
while(a--)//正传
{
P1_0=0;
P1_1=1;
delayus(high_time);
P1_1=0;
delayus(low_time);
delayms(8);
a=i;
while(a--)//反转
P1_0=1;
}
voidmoto2()
uinti,k,j,m;
m=30;
case2:
i=a=600;
high_time=42;
low_time=58;
case5:
high_time=44;
low_time=56;
case6:
high_time=46;
low_time=54;
case7:
delayms(10);
i=a=600;
high_time=48;
low_time=52;
case8:
delayms(25);
a=i=590;
high_time=50;
low_time=50;
case9:
i=a=570;
high_time=52;
low_time=48;
case10:
i=a=560;
high_time=55;
low_time=45;
case11:
i=a=550;
high_time=60;
low_time=40;
case12:
delayms(100);
i=a=545;
high_time=64;
low_time=36;
case13:
a=i=540;
high_time=67;
low_time=33;
case14:
i=a=530;
high_time=69;
low_time=31;
case15:
i=a=520;
high_time=72;
low_time=28;
case16:
delayms(80);
a=i=560;
high_time=72;
low_time=25;
case17:
i=a=550;
high_time=73;
low_time=24;
case18:
high_time=74;
low_time=23;
case19:
while
(1){key();
j=a;
while(i--)//反转
d