简易旋转倒立摆及控制装置.docx
《简易旋转倒立摆及控制装置.docx》由会员分享,可在线阅读,更多相关《简易旋转倒立摆及控制装置.docx(15页珍藏版)》请在冰豆网上搜索。
简易旋转倒立摆及控制装置
Preparedon22November2020
简易旋转倒立摆及控制装置
2013年全国大学生电子设计竞赛
简易旋转倒立摆及控制装置(C题)
【本科组】
2013年9月7日
摘要
本题要求设计一个简易旋转倒立摆及控制系统,其中角度传感器、步进电机和单片机890C521是系统核心部件。
系统接收角度传感器反馈的信号,通过PCF8591将接收的信号转换成数字信号,将数值送入单片机中进行计算,可得出摆杆的位置,进而单片机控制步进电机,对摆杆进行控制,达到所要的旋转或者倒立的控制目标。
关键词:
简易旋转倒立摆步进电机单片机角度传感器
简易旋转倒立摆及控制装置(C题)
【本科组】
1设计任务及要求
设计任务
设计并制作一套简易旋转倒立摆及其控制装置。
旋转倒立摆的结构如图1-1所示。
电动机A固定在支架B上,通过转轴F驱动旋转臂C旋转。
摆杆E通过转轴D固定在旋转臂C的一端,当旋转臂C在电动机A驱动下作往复旋转运动时,带动摆杆E在垂直于旋转臂C的平面作自由旋转。
图1-1旋转倒立摆结构示意图
基本要求
(1)摆杆从处于自然下垂状态(摆角0°)开始,驱动电机带动旋转臂作往复旋转使摆杆摆动,并尽快使摆角达到或超过-60°~+60°;
(2)从摆杆处于自然下垂状态开始,尽快增大摆杆的摆动幅度,直至完成圆周运动;
(3)在摆杆处于自然下垂状态下,外力拉起摆杆至接近165°位置,外力撤除同时,启动控制旋转臂使摆杆保持倒立状态时间不少于5s;期间旋转臂的转动角度不大于90°。
2主控制器件的论证与选择
控制器选用
方案一:
采用ARM,运行速度快,引脚多,内部资源丰富,具有很高的运算速率,但是价格较高,对于初学者,ARM不易掌握.
方案二:
采用STC89C52单片机,选用STC89C52单片机作为控制核心,它具有8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,且容易烧录,使用方便。
所以我们选用STC89V52作为主控芯片
控制系统方案选择
方案一:
采用在面包板上搭建简易单片机系统
在面包板上搭建单片机系统可以方便的对硬件做随时修改,也易于搭建,但是系统连线较多,不仅相互干扰,使电路杂乱无章,而且系统可靠性低。
方案二:
自制单片机印刷电路板
自制印刷电路实现较为困难,实现周期长,此外也会花费较多的时间,影响整体设计进程。
方案三:
采用单片机最小系统。
单片机最小系统,能明显减少外围电路的设计,降低系统设计的难度,非常适合本系统的设计。
综上所述,我们选择方案三。
角度的获取模块论证与选择
方案一:
采用加速度传感器
加速度传感器采用模拟量输出,需要放大电路及A/D完成角度的测量,测量精度高,但是摆杆上不易安装重物,且不易固定。
方案二:
采用增量式光电旋转编码器
光电旋转编码器是一种角度(角速度)检测装置,它将输入给轴的角度量,利用光电转换原理转换成相应的电脉冲。
旋转编码器具有体积小,精度高,工作可靠,接口数字化等优点。
但是旋转编码器安装较为不便,增加了系统硬件电路设计的工作量。
方案三:
采用电位器作为角度传感器
简易旋转倒立摆系统的角度测量也可采用可变电阻器。
精密的可变电阻器具易获得、重复性高、分辨率高、高频响应特性好、易使用等特点。
且电位器传感器结构简单,体积小,价格低廉,受环境因素影响小,性能稳定。
综合以上三种方案微调电位器可以很好地达到我们的要求,角度有效范围载度左右,由于本课题精度不高,考虑带经济性和灵活性,我们选择方案三。
步进电机及其驱动模块的选择
方案一:
采用直流减速电机,转速较低,反应速度慢,但是驱动模块简单。
方案二:
采用型号为57步进电机,为两相四线步进电机,它的步距角仅为°,扭矩为m,有较高的空载启动频率,在十六细分后能实现°的步距角能够满足本系统的控制要求,驱动电路较复杂,用42/57专用驱动模块TB6560AHQ驱动,能满足要求,而驱动L298N模块功率较小,无法满足要求,易造成失步。
最终选定的步进电机为57步进电机,驱动电路模块选用TB6560AHQ模块。
AD/DA的选择
方案一:
采用ADC0832
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度慢且稳定性能较差,而且占用I/O口多。
方案二:
采用PCF8591
PCF8591具有I2C总线结构的多通道8bits的逐次逼近型ADC和一个内置8bits单通道ADC,功能多,速度超快,功耗低,单电源供电,串行输入输出,节约I/O口资源,并能在一个处理系统中外接多个PCF8591,能进行更多更强的处理。
综上,从各方面考虑,我们选择方案二。
3系统的硬件设计
总体电路框图
为了使系统能够实现各种复杂的控制功能,本设计采用一种功能强大的、高速低功耗性价比高的单片机STC89C52完成对其他部分控制。
本设计采用SV01A103AEA01R00旋转角度传感器(旋转电位器)对摆杆的倾斜角度进行数据采集,通过PCF8591D/A转换芯片将数据送入单片机,单片机通过数据分析控制TB6560AHQ驱动电路,进而控制步进电机使步进机旋转达到设定的位置,用数码管显示A/D的数据。
总体框图如图3-1所示。
按键电路模式选择择
电源
单
片
机
驱动
模块
步
进
机
数码管显示
传
感
器
AD
模块
图3-1系统框图
系统电路与程序设计
3.2.1STC89C52单片机最小系统
最小系统包括复位、按键、显示和电源部分,而下载模块用单片机最小系统直接下载,减少了系统的浪费,而且防止连续的拔插单片机。
STC89C52单片机最小系统如图3-4所示。
图3-4最小系统
3.2.2PCF8591模块图如图3-2。
图3-2PCF8591模块图
3.3.3模块芯片TB6560AHQ原理图如图3-3。
图3-3模块芯片TB6560AHQ原理图
3.3.4供电电源
由于需要驱动57步进电机,防止失步,其需要的功率较大,我们采用现有的直流稳压电源直接供电,电源模块的示意图如图3-5。
为了达到较好的工作效果,我们选用兆信RXD-302-Ⅱ双路电源供电,具有很好的可靠性和灵活性,电压电流均可调,而且还在带一个5V电压输出端。
图3-5电源电路
4系统软件总体设计框图
如图4-1所示。
初始化
模式选择
读倾角传感器电压
A/D转换
单片机处理读到的A/D数据
控制驱动电机转动
摆杆是否达到要求状态
否
结束
是
图4-1总体程序框图
5测试方案与测试结果
测试结果(S)
模式
模式一
模式二
第一次
49
25
第二次
34
35
这次设计的要求,所设计的系统要有较高的灵敏度和相应的转矩,这两样是最为重要的,我们所设计的系统,不能很好地满足要求,有待进一步改进
6总结
经过四天三夜的辛勤努力,此次基于单片机为控制核心的简易旋转倒立摆的系统设计终于完成。
通过合理的系统构建和软件编程,本系统也未能够完成题目的要求,实现摆杆的旋转及倒立,实际测试表明,所设计系统的稳定性有待改进。
但由于时间紧,任务重,系统还有一些功能未能实现,比如摆杆在受到干扰后,能够及时恢复倒立状态。
若经过改进,相信性能还会有进一步的提升。
本次竞赛极大的锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。
参考文献
[1]刘宝延.步进电机及其驱动控制系统[M].哈尔滨:
哈尔滨工业大学出版社,1972.
[2]周航慈.单片机应用程序设计技术[M].北京:
北京航空航天大学出版社,1991.
[3]郁有文.传感器原理及工程应用[M].西安:
西安电子科技大学出版,2008.
[4]宋戈.51单片机应用开发范例大全[M].北京:
人民邮电出版社,2010.
[5]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2009.
[6]吴建平.传感器原理及应用[M].北京:
机械工业出版社,2009.
[7]唐继贤.51单片机工程应用实例[M].北京:
北京航空航天大学出版社,2009.
附录
第一部分
$NOMOD51
;------------------------------------------------------------------------------
;ThisfileispartoftheC51Compilerpackage
;Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.
;------------------------------------------------------------------------------
;:
Thiscodeisexecutedafterprocessorreset.
;
;TotranslatethisfileuseA51withthefollowinginvocation:
;
;A51
;
;Tolinkthemodifiedfiletoyourapplicationusethefollowing
;BL51invocation:
;
;BL51,
;
;------------------------------------------------------------------------------
;
;User-definedPower-OnInitializationofMemory
;
;WiththefollowingEQUstatementstheinitializationofmemory
;atprocessorresetcanbedefined:
;
;;theabsolutestart-addressofIDATAmemoryisalways0
IDATALENEQU80H;thelengthofIDATAmemoryinbytes.
;
XDATASTARTEQU0H;theabsolutestart-addressofXDATAmemory
XDATALENEQU0H;thelengthofXDATAmemoryinbytes.
;
PDATASTARTEQU0H;theabsolutestart-addressofPDATAmemory
PDATALENEQU0H;thelengthofPDATAmemoryinbytes.
;
;Notes:
TheIDATAspaceoverlapsphysicallytheDATAandBITareasofthe
;8051CPU.AtminimumthememoryspaceoccupiedfromtheC51
;run-timeroutinesmustbesettozero.
;------------------------------------------------------------------------------
;
;ReentrantStackInitilization
;
;ThefollowingEQUstatementsdefinethestackpointerforreentrant
;functionsandinitializedit:
;
;StackSpaceforreentrantfunctionsintheSMALLmodel.
IBPSTACKEQU0;setto1ifsmallreentrantisused.
IBPSTACKTOPEQU0FFH+1;settopofstacktohighestlocation+1.
;
;StackSpaceforreentrantfunctionsintheLARGEmodel.
XBPSTACKEQU0;setto1iflargereentrantisused.
XBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.
;
;StackSpaceforreentrantfunctionsintheCOMPACTmodel.
PBPSTACKEQU0;setto1ifcompactreentrantisused.
PBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.
;
;------------------------------------------------------------------------------
;
;PageDefinitionforUsingtheCompactModelwith64KBytexdataRAM
;
;ThefollowingEQUstatementsdefinethexdatapageusedforpdata
;variables.TheEQUPPAGEmustconformwiththePPAGEcontrolused
;inthelinkerinvocation.
;
PPAGEENABLEEQU0;setto1ifpdataobjectareused.
;
PPAGEEQU0;definePPAGEnumber.
;
PPAGE_SFRDATA0A0H;SFRthatsuppliesuppermostaddressbyte
;(most8051variantsuseP2asuppermostaddressbyte)
;
;------------------------------------------------------------------------------
;StandardSFRSymbols
ACCDATA0E0H
BDATA0F0H
SPDATA81H
DPLDATA82H
DPHDATA83H
NAMEC_STARTUP
C_C51STARTUPSEGMENTCODE
STACKSEGMENTIDATA
RSEGSTACK
DS1
EXTRNCODE(C_START)
PUBLICC_STARTUP
CSEGAT0
C_STARTUP:
LJMPSTARTUP1
RSEGC_C51STARTUP
STARTUP1:
IFIDATALEN<>0
MOVR0,#IDATALEN-1
CLRA
IDATALOOP:
MOV@R0,A
DJNZR0,IDATALOOP
ENDIF
IFXDATALEN<>0
MOVDPTR,#XDATASTART
MOVR7,#LOW(XDATALEN)
IF(LOW(XDATALEN))<>0
MOVR6,#(HIGH(XDATALEN))+1
ELSE
MOVR6,#HIGH(XDATALEN)
ENDIF
CLRA
XDATALOOP:
MOVX@DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF
IFPPAGEENABLE<>0
MOVPPAGE_SFR,#PPAGE
ENDIF
IFPDATALEN<>0
MOVR0,#LOW(PDATASTART)
MOVR7,#LOW(PDATALEN)
CLRA
PDATALOOP:
MOVX@R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF
IFIBPSTACK<>0
EXTRNDATA(C_IBP)
MOVC_IBP,#LOWIBPSTACKTOP
ENDIF
IFXBPSTACK<>0
EXTRNDATA(C_XBP)
MOVC_XBP,#HIGHXBPSTACKTOP
MOVC_XBP+1,#LOWXBPSTACKTOP
ENDIF
IFPBPSTACK<>0
EXTRNDATA(C_PBP)
MOVC_PBP,#LOWPBPSTACKTOP
ENDIF
MOVSP,#STACK-1
;ThiscodeisrequiredifyouusewithBankingMode4
;EXTRNCODE(B_SWITCH0)
;CALLB_SWITCH0;initbankmechanismtocodebank0
LJMPC_START
END
第二部分
/**********************************************************************************
*标题:
*************DA-AD试验********************
*
/******************************主程序*****************************************************/
#include<>
#include<2C>
#definePCF85910x90138A138C3f4f7f6f8a2c2c2c2c2c2c2c138A138C138A138C138A138C138A138C138A138C138A138C138A138C138A138C2C2C2C2C2c2C2C
********************************************************************/
voidStart_I2c()
{
SDA=1;/*发送起始条件的数据信号*/
_Nop();
SCL=1;
_Nop();/*起始条件建立时间大于,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;/*发送起始信号*/
_Nop();/*起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0;/*钳住I2C总线,准备发送或接收数据*/
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型:
voidStop_I2c();
功能:
结束I2C总线,即发送I2C结束条件.
********************************************************************/
voidStop_I2c()
{
SDA=0;/*发送结束条件的数据信号*/
_Nop();/*发送结束条件的时钟信号*/
SCL=1;/*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1;/*发送I2C总线结束信号*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字节数据发送函数
函数原型:
voidSendByte(UCHARc);
功能:
将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1;ack=0表示被控器无应答或损坏。
********************************************************************/
voidSendByte(unsignedcharc)
{
unsignedcharBitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)/*要传送的数据长度为8位*/
{
if((c<elseSDA=0;
_Nop();
SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/
_Nop();
_Nop();/*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1;/*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
elseack=1;/*判断是否接收到应答信号*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字节数据接收函数
函数原型:
UCHARRcvByte();
功能:
用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
unsignedcharRcvByte()
{
unsignedcharretc;
unsignedcharBitCnt;
retc=0;
/*置数据线为输入方式*/
for