基于自由摆的平板控制系统ysj资料.docx
《基于自由摆的平板控制系统ysj资料.docx》由会员分享,可在线阅读,更多相关《基于自由摆的平板控制系统ysj资料.docx(21页珍藏版)》请在冰点文库上搜索。
基于自由摆的平板控制系统ysj资料
基于自由摆的平板控制系统
摘要
本系统以由msp430F149单片机作为中心控制系统,由角度监测模块、电机驱动模块、液晶显示模块、键盘模块和电源电路组成。
角度监测模块采用三轴加速度传感器mma7361,实时测量平板与水平面的角度,通过多次采集取平均值的方法基于倾角转换公式将所采样的数据转换成角度反馈给单片机,从而控制步进电机转动相应的角度,使物体能始终保持平衡,并通过液晶实时显示所转过的角度。
电机驱动部分使用SM-202A细分驱动驱动步进电机精确地控制平板转动相应角度。
最后通过传感器采集的角度实时控制电机旋转相应角度以使激光笔始终照射在水平线附近。
本操作简单,控制界面直观、简洁,经检验系统性能指标达到了设计要求,工作可靠,功耗低,具有良好的人机交互性能。
关键词:
平衡控制、msp430单片机、角度传感器、步进电机
一、引言
随着单片机的不断普及,其与传感器的结合也在相关领域应用得越来越广泛,尤其在自动控制领域更是得到了管广泛应用,本系统正是在这样的背景下应用单片机与传感器进行设计制作。
二、系统方案
2.1控制器模块的论证与选择
根据设计要求,控制器主要用于计算平板调整角度、控制电机工作模式、显示摆杆与垂直面夹角及系统完成激光笔照射在中心线上时的声光提示。
方案一:
采用STC89C51作为系统控制器。
它的技术成熟,成本低,引脚较少,硬件布局较简单。
STC89C51为八位单片机,数据转换速度慢,且实时性不好,复杂的控制算法难以实现,不利于高精度的控制。
方案二:
采用TI公司的MSP430f149单片机作为控制器。
MSP430系列单片机是16位、RISC、超低功耗的处理器。
其超低功耗的架构加上灵活的时钟系统可延长电池的使用寿命;处理能力强,运算速度快,其内部集成了12的AD,并采用了DMA模块,因此其数据传输速度快;且成本低。
综合考虑以上两种方案,采用方案二。
2.2度检测模块的论证与选择
角度检测模块检测平板与水平方向的夹角以及检测摆杆与垂直方向的夹角。
方案一:
采用mma7361检测。
mma7361是一款低功耗、低成本、低姿态微型电容式三轴加速度传感器,具有信号调理,温度补偿,自我测试,MMA7361L包括一个休眠模式,可使用电池供电。
方案二:
采用AS5040检测。
AS5040是由AMSCO公司生产的一种非接触、高分辨力编码、在0º~360º范围内进行角度测量的传感器芯片。
但为了测量角度,需要使用两极磁铁,在芯片的中心旋转。
这样使得系统更加复杂,且加大了电机负载。
综合以上两种方案,考虑成本及功耗等因素,选择方案一。
2.3制电机的论证与选择
方案一:
采用减速电机。
减速电机结构紧凑,体积小,承受过载能力强,且能耗低,性能优越,效率高,振动小。
但由于机械效率影响,减速电机输出扭矩的增加和电机功率的增加不成正比,易出现死区现象,不利于控制。
方案二:
使用步进电机。
步进电机的旋转角度正比于脉冲数,精度高且不累计误差,具有较好的位置精度和运动的重复性。
另外步进电机的显著特点就是快速启停能力和转换精度高,正反转控制灵活。
综合以上两种方案,摆杆在运动过程中需要进行实时检测平板和摆杆的位置,且需要系统启停反应快,故选择方案二。
2.4显示模块的论证与选择
方案一:
使用数码管显示。
数码管电压低、寿命长、对外界环境要求低,易于维护,同时它是采用BCD编码显示数字,亮度高。
但是其耗能大,电路复杂,占用资源较多,且显示信息少,精度低。
方案二:
使用液晶屏显示。
LCD具有轻薄短小、低耗电量、影像稳定不闪烁等优势,可视面积大,画面效果好,显示信息量大,分辨率高且抗干扰性强;外围电路少,使用方便。
综合考虑以上两种方案,选择采用方案二。
三、理论分析与设计
3.1摆杆一个周期平板转一周
根据摆杆摆动周期公式
,可近似求出摆杆摆动一个周期所需的时间。
利用所算出的时间控制电机在这一时间段内旋转360°,在允许误差范围内该方案可满足题目要求。
3.2硬币不滑落的建模与计算
图1硬币不滑落时的物理模型
如图1所示,设当摆杆倾角为θ时,平台与水平方向的夹角为α。
对硬币进行受力分析,其合力为自身重力与离心力这两个力的合力。
若硬币不掉,则平台平面与合力方向垂直。
由此可建立平面几何模型,求得α与θ的关系。
具体计算如下:
在△ABC中,利用余弦定理求得
。
其中,
。
再利用正弦定理得
。
由于平台转动
角后水平,所以硬币不滑落的平台旋转角度为
度。
3.3使激光笔始终照射在中心线附近的建模与计算
图2激光照射系统模型
如图2,理论上系统在没有对平板做任何处理时,平板垂直于摆杆,且与水平面成θ角,在基本要求部分中,只要调节平板始终与水平面夹角为0°;要使激光笔能照射中心线,则平板的转动角即
。
在摆杆靠近靶子一侧表达式为:
;在摆杆远离靶子一侧有表达式:
通过该关系表达式可确定平板在不同时刻相对摆杆所需摆过的角度,经过msp430单片机计算控制可使平板上的激光笔始终照射在中心线附近。
四、电路与程序设计
4.1模块设计
4.1.1系统总体框图
系统总体框图如图3:
图3系统总体框图
4.1.2角度检测模块设计
电路如图4所示。
我们选用三轴加速度传感器mma7361测量平板转动角度。
通过使用MSP430内部12位ADC采样X、Y、Z输出的模拟量,并利用三轴建模可以计算出平板的倾角。
图4角度模块电路图
4.1.3电机驱动模块设计
图5电机驱动模块
4.2程序设计
4.2.1程序功能描述与设计思路
本系统主要通过430单片机来控制电路的键盘输入,平板状态控制的算法和显示操作等功能,通过三轴加速度传感器模块检测平板与水平面的夹角。
细分驱动SM202-A驱动步进电机实现平板的旋转。
通过键盘输入系统的工作模式,并通过LCD直观地显示相关参数。
4.2.2程序流程图
图6程序流程图
五、测试方案与测试结果:
5.1测试方案
5.1.1硬件测试
硬件测试时,可先用万用表检测印制板及焊接的质量是否符合要求,有无虚焊及线路间有无短路、断路,检查无误后,可通电检测电源部分是否正常工作。
5.1.2软件仿真测试
软件编译和仿真调试是在IAR编译器下进行,源程序编译及仿真调试应分段或子程序为单位逐个进行,最后结合硬件实时调节。
子程序测试包括:
1)显示程序;2)声光提示程序;3)键盘程序;4)角度传感器模块。
5.1.3硬件软件联调
基本要求的测试
第一次,我们设置平板的摆动为模式1,要求平板能随着摆杆的摆动而旋转3~5周,平板旋转一周偏差不大于45°。
第二次,设置平板的工作为模式2,在平板上粘贴一张画有一组间距为1cm平行线的打印纸,将摆杆从45°处放下,5周期后,控制摆杆缓慢停下,这时硬币滑离平板中心距离0cm。
第三次,让摆杆从60°处放下,5周期后,控制摆杆缓缓停下,此时接触平板的硬币数为1。
5.2测试条件与仪器
1、测试条件:
检查电路板,保证电路无虚焊及线路间无短路、断路。
2、测试仪器如表1:
表1测试仪器
序号
类型
1
直流稳压稳流电源
2
数字万用表
3
量角器
4
卷尺
5
秒表
5.3测试结果及分析
5.3.1测试分析与结论
测试结果如2:
表2摆杆和平板测量
周数木板旋转时间t1摆杆摆动时间t2ΔtΔt/t2
10r18.7s19.2s0.5s2.6%
20r37.9s38.6s0.7s1.8%
30r56.6s57.6s1.0s1.7%
40r76.0s77.4s1.4s1.8%
50r95.2s96.8s1.6s1.6%
60r103.8s105.9s2.1s2%
表2分析:
单摆周期测量值为1.92s,木板旋转周期测量值为1.89s,平板和摆杆同时转动数周后,时间偏差/摆杆摆动时间最大为2.6%。
表3板水平数据测量
角度光斑相对高度木板中心相对高度绝对误差|(h1-h2)/h2|
h1/cmh2/cm
6050.950.00.91.8%
4832.533.1-0.61.8%
3619.619.10.52.6%
248.98.60.33.4%
122.12.2-0.14.5%
00.00.00.00%
122.22.20.00%
表4定点指向
次数静态光斑偏移距离/cm动态光斑偏移距离/cm
11.569.45
21.4512.08
31.438.13
41.5213.74
51.4812.34
平均1.499.69
表3分析:
在平板上安装一支激光笔,在一端竖直放置且与单摆运动面垂直的对照板,作木板上一点(非木板轴中心)高度h1测量用。
同时利用公式1-cosθ算出木板中心的理论高度h2。
比较h1和h2高度,若相等则保持水平。
经测量(h1-h2)/h2最大为4.5%。
表4分析:
因为本实验采用直流电机,所以抖动范围较小,可以实现要求。
通过脉宽调制可以控制光斑寻点的速递和抖动程度,同时在平衡位置时角度变化较大,且支架在控制单摆摆动中稍有形变,亦会对光斑的投射产生影响。
此设计采用角度传感器进行检测,结合430单片机编程,对系统各电路和实际运行的测试,得出上述数据。
根据上述测试数据,由此可以得出以下结论:
系统精度相对来说比较高,误差很小,系统各项功能均达到设计要求;由于增加了LCD显示当前信息,显示清晰醒目,灵活性较大。
综上所述,本设计达到基础部分设计要求。
六、设计总结
本文旨在设计并制作一个基于自由摆的平板控制系统:
以MSP430F149单片机为控制核心,采用角度传感器对单片机的反馈控制,融合数学公式的计算,直流电机的转动,AD采样从而实现相应功能。
由于系统装置在运动过程中存在轻微形变,机械设计存在误差且直流电机和角度传感器然存在一定的精度误差,致使系统在控制平摆转动时存在相应偏差,这些不足将会是我们以后一直前进的方向。
参考文献:
[1]沈建华.MSP430系列16位超低功耗单片机原理与实践.北京航空航天大学出版社,2008.7.
[2]彭军.测量电子电路设计——滤波器篇.科学出版社,2004.05.
[3]罗杰.电子线路设计.电子工业出版社,2008.4.
附:
源程序主函数:
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#include"mcu_init.h"
#include"lcd12864.h"
#include"xifen.c"
unsignedcharx,y;//定义参数位置显示
unsignedintx1,y1,z1,y2;
intdegree;//角度
doublem;//弧度
#include"ADC12.h"
#defineNum_of_Results16//进行32次测量,算平均值
staticuintresults0[Num_of_Results];//A0P6.0保存ADC转换结果的数组
staticuintresults1[Num_of_Results];//A1P6.1保存ADC转换结果的数组
staticuintresults2[Num_of_Results];//A2P6.2保存ADC转换结果的数组
unsignedlongintVBufx=0;//电压扩大1000的值
unsignedlongintVBufy=0;
unsignedlongintVBufz=0;//电压扩大1000的
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
structpoint{
intx0;
inty0;
intd;
intsj;
doublen;
}p,q;
voidsystemtime()
{unsignedchari;
BCSCTL1&=~XT2OFF;//打开XT2振荡器
do
{
IFG1&=~OFIFG;//清除振荡器失效标志
for(i=255;i>0;i--);//延时,等待XT2起振
}
while((IFG1&OFIFG)!
=0);//判断XT2是否起振
BCSCTL2=0x88;}
voidmain(void)
{
Msp430f149_config();//单片机初始化
WDTCTL=WDTPW+WDTHOLD;
systemtime();
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
//P5DIR=0XFF;P5OUT=0XFF;
//P6DIR=0XFF;P6OUT=0XFF;
q.x0=8000;//初始化
q.y0=0;
q.d=0;
q.n=0.0;
q.sj=0;
Ini_Lcd();//初始化液晶
LcdWriteString(1,0,"角度:
");
LcdWriteString(2,0,"X:
V");
LcdWriteString(3,0,"Y:
V");
//LcdWriteString(4,0,"Z:
V");
adc12();//ADC初始化
//dj_1(300);
P1DIR&=~BIT3;
//P1SEL|=BIT0;//中断功能
P1IES|=BIT3;//选择下降沿触发
P1IE|=BIT3;//打开中断允许
P1IFG=0;
P2DIR&=~BIT3;
//P1SEL|=BIT0;//中断功能
P2IES|=BIT3;//选择下降沿触发
P2IE|=BIT3;//打开中断允许
P2IFG=0;
_EINT();
while
(1);//进入低功耗模式、等待中断
}
/*******************************************
函数名称:
ADC12ISR
功能:
ADC中断服务函数,4在这里用多次平均的
计算P6.0口的模拟电压数值
参数:
无
返回值:
无
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticuintindex=0;
results0[index]=ADC12MEM2;//Moveresults
results1[index]=ADC12MEM3;
results2[index]=ADC12MEM4;
index++;
if(index==Num_of_Results)
{
//ADC12IE&=~0x10;
uchari;
unsignedlongsum0=0;
unsignedlongsum1=0;
unsignedlongsum2=0;
index=0;
for(i=0;i{
sum0+=results0[i];
sum1+=results1[i];
sum2+=results2[i];
}
sum0>>=4;//除以16
sum1>>=4;
sum2>>=4;
//if(m<=0)//具体每个不同传感器,需现场测量0°90°-90°电压后写入新值
//{
//degree1=-(((int)(m*180/3.1413926))+180);//显示由弧度转化的角度
//}
//elseif(m>0)//////属于这个范围
//{
//m1=3.1413925-m;
//degree1=((int)(m1*180/3.1413926));
//}
x=2;y=4;
VBufx=Trans_val(sum0);
x=3;y=4;
VBufy=Trans_val(sum1);
x=4;y=4;
VBufz=Trans_val(sum2);
VBufx*=100;//计算电压并扩大10000倍3.3为内部参
VBufy*=100;//计算电压并扩大10000倍3.3为内部参
VBufz*=100;
x1=VBufx-16000;
y1=VBufy-17200;//具体数值现场测量,有变化,角度误差40°以内,误差<1°
y2=abs(y1);
//z1=VBufz-16500;
m=atan2(y2,x1);//g由Yg和Zg合成,所以用反正切函数
degree=(int)(m*180/3.141592);
x=1;y=4;
Trans_valjiaodu(degree);
p.x0=x1;
p.y0=y1;
p.d=degree;
p.n=m;
doublek;
intzj;
if(p.y0>0)//左上
{
if(p.x0{
k=(100*(1-cos(p.n)))/(150+100*sin(p.n));
zj=p.d-((int)(atan(k)*180/3.141592));
p.sj=abs(zj-q.sj);
dj_1(p.sj);
x=4;y=1;
Trans_valjiaodu(p.sj);
q=p;
delay_ms(100);
}
elseif(p.x0>q.x0)//左下
{
k=(100*(1-cos(p.n)))/(150+100*sin(p.n));
zj=p.d-((int)(atan(k)*180/3.141592));
p.sj=abs(zj-q.sj);
dj_0(p.sj);
x=4;y=1;
Trans_valjiaodu(p.sj);
q=p;
delay_ms(100);
}
}
else
{
if(p.x0{
k=(100*(1-cos(p.n)))/(150-100*sin(p.n));
zj=p.d+((int)(atan(k)*180/3.141592));
p.sj=abs(zj-q.sj);
dj_0(p.sj);
x=4;y=1;
Trans_valjiaodu(p.sj);
q=p;
delay_ms(100);
}
elseif(p.x0>q.x0)//右下
{
k=(100*(1-cos(p.n)))/(150-100*sin(p.n));
zj=p.d+((int)(atan(k)*180/3.141592));
p.sj=abs(zj-q.sj);
dj_1(p.sj);
x=4;y=1;
Trans_valjiaodu(p.sj);
q=p;
delay_ms(100);
}
}
//if()
/*if()
doublek,n;
k=(100*(1-cos(m)))/(150+100*sin(m));//wangbinjiang
//k=(100*(1-cos(m)))/(150-100*sin(m));//wangsushe
n=atan(k);
degree2=(int)(n*180/3.1415);
degree=degree1-degree2;
degree4=degree-degree3;
dj_1(degree4);
degree3=degree4;
//degree=degree1+degree2;//wangsushe
//dj_0(degree);//wangsushe
delay_ms(10000);*/
}
}
/*voidport1(){
P1DIR&=~BIT3;
//P1SEL|=BIT0;//中断功能
P1IES|=BIT3;//选择下降沿触发
P1IE|=BIT3;//打开中断允许
P1IFG=0;//P1IES的切换可能使P1IFG置位,需清除
}*/
#pragmavector=PORT1_VECTOR
__interruptvoidPort(void)
{
intjd;
jd=(int)degree;
dj_1(jd);
delay_ms(6000);
P5DIR=0XFF;
P5OUT|=BIT0;
//delay_ms();
dj_0(jd);
P1IE&=~BIT3;
P1IFG=0;
}
#pragmavector=PORT2_VECTOR
__interruptvoidPort2(void)
{
djz();
P2IE&=~BIT3;
P2IFG=0;
}