最新单级倒立摆.docx
《最新单级倒立摆.docx》由会员分享,可在线阅读,更多相关《最新单级倒立摆.docx(21页珍藏版)》请在冰豆网上搜索。
最新单级倒立摆
单级倒立摆
摘要
本系统以atmega16为平台,主要由机械倒立装置及单片机自动控制组成,将装在摆杆的角度传感器GY-61得到的数据进行处理,利用摆杆倒立摆动过程中受力的分析和实验数据总结对摆杆板调节一定的角度,提高了倒立摆装置自动控制的稳定性。
通过PWM技术动态控制电机的转速、方向和PID控制调节,实现装置设计的各种要求,达到了设计目的,完成了设计功能。
关键词:
角度传器;电动机;倒立摆;反馈;倒立控制;PID控制
Abstract
ThesystemtakingATmega16astheplatform,mainlycomposedofamechanicaldeviceandmicrocomputerautomaticcontrolsystem,forprocessingwillbeinstalledintheGY-61pendulumanglesensordata,summarizethependulumplateadjustingcertainanglebyanalysisandexperimentdataforcependuluminvertedtheoscillatingprocess,improvesthestabilityofinvertedswingdeviceforautomaticcontrol.Byadjustingthespeed,controlthedirectionandPIDdynamicPWMtechnologytocontrolthemotor,toachieveavarietyofdevicedesignrequirements,achievethedesignpurpose,completedthedesignfunction.
Keywords:
Anglesensor;Motor;Invertedpendulum;invertedcontrol;Feedback;PIDcontrol
1方案论证1
方案一:
AT89C51为8位单片机,具有一定算术运算功能,编程软件灵活、自由度大;具有功耗较低、体积小、技术成熟和成本低等优点,得到了广泛应用;使用AT89C51与AD采集芯片PCF8591,通过AD采集芯片PCF8591对角度传感器信号进行采集传给单片机,单片通过PID控制算法使定时器产生变化的PWM波及波形持续时间,输入电机驱动板控制电机的转速和角度。
运算速度较慢。
引脚图,如下图1-1:
1
1.1电机的选择3
2总体方案3
图2-1总体方案框图4
3电路设计4
3.1Atmega16及其AD电路,如图3-1:
4
3.2内部PWM发生模式5
3.3直流电机驱动电路6
3.4PID控制8
4软件设计8
5系统测试9
6误差分析与改进方法9
7小结10
参考文献10
附录一:
元件明细表10
附录二:
仪器设备清单11
附录三:
电路图图纸11
1方案论证
方案一:
AT89C51为8位单片机,具有一定算术运算功能,编程软件灵活、自由度大;具有功耗较低、体积小、技术成熟和成本低等优点,得到了广泛应用;使用AT89C51与AD采集芯片PCF8591,通过AD采集芯片PCF8591对角度传感器信号进行采集传给单片机,单片通过PID控制算法使定时器产生变化的PWM波及波形持续时间,输入电机驱动板控制电机的转速和角度。
运算速度较慢。
引脚图,如下图1-1:
图1-18051引脚图
缺点:
51单片内部资源有限,内部没有集成的A/D转换器,在一些需要数据采的应用场合,需要外扩A/D转换器,硬件连接较复杂,给系统设计过程带来不便。
方案二:
使用atmega16内部集成了10位A/D转换器,可对角度传感器信号进行采集与处理,还集成了PWM的功能,硬件电路连接较简单,系统运行稳定。
运算速度较快。
Atmega16简介:
ATmega16是基于增强的AVRRISC结构的低功耗8位CMOS微控制器。
由于其先进的指令集以及单时钟周期指令执行时间,ATmega16的数据吞吐率高达1MIPS/MHz,从而可以减缓系统在功耗和处理速度之间的矛盾。
ATmega16AVR内核具有丰富的指令集和32个通用工作寄存器。
所有的寄存器都直接与运算逻单元(ALU)相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。
这种结构大大提高了代码效率,并且具有比普通的CISC微控制器最高至10倍的数据吞吐率。
ATmega16有如下特点:
16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装)的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式。
工作于空闲模式时CPU停止工作,而USART、两线接口、A/D转换器、SRAM、T/C、SPI端口以及中断系统继续工作;停电模式时晶体振荡器[1]停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余功能模块处于休眠状态;ADC噪声抑制模式时终止CPU和除了异步定时器与ADC以外所有I/O模块的工作,以降低ADC转换时的开关噪声;Standby模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby模式下则允许振荡器和异步定时器继续工作。
引脚图如图1-2:
图1-2Atmega16引脚图
缺点:
价格稍显昂贵,编程较复杂。
方案三:
使用STM32F103内部集成了1μs的双12位ADC,可对角度传感器信号进行采集与处理。
硬件电路连接较简单,低功耗,系统运行稳定。
最高工作频率72MHz,运算速度较快。
STM32引脚如图1-3:
图1-3STM32引脚图
缺点:
价格昂贵,编程复杂。
最终选择方案:
方案二。
因倒立摆摆动速度快,对ADC采样速率及运算速度要求较高,所以我们这里选择方案二。
方案三因价格昂贵,编程复杂,所以在这里我们不做考虑。
1.1电机的选择
方案一:
采用步进电机,步进电机具有控制简单、定位精度高、无累计误差等优点。
缺点:
扭矩较小,反应动作较慢,价格昂贵。
方案二:
机构动力部分选用伺服电机,能精确控制转动角度、速度。
缺点:
扭矩较大,反应动作较慢,价格昂贵。
方案三:
采用直流电机,直流电机具有最优越的调速性能,主要表现在调速方便(可无级调速)、调速范围宽、低速性能好、运行平稳、噪音低、效率高的优点。
最终选择方案:
方案三。
由于系统中电机控制平板倾角需要较高的控制精度,
基于直流电机和步进电机的特点,所以这里选择直流电机。
2总体方案
当角度传感器随摆杆转动的时候,通过atmega16集成的ADC读取到相应的数据传给atmega16的PID控制算法,算出相应的值用以控制PWM发生器产生相应控制的PWM实现调节,如图2-1:
图2-1总体方案框图
3电路设计
3.1Atmega16及其AD电路,如图3-1:
图3-1Atmega16及其AD电路
ATmega16有一个10位的逐次逼近型ADC。
ADC与一个8通道的模拟多路复用器连接,能对来自端口A的8路单端输入电压进行采样。
单端电压输入以0V(GND)为基准。
器件还支持16路差分电压输入组合。
两路差分输入(ADC1、ADC0与ADC3、ADC2)有可编程增益级,在A/D转换前给差分输入电压提供0dB(1x)、20dB(10x)或46dB(200x)的放大级。
七路差分模拟输入通道共享一个通用负端(ADC1),而其他任何ADC输入可做为正输入端。
如果使用1x或10x增益,可得到8位分辨率。
如果使用200x增益,可得到7位分辨率。
ADC包括一个采样保持电路,以确保在转换过程中输入到ADC的电压保持恒定。
当ATmega16的31脚接VCC时,则5V作为内部AD的参考电压。
悬空时,内部AD参考电压为内部2.56V作为参考电压晶振选择为16MHz,提高AD采集速度。
这里我们采用的是10位内部2.56V作为参考电压。
ADC转换结果
转换结束后(ADIF为高),转换结果被存入ADC结果寄存器(ADCL,ADCH)。
单次转换的结果如下,式3-1:
(3-1)
式中,VIN为被选中引脚的输入电压,VREF为参考电压。
0x000代表模拟地电平,0x3FF代表所选参考电压的数值减去1LSB。
如果使用差分通道,结果如式3-2:
(3-2)
式中,VPOS为输入引脚正电压,VNEG为输入引脚负电压,GAIN为选定的增益因子,且VREF为参考电压。
结果用2的补码形式表示,从0x200(-512d)到0x1FF(+511d)。
如果用户希望对结果执行快速极性检测,它充分读结果的MSB(ADCH中ADC9)。
如果该位为1,结果为负;该位为0,结果为正。
3.2内部PWM发生模式
Atmega16的PWM模式分为:
普通模式、CTC(比较匹配时清零定时器)模式、快速PWM模式、相位修正PWM模式。
这里我们选择的是快速PWM模式。
快速PWM模式工作原理:
快速PWM模式(WGM01:
0=3)可用来产生高频的PWM波形。
快速PWM模式与其他PWM模式的不同之处是其单斜坡工作方式。
计数器从BOTTOM计到MAX,然后立即回到BOTTOM重新开始。
对于普通的比较输出模式,输出比较引脚OC0在TCNT0与OCR0匹配时清零,在BOTTOM时置位;对于反向比较输出模式,OC0的动作正好相反。
由于使用了单斜坡模式,快速PWM模式的工作频率比使用双斜坡的相位修正PWM模式高一倍。
此高频操作特性使得快速PWM模式十分适合于功率调节,整流和DAC应用。
高频可以减小外部元器件(电感,电容)的物理尺寸,从而降低系统成本。
工作于快速PWM模式时,计数器的数值一直增加到MAX,然后在后面的一个时钟周期清零。
具体的时序图为Figure32。
图中柱状的TCNT0表示这是单边斜坡操作。
方框图同时包含了普通的PWM输出以及反向PWM输出。
TCNT0斜坡上的短水平线表示OCR0和TCNT0的比较匹配。
快速PWM模式时序图,如图3-2:
图3-2快速PWM模式时序图
计时器数值达到MAX时T/C溢出标志TOV0置位。
如果中断使能,在中断服务程序可以更新比较值。
工作于快速PWM模式时,比较单元可以在OC0引脚上输出PWM波形。
设置COM01:
0为2可以产生普通的PWM信号;为3则可以产生反向PWM波形。
要想在引脚上得到输出信号还必须将OC0的数据方向设置为输出。
产生PWM波形的机理是OC0寄存器在OCR0与TCNT0匹配时置位(或清零),以及在计数器清零(从MAX变为BOTTOM)的那一个定时器时钟周期清零(或置位)。
输出的PWM频率可以通过如下公式计算得到,如式3-3:
(3-3)
变量N代表分频因子(1、8、64、256或1024)。
OCR0寄存器为极限值时表示快速PWM模式的一些特殊情况。
若OCR0等于BOTTOM,输出为出现在第MAX+1个定时器时钟周期的窄脉冲;OCR0为MAX时,根据COM01:
0的设定,输出恒为高电平或低电平。
通过设定OC0在比较匹配时进行逻辑电平取反(COM01:
0=1),可以得到占空比为50%的周期信号。
OCR0为0时信号有最高频率foc2=fclk_I/O/2。
这个特性类似于CTC模式下的OC0取反操作,不同之处在于快速PWM模式具有双缓冲。
3.3直流电机驱动电路
直流电机驱动电路如图3-3所示:
图3-3直流电机驱动电路
L298是意大利SGS半导体公司生产的步进电机专用控制器,它能产生4相控制信号,可用于计算机控制的两相双极和四相单相步进电机,能够用单四拍、双四拍、四相八拍方式控制步进电机。
芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的电机绕组中的电流。
该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。
变换器是一个重要组成部分。
变换器由一个三倍计算器加某些组合逻辑电路组成,产生一个基本的八格雷码(。
由变换器产生4个输出信号送给后面的输出逻辑部分,输出逻辑提供禁止和斩波器功能所需的相序。
为了获得电动机良好的速度和转矩特性,相序信号是通过2个PWM斩波器控制电动波器包含有一个比较器、一个触发器和一个外部检测电阻,如图4所示,晶片内部的通用振荡器提供斩波频率脉冲。
每个斩波器的触发器由振荡器的脉冲调节,当负载电流提高时检测电阻上的电压相对提高,当电压达到Uref时(Uref是根据峰值负载电流而定的),将触发器重置,切断输出,直至第二个振荡脉冲到来、此线路的输出(即触发器Q输出)是一恒定速率的PWM信号,L297的CONTROL端的输入决定斩波器对相位线A,B,C,D或抑制线INH1和INH2起作用。
CONTROL为高电平时,对A,B,C,D有抑制作用;为低电平时,则对抑制线INH1和INH2有抑制作用,从而可对电动机和转矩进行控制。
引脚图如图3-4:
图3-4L298引脚图
3.4PID控制
PID控制MATLAB仿真如图3-5:
图3-5PID控制MATLAB仿真如图
4软件设计
主控制芯片为ATmega16,编程语言为C语言,,编程平台采用AVRstudio,.软件流程图,如图4-1:
5、系统测试
图4-1软件流程图
5系统测试
5.1测试使用的仪器与测试方法
(1)测试仪器设备
稳压电源、VC890D数字万用表、DS1022C示波器、秒表、直尺、量角器。
(2)测试方法
测量当前平板倾角值与角位移传感器两侧电压的A/D采样值对应关系,如表5-1所示:
表5-1平板倾角值与角位移传感器两侧电压的A/D采样值
角度
-40
-30
-20
-10
0
10
20
30
40
AD值
503
540
601
629
672
709
739
820
894
5.2指标测试和测试结果如表5-2所示:
表5-2实验测试数据表
角度
-40
-30
-20
-10
0
10
20
30
40
AD值
503
540
601
629
672
709
739
820
894
电压
1.25
1.35
1.50
1.57
1.68
1.77
1.84
2.05
2..22
6误差分析与改进方法
误差分析:
(1)机械结构连接不紧凑造成的机构震动,给单片机控制带来较大的误差。
(2)直流减速电机中的减速器中齿轮中存在的间隙在电机转动的时候也会带来较大的震动。
(3)摆杆连接位置没用选用轴承,而是一个拆机小电机做成的,产生误会较大。
(4)旋臂配重不很均匀,导致有些许上下摆动。
改进方法:
(1)固定完所以不必要的自由度,使结构更加紧凑,减少一些不必要的震动。
(2)选择不带减速器的电机。
(3)改用轴承连接。
(4)掌握好旋臂的平衡配重比。
7小结
在本次竞赛中,我们各自发挥各自的优点,经过辛勤的努力,从而使我们能优秀的完成了部分作品。
与此同时我们积极起草各种器件选型方案,确定最终的使用方案。
通过这次竞赛,我们将理论与实际相结合,将学习的电子方面知识充分应用到本次设计中,充分利用了Atmega16单片机的功能,夯实了基础,提高了理论联系实际的能力,更提高了电子设计方面的综合能力。
此次大赛不仅为我们提供了一次难得的检验自己学习知识的平台,也锻炼了队员的吃苦能力。
在比赛以后的时间里,我们会继续我们电子设计的爱好,设计出更好的作品。
努力向前,永不退缩。
参考文献
[1]范红刚,宋彦佑,董翠莲.AVR单片机自学笔记[M].北京:
北京航天大学出版社,2012.
[2]谭浩强.C程序设计[M].北京:
清华大学出版社,2005年7月.
[3]华成英.模拟电子技术基础[M],北京:
高等教育出版社,2000.
[4]阎石.数字电子技术基础[M].北京:
高等教育出版社,2008.
[5]张毅刚.单片机原理及应用[M].北京:
高等教育出版社,2004.
附录一:
元件明细表
1、Atmega16单片机
2、GX-61角度传感器模块
3、L298电机驱动芯片
4、1N4001二极管若干
5、角铝若干
6、螺母若干
7、亚克力板若干
附录二:
仪器设备清单
1、低频信号发生器
2、数字万用表
3、失真度测量仪
4、数字示波器
5、稳压电源
6、逻辑分析仪
附录三:
电路图图纸
附录四
程序清单:
/*******************Mega16头文件*************/
#include
#defineFMQHPORTC|=(1<<3);
#defineFMQLPORTC&=~(1<<3);
voiddelay(unsignedcharaa,unsignedcharbb,unsignedcharcc);
/**************mega16_ADC初始化函数声明*************/
unsignedintADC_init(void);
voiddelay1();
unsignedintadc_l,adc_h;
/**************PID函数声明*************/
doublePIDCalc(PID*pp,doublenext);
voidPIDInit(PID*pp);
/**************PID结构体声明*************/
typedefstructPID{
doubleinit;//设定目标
doubleKp;//比例常数
doubleTi;//积分常数
doubleKd;//微分常数
doublefirst;//一阶误差
doubleend;//二阶误差
doublesum;//误差总和
}PID;
/*********************主函数*****************/
intmain()
{
unsignedinta,b,i,ave[8],sum_2=0,max,min,qian,bai,shi,ge;
PIDsPID;//PID控制结构体
doubleouput;//PID响应变量
doubleinput;//PID输入变量
DDRC=0xff;
DDRD=0xff;
DDRB=0xff;
TCCR0=0x6c;
TCNT0=0x00;
PIDInit(&sPID);
SPID.Kp=4;
sPID.Ti=0.02;
sPID.Kd=20;
sPID.init=1700
init();
while
(1)
{
ADC_init();
/******************软件滤波************/
/*for(i=0;i<=7;i++)
{
adc_l=ADCL;
adc_h=ADCH;
a=adc_h*256;
b=adc_l+a;
ave[i]=b;
}
max=ave[0];min=ave[0];
for(i=0;i<=7;i++)
{
if(ave[i]>=max)
max=ave[i];
if(ave[i]min=ave[i];
Sum_2+=ave[i];
}
b=(sum_2-max-min)/6;
input=b;
ouput=PIDCalc(&sPID,input);
adc_l=ADCL;
adc_h=ADCH;
a=adc_h*256;
b=adc_l+a;
b-=631;
if(b>=724)
b+=793;
else
b+=852;
if((1680<=b)&&(b<=1710))
b+=2;
if((1670<=b)&&(b<1680))b-=2;
if((1660<=b)&&(b<1670))b-=2;
if((1620<=b)&&(b<1660))b-=3;
if((1610<=b)&&(b<1620))b-=2;
if((1600<=b)&&(b<1610))b+=3;
if((1590<=b)&&(b<1600))b+=4;
if((1578<=b)&&(b<1590))b+=6;
if((1560<=b)&&(b<1578))b+=8;
input=b;/
ouput=PIDCalc(&sPID,input);
ouput=1710-ouput;
ouput=ouput*0.139;
OCR0=ouput;
}
}
voiddelay(unsignedcharaa,unsignedcharbb,unsignedcharcc)
{
for(aa=0;aa<15;aa++)
for(bb=0;bb<3;bb++)
for(cc=0;cc<220;cc++);
}
unsignedintADC_init(void)//mage16
{
DDRA&=~(1<<0);
PORTA&=~(1<<0);
ADMUX|=0x40;
ADCSRA|=0xe0;
SFIOR|=0x00;
return0;
}
doublePIDCalc(PID*pp,doublenext)
{
doubledError,Error;
Error=pp->init-next;//偏差
pp->sum+=Error;//积分
dError=Error-pp->first;//当前微分
pp->end=pp->first;
pp->first=Error;
return(pp->Kp*Error//比例项
+pp->Ti*pp->sum//积分项
+pp->Kd*dError);//微分项
}
voidPID