基于自由摆的平板控制系统论文.docx
《基于自由摆的平板控制系统论文.docx》由会员分享,可在线阅读,更多相关《基于自由摆的平板控制系统论文.docx(12页珍藏版)》请在冰豆网上搜索。
基于自由摆的平板控制系统论文
基于自由摆的平板控制系统
论文摘要:
我们采用STC89C52单片机控制步进电机,通过IO口输出具有时序的脉冲信号作为步进电机的控制信号。
信号经过ULN2003驱动步进电机使其可以带动平板转动。
通过角度传感器KMZ41改变步进电机的运行状态,从而对平板的摆动进行控制。
关键字:
单片机
步进机
角度传感器
正转
反转
一、设计任务
1.基本要求:
(1)控制电机使平板可以随着摆杆的摆动而旋转(3~5周),摆杆摆一个周期,平板旋转一周(360°),偏差绝对值不大于45°。
(2)在平板上粘贴一张画有一组间距为1cm平行线的打印纸。
用手推动摆杆至一个角度θ(θ在30°~45°间)调整平板角度,在平板中心稳定放置一枚1元硬币(人民币;启动后放开摆杆让其自由摆动。
在摆杆摆动过程中,要求控制平板状态,使硬币在5个摆动周期中不从平板上滑落,并尽量少滑离平板的中心位置。
(3)用手推动摆杆至一个角度θ(θ在45°~60°间),调整平板角度,在平板中心稳定叠放8枚1元硬币;启动后放开摆杆让其自由摆动。
在摆杆摆动过程中,要求控制平板状态使硬币在摆杆的5个摆动周期中不从平板上滑落,并保持叠放状态。
(4)在平板上固定一激光笔,光斑照射在距摆杆150cm距离处垂直放置的靶子上。
摆杆垂直静止且平板处于水平时,调节靶子高度,使光斑照射在靶纸的某一条线上,标识此线为中心线。
用手推动摆杆至一个角度θ(θ在30°~60°间),启动后,系统应在15秒钟内摆杆至一个角度控制平板尽量使激光笔照射在中心线上(偏差绝对值<1cm),完成时以LED指示。
在上述过程完成后,调整平板,使激光笔照射到中心线上(可人工协助)。
启动后放开让摆杆自由摆动;摆动过程中尽量使激光笔光斑始终瞄准照射在靶纸的中心线上。
二、系统硬件原理设计
1.系统总体框图
2.系统功能实现的设计
(1)角度采集
KMZ41是利用稀薄镍铁导磁合金的磁阻效应做成的角度传感器。
KMZ41片内包含两个相互独立的单臂镍铁导磁合金电阻电桥,两个电桥的放置方向相差45°,各自具有独立的电气特性和机器特性。
UZZ9001是角度信号调理芯片。
该芯片将角度传感器KMZ41输出的两个交流信号转换成线性角度信号,并以SPI总线协议兼容的形式输出,并可补偿直流偏移量。
UZZ9001内部包含ADC、振荡电路、低通滤波器、ALU、复位电路、控制单元、SPI接口电路。
内部结构如图所示:
(2)显示与报警
设计中显示的实现采用LED数码管显示,由STC89C52单片机P0的8个数据端口与其连接,中间加上拉电阻来完成对实时符合要求的显示。
(3)主控单片机
设计中选用STC89C52单片机,共有四个8位的I/O口,外加12MHz晶振提供时钟信号,采用上电复位模式,P1口和角度采样传感器通讯,直接输入12位数字量到89C52内进行处理,P3口输出控制信号与外接电机驱动电路来
控制步进电机的输入信号,P0口与LED数码显示模块连接,用于实时显示。
P2^3连接蜂鸣器,提示达到指定角度,从而控制摆杆运动。
(4)步进电机
步进电机是一种将电脉冲转化为角位移的执行机构,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。
由于输入的是脉冲信号,输出的角位移是断续的,所以又称为脉冲电动机。
步进电机根据单片机输出给驱动电路的脉冲信号确定步数,从而随着摆杆摆动调节平板的位置保持水平。
步进电机分三种:
永磁式(PM),反应式(VR)和混合式(HB)
永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;
反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。
在欧美等发达国家80年代已被淘汰;
混合式步进是指混合了永磁式和反应式的优点。
它又分为两相和五相:
两相步进角一般为1.8度而五相步进角一般为0.72度。
这种步进电机的应用最为广泛。
故本次试验采用混合二相式,步距角为1.8°。
驱动电路为ULN2003.步进机与驱动电路连接图如下:
三、系统软件原理设计
(1)控制系统加电后主控单片机、LED显示、角度传感器、步进机驱动电路复位,然后程序则开始通过扫描角度传感器KMZ41来实时采集当前角度。
控制算法中,当实际角度值达到符合要求的角度时,蜂鸣器提示令摆杆开始摆动。
由于摆杆长度不变,摆动周期T不变。
在摆杆摆动一个周期内,控制步进电机步数,使平板旋转360°。
此电机程序代码如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
#include"uzz9001.h"
ucharcoderoundz[]={0X03,0X06,0X0c,0X09};
//ucharcoderoundf[]={0X09,0X0c,0X06,0X03};
#defineCONPORTP1
sbitbeep=P2^3;
sbitdula=P2^6;
sbitwela=P2^7;
unionraradian;
voiddelayms(uchardcnt)
{
uinti;
while(dcnt>0)
{
i=123;
while(i>0)
i--;
dcnt--;
}
}
voiddianji()
{
uchari=0,j=200;
while(j--)
{
CONPORT=roundz[i];
i++;
if(i>4)
i=0;
delayms(10);
}
}
uintangle()
{uintangle;
uchari;
UZZ9001_DATA=1;
UZZ9001_CS=0;
UZZ9001_CLK=0;
for(i=16;i!
=0;i--)
{
radian.rad<<=1;
UZZ9001_CLK=1;
if(UZZ9001_DATA)
radian.rad|=0x01;
UZZ9001_CLK=0;
}
UZZ9001_CLK=1;
UZZ9001_CS=1;
if(!
(radian.r[0]&&0x40))
{
radian.rad&&0x7f7f;
if(radian.r[0]&&0x01)
radian.r[1]|=0x80;
radian.r[0]>>=1;
angle=radian.rad*225lu>>10;
return(angle);
}
}
voidmain()
{
charw0;
wela=0;
dula=0;
w0=angle();
if(w0==450)
beep=1;
delayms(1000);
beep=0;
dianji();
}
UZZ9001_H头文件
#ifndefUZZ9001_H
#defineUZZ9001_H
#defineucharunsignedchar
#defineuintunsignedint
sbitUZZ9001_CS=P1^0;
sbitUZZ9001_CLK=P1^1;
sbitUZZ9001_DATA=P1^2;
externunionra
{
ucharr[2];
uintrad;
}radian;
externvoidreaduzz9001(void);
#endif
(2)程序通过扫描角度传感器KMZ41来实时采集当前角度。
控制算法中,当实际角度值达到符合要求的角度时,蜂鸣器提示令摆杆开始摆动。
当摆杆开始下降时,每达到步进机旋转一步的角度后,单片机就给步进机驱动电路一个脉冲信号。
进而保持平板水平。
当摆杆到达对侧最高点时,步进机开始反转。
重复上述步骤。
步进机程序代码如下:
voiddianji()
{uinti=0,j;
charw0;
w0=angle();
if(w0==450)
beep=1;
for(j=0;j<7;j++)
{
charw1;
w1=angle();
if(w1{
while(w1==w0-18)
{
CONPORT=roundz[i];
w0=w1;
i++;
if(i>4)
i=0;
}
}
else
{while(w1==w0+18)
{
CONPORT=roundf[i];
w0=w1;
i++;
if(i>4)
i=0;
}
}
}
}
voidmain()
{while
(1)
{wela=0;
dula=0;
dianji();
}
}
(3)为使光斑照射在靶纸的固定一条中心线上,则需在摆杆到达最高点时,调整平板角度。
当摆杆开始下降时,每达到步进机旋转一步的角度后,单片机就给步进机驱动电路一个脉冲信号。
从而在摆杆摆动过程中,光斑照在中心线上。
步进机程序代码如下:
voiddianji()
{uinti=0,j,k;
charw0;
charw1;
w0=angle();
if(w0==450)
beep=1;
k=36;
while(k--)
{
CONPORT=roundz[i];
i++;
if(i>4)
i=0;
delayms(100);
}
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=0x3f;
dula=0;
delayms(100);//放手
for(j=0;j<7;j++)
{w0=450;
w1=angle();
if(w1{
while(w1==w0-18)
{
CONPORT=roundz[i];
w0=w1;
i++;
if(i>4)
i=0;
}
}
else
{while(w1==w0+18)
{
CONPORT=roundf[i];
w0=w1;
i++;
if(i>4)
i=0;
}
}
}
}
voidmain()
{while
(1)
{
uintangle();
dianji();
}
}