当前位置:文档之家› 基于自由摆得平板控制系统

基于自由摆得平板控制系统

基于自由摆得平板控制系统
基于自由摆得平板控制系统

论文编号:B甲00913

竞赛题目:

基于自由摆的平板控制系统(B题)

参赛学生及专业:

通信工程

通信工程

通信工程

学校:山东大学威海分校

学院:机电与信息工程学院

指导教师:

2011年9月3日

摘要

本系统是基于单片机的控制电路为核心,以四线五相步进电机35BYJ46为主要控制系统,以L298N和L297组合电机为驱动模块,以角度传感器角度变化检测系统,根据AD0804将角度传感器输出的模拟信号转换为数字信号,通过单片机的分析计算对角偏信号做出调整,进行步进电机转向和转速的控制,从而实现对平板状态的控制。本系统通过角度传感器实现角偏信息采集功能,模拟数字转换器AD0804将模拟信号转化为单片机可以识别的数字信号并送到单片机中进行信息处理,进而通过步进电机控制平板。系统通过数字PID控制算法对电机进行控制,经过不断调试,系统能够很好的控制平板的平衡,保证硬币不从平板上滑落。

关键字

AT89S52单片机角度传感器步进电动机PID算法

Abstract

This system is based on the step motor with the AT89S52 MCU to control the moving of the surface plate. The AT89S52 MCU is the core of this system, controlling the step motor called the 35BYJ46.Then we use the L298N and the L297 Module to drive the step motor to work. With the angle sensor of SCA60C collecting the information of the angle’s changes, the AD converter of the AD0804 can further deal with the electric signal, and then the information is transferred to the displa y system and the warning system. The angle sensor can gather the needed electrical information, and then the AD converter transfer analog signal into the digital signal, and the MCU can use the digital signal to control the surface plate. By using the PID control algorithm to control the step motor, this system can keep the balance of the surface plate very well and the coins can keep still on the plate after trying many times.

Key Words

AT89S52 MCU angular transducer step motor the PID control algorithm

一、方案比较与选择

1.1核心控制系统的选择

方案一:采用A TMEL公司的ATmega8。具有高性能、低功耗、优秀的接口功能、稳定性、抗干扰性等优点。

方案二:采用最常见的单片机AT89S52。该单片机价格低廉,程序资源丰富,技术比较成熟。由于设计只需要单片机完成基本的程控功能和计算功能,因此选择方案二。

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参数,在调整中增大比例系数K p将加快系统响应,减小静差但过大则较大的超调,产生振荡,使稳定性变坏;增大积分时间参数T I有利于消除静差,减小振荡,使系统稳定;增大微分时间参数T d有利于加快系统响应,超调量减小,稳定性增加。参考系统的动态变化情况采用凑试法,根据凑试法数字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°~45°间),启动后放开摆杆让其自由摆动。在摆杆摆动过程中观察并记录硬币在摆杆的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:步进电机驱动电路:

OUT1

图6.2 步进电机驱动电路

附录3:电源模块设计

根据设计,电源模块需为系统板上其它模块提供+5V、+12V和-12V电源。220V 交流电输入,经过变压器降压处理,整流电路整流,通过7805、7812、7912三端稳压器得到+5V、12V、-12V的直流电源,供给系统其它模块工作。电路原理图见附录3。

电源电路图:

7805

图 6.3 电源电路

附录4:程序框图:

图 6.4 系统框图

附录5: 显示器接口电路

本系统采用LCD1602(162)作为主要显示器件。进行实验时,当用手推动自由摆至一个角度(在30~45间),程序会将计算好的数据传输到LCD,LCD

会显示自由摆的初始角度和平板状态。P0口是数据输入端,EN、R/W和RS分别与P2.0、P2.1、P2.2连接。

图 6.5 显示电路

附录6:步进电机程序框图:

图 6.6 步进电机驱动程序流程图附录7:总程序

#include //51芯片管脚定义头文件

#include //内部包含延时函数_nop_(); #define uchar unsigned char

#define uint unsigned int

sbit ST=P2^0;

sbit EOC=P2^1;

sbit OE=P2^2;

sbit CLK=P2^3;

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};

uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

uchar rate ;

uchar jiaodu;

uchar DATA;

/********************************************************/

/* 延时11.0592MHz时钟

/********************************************************/

void delay()

{

uchar k;

uint s;

k = rate;

do

{

for(s = 0 ; s <125 ; s++) ;

}while(--k);

}

/************************************************************

延时1ms程序

*****************************************************************/ void delay1ms(uchar i)

{

uchar j;

while(i--)

{

for(j=125;j>0;j--)

;

}

}

/***************AD初始化*************************/

void init()

{

EA=1;

TMOD=0X02;

TH0=216;

TL0=216;

TR0=1;

ET0=1;

ST=0;

EX0=1;

IT0=1;

ST=0;

OE=0;

}

/********中断服务程序*********************/ void t0(void) interrupt 1

{

CLK=~CLK;

}

/***********AD转换数据****************/

void AD()

{

ST=0;

delay1ms(10);

ST=1;

delay1ms(10);

ST=0;

while(0==EOC);

OE=1;

DATA=P0;

OE=0;

}

/*步进电机正转**********************************/ void motor_ffw(uint m)

{

uchar i;

uint j;

for (j=0; j

{

//退出此循环程序

for (i=0; i<8; i++) //一个周期转45度

{

P1 = FFW[i]; //取数据

delay(); //调节转速

}

}

}

/*步进电机反转******************************/ void motor_rev(uint n)

{

uchar i;

uint j;

for (j=0; j

{

//退出此循环程序

for (i=0; i<8; i++) //一个周期转45度

{

P1 =REV[i]; //取数据

delay(); //调节转速

}

}

}

/****正转加速*************************/

void z_jiasu(uint n)

{

rate=0x06;

do

{

motor_ffw(n); //加速

rate--;

}while(rate!=0x01);

}

/*****正转减速*******************/

void z_jiansu(uint m)

{

rate=0x01;

do

{

motor_ffw(m); //减速

rate++;

}while(rate!=0x06);

}

/************反转加速**********************************/ void f_jiasu(uint n)

{

rate=0x06;

do

{

motor_rev(n); //加速

rate--;

}while(rate!=0x01);

}

/**********反转减速***************************/

void f_jiansu(uint m)

{

rate=0x01;

do

{

motor_rev(m); //减速

rate++;

}while(rate!=0x06);

}

/****************传感器函数****************************/ void chuan_gan()

{

DATA=DATA*500;

DATA=DATA/256;

if(DATA<250)

{

jiaodu=102.5-0.45*DATA;

}

if(DATA>250)

{

jiaodu=0.45*DATA+67.5;

}//有待计算!!!

}

/***************电机动作函数****************************/ void dianji() //有待改正!!!

{

uint i=1;

uint j=1;

uint x=1 ;

uint y=1;

uint DATA0;

uchar m0;

AD();

chuan_gan();

DATA0=DATA; //采集角度初始值

while(i) //正转加速

{

AD();

chuan_gan();

z_jiasu(jiaodu);

if(DATA==250);

i=0;

}

while(j) //正转减速

{

AD();

chuan_gan();

z_jiansu(m0-jiaodu);

if(DATA==(DATA0-10))

j=0;

}

AD(); //采集异侧最高点的角度

chuan_gan();

m0=jiaodu;

DATA0=DATA;

while(x) //反转加速

{

AD();

chuan_gan();

f_jiasu(jiaodu);

if(DATA==250)

x=0;

}

while(y) //反转减速

{

AD();

chuan_gan();

f_jiansu(m0-jiaodu);

if(DATA==(DATA0-10))

y=0;

}

}

/*****************主程序**************************************/ void main()

{

while(1)

{

init();

dianji();

}

}

相关主题
文本预览
相关文档 最新文档