自动控制升降旗技术报告.docx
- 文档编号:11073623
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:38
- 大小:645.63KB
自动控制升降旗技术报告.docx
《自动控制升降旗技术报告.docx》由会员分享,可在线阅读,更多相关《自动控制升降旗技术报告.docx(38页珍藏版)》请在冰豆网上搜索。
自动控制升降旗技术报告
摘要
该简易国旗升降装置以STC89C52RC单片片机为核心,由42-BYG2100-48步进电机作为动力驱动实现国旗的自动升降。
该装置具备控制精度高,易于控制,使用方便等优点。
该装置由CPU模块、步进电机驱动模块、语音模块、液晶显示模块、数据保存模块和键盘控制模块组成。
CPU模块为主控模块,步进电机驱动模块主控芯片采用东芝公司的TB6560AHQ芯片,实现对步进电机的驱动达到升降国旗的功能,语音模块用于在升国旗的同时播放国歌,液晶显示模块采用1602液晶,用于及时显示国旗所在的高度和感性的显示电机转速,数据保存模块由E2PROM器件AT24C02构成,通过I2C通信协议实现断电国旗的高度保存功能,键盘模块用于用户对本装置的控制。
设计要求
设计并制作一个自动控制的升降旗装置,该系统能够自动控制升旗和降旗,升旗时,在旗杆的最高端自动停止;降旗时,在最低端自动停止。
基本部分
1.按下上升按键后,旗帜匀速上升,同时流畅地播放歌曲,上升到最高端时自动停止上升,歌曲停奏;按下下降按键后,旗帜匀速下降,降旗的时间不放歌曲,下降到最低端时自动停止;
2.旗帜在最高端,上升按键不起作用;在最低端时,下降按键不起作用;
3.升降旗的时间均为43秒,与国歌的演奏时间相等;
4.即时显示旗帜所在的高度,以cm为单位,误差不大于2cm。
扩展部分:
1.重新合上电源后,所显示的旗帜高度数据不变;
2.要求升降旗的速度可调整,调整范围是5.375-21.5秒钟(除43秒外,其他时间可与国歌不同步);
3.在最高升降速度下(以自选的电机参数定),能在指定的位置上自动停止,定位误差≤±2cm1。
1方案论证与对比
1.1方案一
主控芯片采用STC89C52单片机,驱动马达采用直流电机。
由于直流电机需采用PWM脉宽调制实现对其调速,PWM脉宽调制电机速度很难精确的计算,所以高度控制误差就大。
因此需采用测速发电机进行测速,然后经过模数转换实现数据的采集再送CPU通过相应的算法实现高度控制。
此方案控制精度低,且PWM脉宽调制时不能保证转矩的稳定。
系统原理框图如图1所示:
1.2方案二
主控芯片采用STC89C52单片机,驱动马达采用步进电机驱动,步进电机控制较复杂,但控制精度高,误差小,步进电机又称脉冲电机,能把脉冲信号转换成输出轴的转角或转速,无需用测速发电机对其测速就能准确的控制其进给距离。
此方案控制精度高、误差小。
系统原理框图如图2所示。
1.3方案对比与选择
以上两个方案都是可行的,都能实现对国旗的自动升降控制。
两者的最大区别就在于方案二采用步进电机控制,控制精度要远远大于方案一用直流电机控制的精度,且方案二无需测速就能直接进行控制距离且精度高。
基于控制精度的考虑,在本设计中选用方案二作为本设计的整体方案。
2单元电路设计与计算
2.1数据保存模块
根据发挥部分的设计要求,要求在断电重新上电源后显示的旗帜高度不变(也即掉电保护功能),在设计时采用开发板上的E2PROM芯片AT24C02和CPU之间通过I2C通信协议进行数据的传输并保存。
2.1.1E2PROM芯片AT24C02
AT24C02是ATMEL公司生产的E2PROM芯片,具备256字节的存储空间,和单片机之间的通信方式采用I2C通信协议。
AT24C02内部有256字节的E2PROM,每个字节有8位。
这种芯片广泛应用于各种小电压供电的工业产品及小电器中。
加上2.7v有效电压即可通过两线串行接口对各种八线的PDIP,JEDEC,SOIC,MAP,TSSOP分组包进行存储。
2.1.2I2C总线工作原理
I2C通信协议是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
I2C总线只有两根双向信号线。
一根是数据线SDA,另一根是时钟线SCL。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
起始和终止信号:
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
时序
图如下所示:
I2C总线数据传送格式:
I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
2.2液晶显示模块
液晶显示模块选用长沙太阳人公司的1602液晶模块,2行*16列字符显示,并行8数据通信,可以满足本系统中显示的要求。
我在平时的练习中利用开发板已经调过液晶显示的模块,利用C语言模块的可移植性,直接将模块移植过来,根据实际情况更改数组内容,即可实现对本设计中需要显示的参数进行显示。
2.3键盘检测模块
键盘输入有独立键盘和矩阵键盘两种选择。
对于本设计使用的单片机开发板自带的4个独立按键而言完全可以实现本系统的要求。
4个独立按键分别与单片机的P3.0-P3.3口相连,低电平有效。
一个按键用于控制上升启动用,一个按键用于下降启动用,另外两个按键一个是调速用的,一个是自定义高度用的。
为了节约按键和减少电路的复杂程度,调速和自定义高度功能采用循环调整的方式。
键盘检测原理图如图6显示
2.4语音模块
根据本设计的要求,在升国旗的同时要能同时播放国歌,在设计时我们起初的方案是在一块单片机上通过编程驱动有源蜂鸣器播放,但是在实际设计时发现因为中断的问题(单片机不能同时响应两个中断)不能在一块单片机芯片上实现流畅的播放国歌和控制国旗匀速升降的功能,所以我们将语音模块单独分离了出来,单独设计语音模块
时考虑到了用语言芯片,但是时间有限,来不及购买语言芯片了,因此我们采用了一块单独的单片机作为语音播放用,但控制还是由主CPU的控制的。
语音模块如图7
图7语音模块
2.5电机驱动模块
步进电机驱动模块我们选用的是北京时代超群电子有限公司的ZD-6560-V2系列驱动板,该驱动板主芯片采用的是东芝公司的TB6560AHQ芯片(芯片资料见附录五)。
该驱动板属高集成度高可靠性两相步进电机驱动器,输入电压范围8V—24V,所有接口采用超高速光耦隔离,抗干扰能力强,最高驱动电流可达3.5A。
具备过热自动保护、细分衰减可调、支持脱机、使能、锁定等功能。
该驱动板与单片机的连接方式有共阳极接法和共阴极接法,如图8、图9所示,控制方式如表1、表2所示。
脉冲-
有脉冲时工作,高电平有效;无脉冲时锁定电机并自动半流
方向-
高电平输入或悬空时正转;低电平输入时反转
脱机-
高电平输入或者悬空时正常工作;低电平时脱机
表1共阳极接法控制方式
表2共阴极接法控制方式
脉冲+
有脉冲时工作,低电平有效;无脉冲时锁定电机
方向+
低电平输入或悬空时正转;高电平输入时反转
脱机+
低电平输入或者悬空时正常工作;高电平时脱机
在本设计中,我们选用的接法是共阳极接法,未使用脱机功能,所以驱动板的脱机接口未与主控板连接。
9V直流稳压电源供电。
3系统软件工作流程
3.1脉冲计数测量原理及误差分析
本设计中使用的42BYG47-01型步进电机,步距角0.9度,步进电机每转一圈所需脉冲数为200个脉冲。
设计中使用的主滑轮周长大约为9.6cm(由于测量工具的局限性,所以是大约,下同),主滑轮装在步进电机的转轴上,由电机带动。
设计的旗杆高度约是48cm,大约发2000个脉冲旗帜从最低端上升到最高端,每来1个脉冲,滑轮所转过的线距离约为0.024mm,在设计此装置的初始方案中,我们考虑的控制精度是1mm的,但是在实际设计时,由于液晶显示太快,不易观察,为了减少算法误差,我们将精度设置为1cm,每发42个脉冲距离变化一次,加或者减1cm,实际上每42个脉冲距离的变化约是1.008cm,算法控制时省略了毫米后面的小数点位。
根据上面的数据,理论上的算法误差约是0.008cm。
3.2系统工作流程
系统在开机上电后,系统处于等待状态,除了1602液晶显示有数据显示外(1602液晶显示上一次断电前的旗帜高度),再没有任何动作了,等待按下速度调整键、高度自定义键和上升启动键,一旦有相应的按键按下,系统就会执行相应的动作。
步进电机的脉冲在程序中由CPU内部定时器0中断服务程序发出,这样既保了脉冲的发送频率又保证了脉冲的流畅,从而保证电机的匀速运转。
电机的调速控制通过改变定时器的初值来实现,由一个按键实现循环切换调速(模拟摩托车的循环档)。
3.3定时器0中断服务程序
程序通过定时器0中断服务程序给驱动板发脉冲,驱动步进电机转动,定时器0每溢出一次,就进入中断服务程序执行一次中断,定时器初值重装,发一个脉冲,每进入42次中断,国旗高度就加或者减1厘米,送液晶显示并送E2PROM保存。
通过改变定时器0的重装初值实现调速功能。
4系统功能测试与整体指标
4.1基本功能测试
测试记录:
开机按下上升启动键,开始播放国歌,国旗开始匀速上升,1602液晶始有高度数据显示,并在不断增加,同时用一个秒表计时,当秒表计时到43秒时,国歌播放完毕,同时国旗也上升到最高端(48厘米高度),液晶显示显示高度为48cm,并停止增加。
到最高端再按下上升键,系统无任何动作。
然后按下下降启动键,国旗开始下降,液晶显示的高度数据开始减小,当下降到最低端时,停止下降,液晶显示高度为0,再按下下降键,系统无任何动作。
单位:
cm
状态
序号
初始高度
停止高度
显示值
实测值
上升
1
0
48
48.2
2
0
48
48.1
3
0
48
48.3
下降
1
48
0
0.7
2
48
0
0.1
3
48
0
0.2
从上表数据测试看出,最大误差是8mm,最小误差是2mm,误差范围在设计要求范围内,基本功能测试成功。
4.2发挥部分功能测试
4.2.1掉电旗帜高度保存功能测试
测试记录:
打开系统电源,按下上升启动键,国旗开始上升并播放国歌,当国旗上升到一定高度时,记下此时的高度显示值然后突然断开电源,然后再合上电源开关,观察得此时液晶上显示的高度值和断开电源前是相同的。
当其上升到最顶端后,再按下下降键,国旗开始下降,下降到一定高度时,记下此时的液晶显示高度值并突然断开电源,然后再合上电源开关,观察得此时液晶上显示的高度值和断开电源前是相同的。
然后按照上面的方法进行了多次测试,重新合上电源后,液晶显示的高度值与开机前的都是相同的。
掉电旗帜高度数据保存功能测试成功。
4.2.2速度调整功能测试
测试记录:
打开系统电源,先不按下上升启动键,先按下速度调整键,看液晶上的感性速度显示值是否循环变化,实际观察得感性速度显示值会随键的按下循环变化。
设置好某一速度值,按下启动键,观察国旗上升的速度是否跟没进行速度调整时有不同,并在国旗上升的同时按下速度调整键看速度是否也会变化,实际测试观察得速度是变化
了。
然后循环多测几次,速度能按照按键的设置变化。
速度调整功能测试成功。
4.2.3自定义高度功能测试
测试记录:
打开系统电源开关,先不按下上升启动键,先按下自定义高度键,设置要停止的高度,再按启动键,测量国旗在指定高度停止时的实际高度与设置的高度是否相同若不同,误差是多大。
设置的高度应有大有小,从下往上和从上往下进行多次测试,测试数据记录如表4所示:
单位cm
状态
序号
起始高度
自定义高度
实测高度
上升
1
0
12
12.2
2
0
24
24.2
3
0
36
36.3
下降
1
48
36
36.2
2
48
24
24.1
3
48
12
12.1
从上表数据可以看出,高度定位能在指定的高度停下来,且最大误差是8mm,最
小误差为2mm,达到设计要求,自定义高度功能测试成功。
5详细仪器清单
6附录一:
国旗自动升降装置电路原理图
1.主控板原理图:
2.音乐模块原理图
7附录二:
总程序流程图
8附录三:
总程序(C源代码)
/*******************************lcd1602.h头文件******************/
sbitrs=P2^4;//1602读控制位
sbitrw=P2^5;//1602写控制位
sbiten=P2^6;//1602使能端控制位
ucharcodetable1[]="nationalflagR&L";//开始上电后液晶第一行显示国旗升降英文字母
ucharcodetable2[]="H:
00cmV:
1.1cm/s";//开始上电后液晶第二行显示初始高度和初始速度
voiddelay1(uintz)//毫秒级延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
ucharnSwap(uchar*com)//调整1602与P0高低位对应的函数
{
uchari,nNum[8];
for(i=0;i<8;i++)
{
nNum[i]=(*com)%2;
*com/=2;
}
*com=0;
for(i=0;i<8;i++)
*com=2*(*com)+nNum[i];
}
voidwrite_com(ucharcom)//1602写命令
{
rs=0;//选择指令寄存器
rw=0;//选择写
nSwap(&com);
P0=com; //把命令字送入P0
delay1
(2);//延时一小会儿,让1602准备接收数据
en=1;//使能线电平变化,命令送入1602的8位数据口
delay1
(2);
en=0;
}
voidwrite_data(uchardate)//1602写数据
{
rs=1;//选择数据寄存器
rw=0; //选择写
nSwap(&date);
P0=date;//把要显示的数据送入P0口
delay1
(2);//延时一小会儿,让1602准备接收数据
en=1;//使能线电平变化,数据送入1602的8位数据口
delay1
(2);
en=0;
}
voidinit_lcd()//1602初始化
{
ucharnum;
write_com(0x38);//8位数据,双列,5*7字形
write_com(0x0c);//开启显示屏,关光标,光标不闪烁
write_com(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
write_com(0x01);//清屏
write_com(0x80);//第一行显示命令
for(num=0;num<16;num++)
{
write_data(table1[num]);//第一行显示的数据
delay1
(2);
}
write_com(0x80+0x40);//第二行显示命令
for(num=0;num<16;num++)
{
write_data(table2[num]);//第二行显示的数据
delay1
(2);
}
}
/**********************i2cbus.h头文件**************************/
#include
sbitwp=P1^0;
sbitscl=P1^1;
sbitsda=P1^2;
voiddelay2()//微妙级延时
{
uinti;
for(i=0;i<6;i++)_nop_();
}
voidinit_i2c()
{
wp=0;
sda=1;
delay2();
scl=1;
delay2();
}
voidstart()//开始信号
{
sda=1;
delay2();
scl=1;
delay2();
sda=0;
delay2();
}
voidresponse()//应答信号
{
sda=1;
delay2();
scl=1;
delay2();
scl=0;
delay2();
}
voidstop()//停止信号
{
sda=0;
delay2();
scl=1;
delay2();
sda=1;
delay2();
}
voidwrite_byte(uchardate)//写字节
{
uchari,temp;
temp=date;
wp=0;
scl=0;
delay2();
for(i=0;i<8;i++)
{
if(temp&0x80)
sda=1;
else
sda=0;
delay2();
scl=1;
delay2();
scl=0;
delay2();
temp=temp<<1;
}
scl=0;
delay2();
sda=1;
delay2();
}
ucharread_byte()//读字节
{
uchari,k;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
delay2();
k=k<<1;
if(sda)
k=k|0x01;
else
k=k&0xfe;
scl=0;
delay2();
}
returnk;
}
voidwrite_add(ucharaddress,uchardate)//写数据
{
wp=0;
start();
write_byte(0xae);
response();
write_byte(address);
response();
write_byte(date);
response();
stop();
}
ucharread_add(ucharaddress)//读数据
{
uchardate;
start();
write_byte(0xae);
response();
write_byte(address);
response();
start();
write_byte(0xaf);
response();
date=read_byte();
stop();
returndate;
}/************************************************
国旗升降仪.C文件
"nationalflagR&L""H:
00cmV:
1.1cm/s"**********************************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
#include
#include
sbitk1=P3^0;//上升控制位
sbitk2=P3^1;//下降控制位
sbitk3=P3^2;//调速位
sbitk4=P3^3;//自定义高度位
sbitmot=P1^4;//电机脉冲控制位
sbitdir=P1^5;//电机方向控制位
sbitbeep=P2^7;//蜂鸣器控制位
ucharflagk1,flagk2,flag;//国旗各个状态标志位
ucharcm,high1,high2,v;//定义变量,脉冲个数cm,上升下降高度hingh1,自定义高度high2,速度v
ucharspeed;
voiddelay(uintx)//延时函数
{
uinti,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
voiddisplay2(ucharcom,uchardate)//1602液晶第二行显示函数1,显示上升标志+,下降标志—
{
write_com(0x80+0x40+com);
write_data(date);
}
voiddisplay3(ucharcom,uchardate)//1602液晶第二行显示函数2,显示国旗高度
{
write_com(0x80+0x40+com);
write_data(0x30+date);
}
voidG_init()//全局变量初始化
{mot=1;
speed=0;//初始速度为1.1cm/s
flag=0;//
TMOD=0x01;//定时器T0方式1
TH0=(65536-10750)/256;
TL0=(65536-10750)%256;
EA=1;
ET0=1;
high1=read_add(8);//上电读取EEROM存储的值
_nop_();
_nop_();
_nop_();
_nop_();
}
voidkeyscan()//键盘扫描函数
{
ucharraise;
if(high1!
=0)
flagk2=1;
if(flagk1==0)
{
if(k1==0)//上升按键有效
{
delay(10);
if(k1==0)
{
flag=0;
beep=0;//上升时开启国歌
TR0=1;//上升时电机启动
flagk1=1;//上升时关闭上升标志
flagk2=1;//上升时打开下降标志
dir=1;
raise=0x2b;
display2(0,raise);//上升时液晶显示+
}
}
while(!
k1);
}
if(flagk2==1)
{
if(k2==0)//下降按键有效
{
delay(10);
if(k2==0)
{
flag=0;
flagk1=0;//下降时打开上升标志
flagk2=0;//下降时关闭下降标志
beep=1;//下降时关闭国歌
TR0=1;//下降时电机启动
dir=0;
raise=0x2d;
display2(0,raise);//下降时液晶显示—
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动控制 升降 技术 报告