基于自由摆得平板控制系统文档格式.docx
《基于自由摆得平板控制系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于自由摆得平板控制系统文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![基于自由摆得平板控制系统文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/26/38382d13-7210-4612-9a62-3777b527a57a/38382d13-7210-4612-9a62-3777b527a57a1.gif)
1.2角度检测电路的论证选择
采用磁敏倾角传感元件,产品具有分辨率高,0°
~360°
测量范围温度稳定性好,。
但磁敏式倾角传感器必须安装在转轴处,安装不便。
采用单轴倾角传感器SCA60C。
该集成芯片为专用的水平倾角测量芯片,其体积小,灵敏度高,简单、可靠的工作性能等优点,可靠度满足该题对平衡度角的精确要求。
其测量范围为1g(-90°
~+90°
),能耗低,精度高等特点,并且其外围电路十分简单。
综上所述,采用方案二。
1.3驱动电动机的论证选择
采用H型PWM驱动电路驱动直流电机,改变电压极性实现正反转,PWM占空比控制转速,由于电压难达到很高的精度,其转速也达不到本系统的精度。
采用高速步进电动机控制平板,它不仅具有普通步进电动机的优良性能,快速起停,停位准确,转换精度高,正反控制灵活,适合平衡状态及角度检测,而且还克制了普通步进电动机速度限制的缺点。
因此我们采用方案二。
1.4系统结构
根据设计目的,再经过各模块方案的分析论证,确定了系统各模块的最终方案。
其系统整体方框图如图1.1所示:
图1.1系统框图
二、理论分析与计算
2.1平板状态测量方法
本系统是利用步进电机控制平板状态,使其保持一定的平稳度,这样放在上面的硬币就不会滑落。
设计采用倾角式角度传感器对平板状态进行测量和控制,将角度传感器分别安装在平板和自由摆上。
自由摆在摆动的过程中,会通过角度传感器反馈回平板偏离水平面的角度,偏转角度的通过SCA60C转换为模拟信号,再结合模数转换器即可将角偏信号转换为单片机可识别的数字信号。
角度传感器把角度信号输给单片机,经过单片机的内部运算将数据送于LCD电路,显示平板的偏移角度。
2.3建模与控制方法
图2.1中自由摆可以左右自由摆动,下端固定有步进电机,平板固定在电机的转子上,θ为初始角度。
在自由摆摆动的过程中,打破平板的平衡,此时开始进行平衡调节。
控制算法采用了数字PID控制算法,控制示意图为:
图2.1系统数字PID增量型控制示意图
系统控制算法采用了凑试法PID来调整PID参数,在调整中增大比例系数Kp将加快系统响应,减小静差但过大则较大的超调,产生振荡,使稳定性变坏;
增大积分时间参数TI有利于消除静差,减小振荡,使系统稳定;
增大微分时间参数Td有利于加快系统响应,超调量减小,稳定性增加。
参考系统的动态变化情况采用凑试法,根据凑试法数字PID控制算法建立此闭环控制系统的对应模型如图2.2:
图2.2系统简化模型
由图可知,角度传感器将角度值反馈给控制系统,控制步进电机正转与反转,控制电机带动平板,引起平板角度的变化,使平板系统达到平衡状态。
整个过程要通过PID增量型算法利用步进电机来改变系统的状态,系统算法如下:
当自由摆由始端A处摆动到B处,自由摆的偏移角度逐渐减小,为了使平板能够保持平衡,应使步进电机正向加速,带动平板逆时针旋转,以弥补自由摆转动带来的角度偏移,直到自由摆到达最低点B。
到达B时,自由摆的偏移角为0,此后偏移角开始增大,电动机需正向减速来保持平板的平衡,直到到达另一端的最高点C点。
到达C点后,自由摆开始向下摆动,此时需要步进电机反向加速,再次到达B点后,需要步进电机反向减速。
这样就完成了平板的一个运动周期,如此往返,直到运动结束。
此闭环控制系统采用了角度传感器来检测平板和自由摆的角度,当将角度反馈给控制系统之后,控制系统才做出响应。
系统设计中,由于步进电机的输出脉冲具有一定的滞后性,微分时间常数的作用是对控制误差的变化做出提前的反应,即控制误差的微分作用,可提前给出脉冲,采用微分作用将提高系统快递性。
三、电路与程序设计
3.1控制电路的设计
MCU电路采用AT89S52单片机,实现角偏信号的计算与处理,一方面将该信号传送到输出终端LCD显示电路,另一方计算步进电机的运转方向和速度,通过L298和L297模块组成的驱动电路控制步进电机的旋转,控制流程图见附录1。
3.2角度传感电路
角度检测模块采用单轴倾角传感器SCA60C,SCA60C利用感应重力加速度在某一方向的分量来完成角度的测量,其输出电压与角度变化成一定的线性关系。
通过AD采样判断角度的大小。
图3.1角度检测电路图
3.3步进电机驱动电路
本系统采用四线五相步进电机35BYJ46做电机驱动,利用双桥式驱动芯片L298和L297相结合的驱动电路,驱动电路利用了L297的频率脉冲端、使能端和正反控制端来控制L298,如图所示,L298可以给步进电机提供一个频率可调的脉冲信号,从而使步进电机做到迅速启动和停止或者做出微小位移,有利于单片机对电动机的程控。
步进电机驱动电路见附录2。
3.4模数转换电路
AD0804输入为来自角度传感器的电信号,将输入的模拟电信号转化位0、1代码的数字信号,D0~D7接51单片机的P2口(P2.0~P2.7)ADIN1和ADIN2为通道IN0和IN1的电压模拟量输入(0~5V)。
图3.2模数转化电路
3.5程序结构与设计
此系统中,单片机一方面要接收来自角度传感器的电信号,经过计算得到偏移角度,初始时刻的偏移角度会传到LCD1602,方便实验者设定初始角度;
另一方面通过switch语句判断偏转角度是否为零,如果不为零,则通过循环调整步进电机的转向和转速达到控制平板的效果。
每个周期结束后都会有蜂鸣器报警提示。
系统程序设计采用模块化设计方案。
整个程序由按键检测模块、偏移角度测量模块、电机循环控制模块,再结合显示和报警模块。
程序框图见附录4。
步进电机的程控过程是利用循环检测控制的,以步进电机一个周期的动作为例。
一个周期共分为四个部分:
加速下降,减速上升,反向加速下降,反向减速上升(回到初始位置)。
步进电机一个周期动作的具体程序框图见附录5。
总程序键附录7。
四、测试方案与测试结果
4.1测试方案
整个系统由两部分组成,硬件部分和软件部分,两部分相辅相成。
因此在对系统测试之前,我们先分别对硬件和软件进行测试。
硬件分模块进行测试,每个完成一个模块后,测试通断判断电路是否存在短路、虚焊,硬件部分全部完成后,采用自制电给硬件电路供电,然后分步调试。
程序调试,首先修正语法错误和逻辑错误,然后将程序写入单片机,根据功能对整个系统进行调试。
系统测试:
分别对基,本性能、平板上放置1枚硬币、放置8枚硬币三种状态进行测试。
通过单一变量法,观察分析系统的性能和需要改进的地方。
基本性能,用秒表测试自由摆动10个周期所用的时间t1,然后利用公式T=t1/10s计算得到自由摆的周期他T/10。
再测试电动机转动10周所用的时间,然后同样利用公式v=(10*360/t2)v=(10
*360)/t2计算得到电动机的转速,再利用公式α=v*T
计算得到自由摆摆动一个周期平板旋转的角度,最后用360°
减去α就可以得到偏差角度△α,并于45°
进行比较。
重复测量5次,将测试结果填入表4.1。
平板上放置1枚硬币,用手推动摆杆至一个角度θ(θ在30°
~45°
间),启动后放开摆杆让其自由摆动。
观察硬币能否在5个周期中不从平板上滑落,并记录硬币的位移。
平板上放置8枚硬币,用手推动摆杆至一个角度θ(θ在30°
在摆杆摆动过程中观察并记录硬币在摆杆的5个摆动周期中从平板上滑落的个数N。
重复测量10次,记录数据。
测量仪器清单
直尺、秒表、量角器、万用表BM9205。
4.2测试结果
表4.1基本性能测量数据
t1为自由摆摆动10周所用的时间,T为自由摆的周期,t2为电机转动10周所用的时间,V为电机的转速。
根据公式α=V
×
T计算自由摆摆动一个周期平板旋转的角度,根据
θ=|360°
-α|计算平板角度偏差值。
表4.2偏差角度
表4.3平板上放一枚硬币测量数据
表4.4平板上放8枚硬币时的测量数据
N为硬币从平板上滑落的个数。
4.3结果分析
根据测试数据可以看出,我们设计的系统能够保证摆杆摆一个周期,平板旋转的角度与360度的绝对偏差值不大于45度。
根据实验数据可知,偏差绝对值为X。
在平板上放置一枚硬币时,硬币可以保证在5个周期不从平板上滑落,而且几乎不会滑离平板中心。
在平板上放置8枚硬币时,在没有较大失误时,可以保证所有硬币均不滑落
综合以上数据,本作品能够没有偏差的实现题目要求,并且在精度方面有所扩展。
实际测量中,由于测试环境、测试仪器、测试方式等都对测试值有一定的影响,都会导致结果后多或少地偏离被测量的真值。
误差分析及其改善
(1)自由摆静止时所处位置可能不是竖直向下的,导致自由摆不能作自由摆动。
在制作时尽量使摆杆竖直向下,并尽可能减小自由摆和定轴间的摩擦。
(2)随机误差:
某些难以控制的众多的偶然因素的波动照成的微小误差,多数服从正态分布,在数据分析时,可以舍去偏差很大的数据。
(3)间接测量的误差传递:
间接测量量与直接测量量存在函数关系,在直接测量量存在误差时,间接测量量也存在误差。
为了克服误差传递,在设计测试方案时,应尽量采用科学合理的测量方式,间接测量值应该等效于实际值。
五、总结
经过四天三夜的不懈努力我们终于完成了本次电子设计大赛的设计要求。
我们设计的基于自由摆的平板系统,实现了平板平衡的控制,其平板状态检测、平板平衡控制均达到了题目的设计要求;
设计基于角度传感器采集角偏信息,运用单片机作为中央控制器和计算核心,采用PID算法进行程序设计,精确控制步进电机转向和转速,从而有效控制自由摆带动下的平板。
经过这几天的艰苦奋战,让我们感受到这电子设计大赛的不易与艰辛。
比赛中的磨砺,使我们增强了协作精神和实践能力,努力培养严谨细致的工作态度,这些在今后的人生道路上将是一笔宝贵的财富。
参考文献
[1]余孟尝.数字电子技术基础简明教程[M].高等教育出版社,2010
[2]童诗白.华成英.模拟电子技术基础[M].高等教育出版社,2010
[3]黄智伟.全国大学生电子设计竞赛电路设计[M].北京航空航天大学出版社,2006
附录
附录1:
MCU控制流程图:
图6.1单片机控制流程图
附录2:
步进电机驱动电路:
图6.2步进电机驱动电路
附录3:
电源模块设计
根据设计,电源模块需为系统板上其它模块提供+5V、+12V和-12V电源。
220V交流电输入,经过变压器降压处理,整流电路整流,通过7805、7812、7912三端稳压器得到+5V、12V、-12V的直流电源,供给系统其它模块工作。
电路原理图见附录3。
电源电路图:
图6.3电源电路
附录4:
程序框图:
图6.4系统框图
附录5:
显示器接口电路
本系统采用LCD1602(16
2)作为主要显示器件。
进行实验时,当用手推动自由摆至一个角度
(
在30
~45
间),程序会将计算好的数据传输到LCD,LCD会显示自由摆的初始角度和平板状态。
P0口是数据输入端,EN、R/W和RS分别与P2.0、P2.1、P2.2连接。
图6.5显示电路
附录6:
步进电机程序框图:
图6.6步进电机驱动程序流程图
附录7:
总程序
#include<
reg52.h>
//51芯片管脚定义头文件
intrins.h>
//内部包含延时函数_nop_();
#defineucharunsignedchar
#defineuintunsignedint
sbitST=P2^0;
sbitEOC=P2^1;
sbitOE=P2^2;
sbitCLK=P2^3;
ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
ucharrate;
ucharjiaodu;
ucharDATA;
/********************************************************/
/*延时11.0592MHz时钟
/********************************************************/
voiddelay()
{
uchark;
uints;
k=rate;
do
{
for(s=0;
s<
125;
s++);
}while(--k);
}
/************************************************************
延时1ms程序
*****************************************************************/
voiddelay1ms(uchari)
{
ucharj;
while(i--)
for(j=125;
j>
0;
j--)
;
/***************AD初始化*************************/
voidinit()
EA=1;
TMOD=0X02;
TH0=216;
TL0=216;
TR0=1;
ET0=1;
ST=0;
EX0=1;
IT0=1;
OE=0;
/********中断服务程序*********************/
voidt0(void)interrupt1
CLK=~CLK;
/***********AD转换数据****************/
voidAD()
delay1ms(10);
ST=1;
while(0==EOC);
OE=1;
DATA=P0;
/*步进电机正转**********************************/
voidmotor_ffw(uintm)
uchari;
uintj;
for(j=0;
j<
m;
j++)//转1*n圈
//退出此循环程序
for(i=0;
i<
8;
i++)//一个周期转45度
P1=FFW[i];
//取数据
delay();
//调节转速
/*步进电机反转******************************/
voidmotor_rev(uintn)
n;
P1=REV[i];
/****正转加速*************************/
voidz_jiasu(uintn)
{
rate=0x06;
motor_ffw(n);
//加速
rate--;
}while(rate!
=0x01);
/*****正转减速*******************/
voidz_jiansu(uintm)
{
rate=0x01;
motor_ffw(m);
//减速
rate++;
=0x06);
}
/************反转加速**********************************/
voidf_jiasu(uintn)
motor_rev(n);
/**********反转减速***************************/
voidf_jiansu(uintm)
motor_rev(m);
/****************传感器函数****************************/
voidchuan_gan()
DATA=DATA*500;
DATA=DATA/256;
if(DATA<
250)
jiaodu=102.5-0.45*DATA;
if(DATA>
jiaodu=0.45*DATA+67.5;
}//有待计算!
!
/***************电机动作函数****************************/
voiddianji()//有待改正!
uinti=1;
uintj=1;
uintx=1;
uinty=1;
uintDATA0;
ucharm0;
AD();
chuan_gan();
DATA0=DATA;
//采集角度初始值
while(i)//正转加速
z_jiasu(jiaodu);
if(DATA==250);
i=0;
while(j)//正转减速
z_jiansu(m0-jiaodu);
if(DATA==(DATA0-10))
j=0;
//采集异侧最高点的角度
m0=jiaodu;
while(x)//反转加速
f_jiasu(jiaodu);
if(DATA==250)
x=0;
while(y)//反转减速
f_jiansu(m0-jiaodu);
y=0;
/*****************主程序**************************************/
voidmain()
while
(1)
init();
dianji();
}