基于自由摆的平板控制系统.docx
《基于自由摆的平板控制系统.docx》由会员分享,可在线阅读,更多相关《基于自由摆的平板控制系统.docx(23页珍藏版)》请在冰点文库上搜索。
基于自由摆的平板控制系统
2011年全国大学生电子设计竞赛
基于自由摆的平板控制系统(B题)
【本科组】
2011年9月6日
基于自由摆的电机控制系统(B题)
【本科组】
1系统方案
1.1电机的论证与选择
方案一:
直流电机用于调速控制时比较完善,但造价高,结构复杂、换相困难,且不能死锁,用于此控制系统显然不适合。
方案二:
步进电机是专门用于位置和速度精确控制的特定电机。
它的最大特点是其“数字性”,对于控制器发过来的每一个脉冲信号。
本系统是用电机控制旋转一定角度,步进电机只有周期性的误差而无累积误差等特点,使得步进电机在控制系统中运用非常简单。
综合以上两种方案,选择方案二。
1.2传感器的选择
方案一:
用水平传感器检测摆杆转角。
角度传感器是检测物件运动和方向的传感器,它根据物件运动和方向改变输出信号的电压值。
将采集到的电压信号转换成角度信号,就可控制电机以控制平板。
但用水平传感器电路复杂,对输入电压要求严格。
方案二:
用电阻式角度传感器检测摆杆角度。
电阻式角度传感器模拟信号输出,所以用它测角度变化不明显,灵敏度不高。
电压干扰大。
方案三:
用光电编码器检测摆杆转角。
光电编码器是一种通过光电转换将输出轴上的几何位移量转换成脉冲的传感器,检测角度信号时可以直接根据编码器输出脉冲个数得到角度信号,来控制电机步进数。
它的电路简单,不需要在对采集的信号做处理,节省单片机时间。
综合考虑采用方案三。
1.3控制系统的论证与选择
方案一:
用微控制器处理光电编码器输出地角度信号、步进电机步进控制和LCD的显示。
利用51单片机的优点是价格便宜,使用比较方便,缺点是接口少,使用时需扩展,外围电路比较多,运算处理速度不高,功耗高。
方案二:
采用C8501F410单片机达32KB的片内FLASH存储器,两个12位电流输出DAC,有4个通用的16位定时器。
片内有多达24个端口I/O。
运算速度快,功耗低。
综合考虑采用方案二。
2系统理论分析与计算
2.1平板状态测量方法
将光电编码器安装在摆杆固定端检测摆杆旋转角度。
角度变化一度,光电编码器A相输出一个脉冲,B相根据旋转方向不同输出脉冲与A相相位超前或延迟
(具体关系图见附录)。
将输出信号通过I/O口送入单片机。
单片机利用IT01CF寄存器设置外部中断检测端口信号,再判断电机的转向对得到的信号处理后,使平板能够达到所要实现的状态。
2.2系统建模
2.2.1平板保持水平状态的计算
如图2.2.1所示,当轴杆转角为
时,
,
因为
所以
即
图2.2.1轴杆转动
角
2.2.2平板倾斜状态的计算
图2.2.2激光笔打在纸上的转角示意图
发挥部分计算平板转角如图2.2.2所示是
。
因为
(1)
摆杆右测摆动时平板旋转角度为
,左摆时旋转角度为
。
如公式
(1)、
(2)所示。
(2)
2.2.3自由摆周期的计算
根据摆的运动规律,算的摆的周期T为
2.3系统控制方法
系统控制是根据公式
(1)、
(2)中两角之间的关系,根据MATLAB计算得到数据表见附录3。
光电传感器测得度数,单片机判断角度信息设置IT01CF,利用外部中断0,步进电机细分为32,根据电机步进角度和附录中两角关系控制电机步进。
3电路与程序设计
3.1电路设计
3.1.1总体思路
单片机从键盘获取控制信息,通过液晶屏显示实时控制界面。
由光电编码器检测摆杆的摆角信号传送给单片机,单片机将控制信号输出到电机驱动器上,驱动步进电机转动相应的步数使平板达到不同要求所设定的不同状态。
3.1.2系统结构框图
图3.1.1系统总体框图
3.2程序设计
3.2.1程序功能描述与设计思路
单片机选择C8051F410是完全集成的低功耗信号片上系统型MCU。
单片机含高速、流水线结构的8051兼容的微控制器核,外部中断可以直接跟踪。
本系统主要依靠单片机C语言软件编程。
系统主要程序有控制电机使平板随摆杆旋转、在平板中心稳定放置硬币、平板上固定激光笔使光斑投射到靶子上中心线三部分。
系统总体流程图如图3.2.1所示。
图3.2.1系统总流程图
3.2.2主要程序流程图
单片机从键盘获取控制信息,进入不同的功能模块,通过液晶屏显示实时控制界面。
功能一实现平板旋转控制。
摆动摆杆控制平板随摆杆摆动一周期而平板旋转360度,其流程图如图3.2.2所示。
功能二实现在摆杆摆动5个周期中硬币不从平板滑落,其流程图如图3.2.2所示。
功能三实现光斑照射在靶纸中心线上的控制,其流程如图3.2.3所示。
功能四自动检测平板状态并调整,其流程如图3.2.4所示。
在程序控制过程中还要用到角度调整,因为角度测量用到外部中断,不影响正常程序运行。
它的流程图如图3.2.5所示。
图3.2.2功能一流程图图3.2.3功能二程序流程图
图3.2.4功能三流程图图3.2.5功能四流程图图3.2.6角度调整
4测试方案与测试结果
4.1测试方案
1)将软件下载,用手推动摆杆至一个角度
,记录在五个摆动周期内平板随摆杆旋转周数是否达到要求(
角保持不变),测量10次。
2)用手推动摆杆至一个角度
(
在
间),调整平板角度,在平板中心稳定放置一枚1元硬币,启动后放开摆杆让其自由摆动。
测试10次在摆杆摆动过程中硬币能否在5个摆动周期内不从平板上滑落(尽量少滑离平板的中心位置)。
3)用手推动摆杆至一个角度
(
在
间),调整平板角度,在平板中心稳定叠放8枚1元硬币,启动后放开摆杆让其自由摆动。
测试10次在摆杆摆动5个摆动周期内硬币仍在平板上的数目。
4)平板上固定激光笔,用手推动摆杆至一个角度
(
在
间),启动后,系统在15s时间内激光笔照射在靶子上中心线的偏离距离,测量10次。
4.2测试条件
单片机光电电压为9V,电机驱动的参数设定如表4.2.1所示。
表4.2.1步进电机驱动控制器的参数
电压
细分
衰减
电流
测试时应保证未外界干扰(如风、地面平整等能避免的自然条件),准备有硬币,粘着A4靶纸的靶子。
4.3测试结果及分析
4.3.1测试结果
1)平板转动测量结果:
第1次
第2次
第3次
第4次
第5次
第6次
第7次
第8次
第9次
第10次
2)在板中心位置放一枚硬币测试结果:
第1次
第2次
第3次
第4次
第5次
第6次
第7次
第8次
第9次
第10次
成功
成功
成功
成功
成功
成功
成功
成功
成功
成功
3)在板中心位置叠放8枚硬币测试结果:
第1次
第2次
第3次
第4次
第5次
第6次
第7次
第8次
第9次
第10次
枚
枚
枚
枚
枚
枚
枚
枚
枚
枚
4)光斑打在靶子上与中心线偏离距离:
第1次
第2次
第3次
第4次
第5次
第6次
第7次
第8次
第9次
第10次
cm
cm
cm
cm
cm
cm
cm
cm
cm
cm
4.3.2测试分析与结论
根据上述测试数据可以看到本系统完成了,由此可以得出以下结论:
5参考文献
1)郭强.液晶显示应用技术[M].北京:
电子工业出版社2003年第1版
2)郭强.液晶显示应用技术[M].北京:
电子工业出版社2003年第1版
3)王小明.电动机的单片机控制[M].北京:
北京航空航天大学出版社,2002年第1版
4)图尔克(天津)传感器有限公司。
传感器技术产品手册,1997年第1版.
5)王福瑞等编.单片微机测控系统设计大全.北京:
北京航空航天大学出版社,1999年第1版
6)马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计(修订版).北京:
北京航空航天大学出版社,年第1版
附录1:
源程序
控制平板旋转子程序
#include
#include
#include
externvoiddelay(unsignedintm);
externvoidmain_menu();
externvoidkey_up(void);
externunsignedcharread_key(void);
externunsignedintGD_flag,step_rate;
externintdushu;
sbitP0_0=P0^2;//电机方向控制
sbitP0_1=P0^1;//输出脉冲个数
//-------------------------------------------------------------------------
voidproblem1(void)
{
inttemp_angle,sumstep,i;
temp_angle=dushu;
while
(1)
{
delay(20);
if((abs(temp_angle)>abs(dushu))&(dushu>0))
break;
else
temp_angle=dushu;
}
sumstep=360*18-step_rate;
for(i=0;i{
P0_0=0;//inverse
P0_1=1;
delay(200);
P0_1=0;
delay(200);
}
}
在平板中心稳定放置硬币的程序
#include
#include
#include
externunsignedintpulse_mum,finish_flag;
externintdushu,fact_dushu,t_num,curr_num,coin_rate;
//------------------------------------------------------------------------------
externvoiddelay(unsignedintm);
sbitP0_0=P0^2;//电机方向控制
sbitP0_1=P0^1;//输出脉冲个数
voidcoin_1(void)
{
inti,time;
t_num=dushu*coin_rate/10;
time=200;
for(i=1;i{
if(dushu>0)
{
if(abs(t_num)>abs(curr_num))
{
P0_0=0;//inverse反转
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward正转
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
else//dushu>0
{
if(abs(t_num){
P0_0=0;//inverse
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
}
curr_num=t_num;
}
voidcoin_8(void)
{
inttime;
t_num=dushu*coin_rate/10;
time=200;
curr_num=t_num;
}
在平板上固定激光笔光斑投射到靶子中心线上的子程序
#include
#include
#include
externvoiddelay(unsignedintm);
codefloatsinta1[91]={
0.00,1.01,2.02,3.05,4.10,5.15,6.22,7.31,8.41,9.53,10.66,
11.80,12.97,14.15,15.35,16.57,17.81,19.07,20.35,21.66,22.98,24.33,
25.70,27.10,28.52,29.97,31.45,32.95,34.48,36.04,37.63,39.25,40.90,
42.58,44.30,46.05,47.82,49.64,51.48,53.36,55.27,57.21,59.18,61.18,
63.21,65.27,67.36,69.48,71.61,73.77,75.95,78.15,80.36,82.58,84.82,
87.06,89.30,91.55,93.79,96.03,98.26,100.48,102.69,104.88,107.05,109.20,
111.33,113.43,115.51,117.56,119.58,121.57,123.54,125.46,127.36,129.22,131.06,132.86,134.62,
136.36,138.06,139.73,141.37,142.98,144.56,146.11,147.63,149.12,150.58,152.02,153.43,
};
codefloatsinta2[91]={
0.00,0.99,1.98,2.95,3.91,4.86,5.80,6.74,7.66,8.57,9.48,10.38,11.27,
12.15,13.02,13.89,14.75,15.60,16.45,17.29,18.12,18.95,19.78,20.59,21.40,22.21,
23.01,23.81,24.60,25.39,26.17,26.95,27.72,28.49,29.25,30.02,30.77,31.53,32.28,
33.03,33.77,34.51,35.25,35.98,36.71,37.44,38.17,38.89,39.61,40.33,41.04,41.75,
42.46,43.17,43.88,44.58,45.28,45.98,46.68,47.37,48.07,48.76,49.45,50.14,50.82,
51.51,52.19,52.87,53.55,54.23,54.91,55.58,56.26,56.93,57.60,58.27,58.94,59.61,
60.27,60.94,61.60,62.27,62.93,63.59,64.25,64.91,65.57,66.23,66.89,67.54,68.20,
};
externunsignedintpulse_mum,finish_flag;
externintdushu,fact_dushu,t_num,curr_num,laser_rate;
//------------------------------------------------------------------------------
sbitP0_0=P0^2;//电机方向控制
sbitP0_1=P0^1;//输出脉冲个数
voidlaser_focus(void)
{
inti,time,jd_value,jiaodu;
jd_value=dushu;
if((jd_value>0)&(jd_value<90))
{
jiaodu=sinta1[jd_value];
}
elseif((jd_value<0)&(jd_value>-90))
{
jiaodu=-sinta2[abs(jd_value)];
}
else
jiaodu=0;
t_num=jiaodu*laser_rate/10;
time=200;
for(i=1;i{
if(dushu<0)
{
if(abs(t_num)>abs(curr_num))
{
P0_0=0;
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
else//dushu>0
{
if(abs(t_num){
P0_0=0;//inverse
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
}
curr_num=t_num;
}
voidlaser_auto(void)
{
inti,time,jd_value,jiaodu;
jd_value=dushu;
if((jd_value>0)&(jd_value<90))
{
jiaodu=sinta1[jd_value];
}
elseif((jd_value<0)&(jd_value>-90))
{
jiaodu=-sinta2[abs(jd_value)];
}
else
jiaodu=0;
t_num=jiaodu*laser_rate/10;
time=200;
for(i=1;i{
if(dushu<0)
{
if(abs(t_num)>abs(curr_num))
{
P0_0=0;//
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
else
{
if(abs(t_num){
P0_0=0;//inverse
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
else
{
P0_0=1;//forward
P0_1=1;
delay(time);
P0_1=0;
delay(time);
}
}
}
curr_num=t_num;
}
MATLAB程序:
theta=0:
90;
theta=theta.*pi/180;
alfa=theta+atan((2-2*cos(theta))./(3-2*sin(theta)))
theta=-90:
0;
theta=theta.*pi/180;
alfa=-theta-atan((2-2*cos(theta))./(3-2*sin(theta)))
附录2:
电路原理图
附录3:
光电编码器时序图