河北省电子设计竞赛省一简易旋转倒立摆及控制装置.docx
《河北省电子设计竞赛省一简易旋转倒立摆及控制装置.docx》由会员分享,可在线阅读,更多相关《河北省电子设计竞赛省一简易旋转倒立摆及控制装置.docx(28页珍藏版)》请在冰豆网上搜索。
![河北省电子设计竞赛省一简易旋转倒立摆及控制装置.docx](https://file1.bdocx.com/fileroot1/2023-2/3/1f1184eb-a479-481a-9f63-509eeb3092f2/1f1184eb-a479-481a-9f63-509eeb3092f21.gif)
河北省电子设计竞赛省一简易旋转倒立摆及控制装置
河北省大学生校园“挑战杯”竞赛作品申报表
作品名称
旋转倒立摆及控制装置
作品分类
甲类:
已创业()乙类:
未创业(√)
作品
所属
领域
分组
1.产品(√)
A.农林、畜牧、食品及相关产业组
B.生物医药组C.化工技术、环境科学组
D.电子信息组E.材料组F.机械能源组
2.服务()
G.服务咨询组
参赛学校
(全称)
河北联合大学
所在市
唐山市
团队
主要
成员
姓名
性别
年龄
年级、
专业
备注
(负责人)
王剑秋
男
20
11级电气工程
王剑秋
樊佳良
男
22
11级测控
曹永策
男
20
11级测控
团队
联系
方式
通讯地址
河北省唐山市
邮编
063000
电话
手机
182********
指导教师
通讯地址
邮编
电话
手机
作品简介
(200字
以内)
倒立摆是典型的快速、多变量、非线性、强耦合、自然不稳定系统。
一级倒立摆系统由于其本身是自不稳定系统,实验建模存在一定困难,所以采用PID控制算法。
通过角度传感器反馈的不同角度,判断摆杆的位置,采用闭环控制系统控制摆杆的摆动。
本系统采用ATMEGA32AVR单片机,BTS7960驱动直流大功率电机。
要想使摆杆更快、更稳的倒立,调节Ki、Kp、Kd相关PID参数是关键。
经测试,系统基本完成了全部要求。
学校
意见
盖章:
年月日
省级评委会
意见
签名:
年月日
备 注
旋转倒立摆及控制装置设计与总结报告
1系统方案……………………………………………………………2
1.1主控系统选择……………………………………………………3
1.2电机选择…………………………………………………………3
1.3电机控制系统选择………………………………………………3
1.4角度传感模块选择………………………………………………3
2理论分析与计算………………………………………………………4
2.1系统组成…………………………………………………………4
2.2电机控制系统……………………………………………………5
2.2摆杆状态检测……………………………………………………6
2.3驱动与控制算法………………………………………………5
3测试方案与测试结果………………………………………………6
3.1测试仪器………………………………………………………6
3.2测试方法…………………………………………………………6
3.3测试数据…………………………………………………………7
4参考文献……………………………………………………………7
5附录…………………………………………………………………8
附1:
部分元器件清单……………………………………………8
附2:
仪器设备清单…………………………………………………8
附3:
部分程序清单……………………………………………8
摘要:
倒立摆是典型的快速、多变量、非线性、强耦合、自然不稳定系统。
一级倒立摆系统由于其本身是自不稳定系统,实验建模存在一定困难,所以采用PID控制算法。
通过角度传感器反馈的不同角度,判断摆杆的位置,采用闭环控制系统控制摆杆的摆动。
本系统采用ATMEGA32AVR单片机,BTS7960驱动直流大功率电机。
要想使摆杆更快、更稳的倒立,调节Ki、Kp、Kd参数是关键。
经测试,系统基本完成了全部要求。
关键词:
倒立摆光电传感器单片机 电机驱动PID
Abstract
nvertedpendulumisatypicalmodelofmultivariable,nonlinear,strongcoupling,naturallyunstablesystem.Invertedpendulumsystembecauseofitsownsincetheunstablesystem,theexperimentalmodelhascertaindifficulty,sothePIDcontrolalgorithm.Throughthedifferentanglesensorfeedback,judgethependulumrodposition,closedloopcontrolsystemtocontroltheswingoftheswingrodby.ThesystemusesATMEGA32microcontrollerAVR,BTS7960driveDCmotorwithlargepower.Invertedpendulumtomakefaster,morestable,regulationofKi,Kp,Kdisthekey.Afterthetest,systemhasbasicallycompletedallrequirements.
Keywords:
InvertedPendulumPhotoelectricSensorSCMMotorDriverPID
1.系统方案
1.1主控系统选择
方案一:
采用高性能嵌入式系统,比如ARM。
如果采用此方案,可以很好的解决数据处理和控制功能,但是ARM价格昂贵且本阶段很少接触,在短时间内完成困难比较大。
方案二:
采用大规模可编程逻辑器件,如FPGA,CPLD但本题属于控制类,不适合采用此方案。
方案三:
采用51系列单片机。
其优点之一在于,它从内部硬件到软件有着一套完整的按位操作系统,即位处理器。
而且硬件结构合理,而且指令系统也更为规范。
缺点:
运行速度慢,I/O口驱动能力弱。
而且功耗比较高,抗干扰能力不强。
方案四:
采用AVR单片机,考虑到方案的可实行性和性价比,我们采用ATMEGA32单片机,此款单片机内部不分频,采用RISC精简指令集,可实现高速运算,存储空间大,I/O口驱动能力高,价格低廉,性价比极高。
1.2电机选择
本题是控制类题目,所以电机的选择尤为重要。
方案一:
选择直流电机,通过减速齿轮增大扭力,提高带负责能力。
直流电机的优点是价格便宜,控制容易,但难以精确控制是其一大弱点。
方案二:
选择步进电机。
步进电机的特点是可以精确控制电机选择步数和角度,缺点就是力矩转速小,容易失步,而且价格比较昂贵。
考虑到题目要求性价比高,所以我们选择直流电机,通过优良的控制算法,达到高精度定位。
1.3电机控制系统选择
方案一:
通过晶体三极管等分立元件搭H桥。
优点是价格便宜,结构简单,控制简单。
但由于晶体三极管的承载电流比较小,驱动能力受到限制,因为是分立元件,稳定性不敢保证,且体积比较大。
方案二:
采用集成芯片,如BTS7960等。
其优点是集成度高,电路简单,控制方便可靠,体积小,效率高。
考虑到旋转倒立摆需要的大扭力和转速,我们采用方案二。
BTS7960,驱动电流最高43A,其内阻很小,无需加散热片。
双BTS7960H桥驱动电路,具有强劲的驱动
和刹车效果,有效隔离单片机与电机驱动。
价格也比较适中。
1.4角度传感器的选择
方案一:
陀螺仪是用高速回转体的动量矩敏感壳体相对惯性空间绕正交于自转轴的一个或二个轴的角运动检测装置。
它根据物件运动和方向改变输出信号的电压值,
然后再用单片机的A/D转换器读取此输出信号,就可以检测其旋转的角度。
方案二:
光电编码器
1.光电编码器,又称光电轴角位置传感器。
是集成光—机—电为一体的数字测角装置,主要是以高精度计量光栅为检测元件,通过光电转换;
2.将轴的机械角位移信息以LED光源为介质通过光栅码盘转换成相应的数字代码,用他可以实现角位移、角速度、和角加速度及其他物理量的精确测量,输出信号与计算机相连接,不仅能够实现数字测量与数字控制,而且与其他同类用途的传感器相比,具有精度高、测量范围广、使用可靠、易于维护等优点;
小结:
经过几番仔细的论证和比较,我们决定了本系统主要模块方案如下:
角加速度控制方案:
采用测传统PID算法。
主控制器:
AVRATMEGA32单片机。
旋转臂方案:
大功率直流电机驱动。
电机控制系统:
大功率智能车电机驱动模块BTS796043A限流控制半导体制冷驱动。
2.电路设计
2.1系统组成
本系统由角加速度传感器,主控单片机,电机控制芯片,电机驱动模块,液晶显示模块,电源模块等组成。
图2.1系统组成原理图
2.2最小系统原理图
ATMEGA32具有32KB,系统内可编程Flash的高性能低功耗的8位AVR微控制器。
2.3电机控制系统
双BTS7960H桥驱动电路,具有强劲的驱动和刹车效果,有效隔离单片机与电机驱动。
图2.2电机控制和驱动原理图
2.3摆杆状态检测
摆杆长度0.2m摆动周期T=0.4707s
当摆杆旋至90度释放后,摆动周期70+;符合要求。
2.4驱动与控制算法
对于基础要求(3),其几何模型如图2.4-1所示;摆杆OA,长度为a,与竖直方向夹角为15度.摆杆OA延竖直面旋转,由于忽略了空气阻力,且旋转速度足够大,在瞬时,A点旋转到B点,此时O点仍然在初始位置。
在三角形CAB中求出角ACB。
.l
图2.4-1
旋转臂CA=CB=b;角ACB为旋转臂旋转角度;
在三角形OAB中,∠OAB=∠OBA,
且∠AOB=180-165=15°;
所以,据余弦定理,cos∠AOB=(OA²+OB²-AB²)/(2×OA×OB);
所以AB=d=√﹙OA²+OB²--2×OA×OB×cos∠AOB).
在三角形ABC中,AC=BC=b;
利用余弦定理:
cosθ=(AC²+BC²--AB²)/(2AC*BC);
综上,θ=arccos[1-(d²/2*b²)].
待让旋转臂逆时针旋转θ度后,倒立摆杆与旋转臂在地面垂直。
此刻,利用编码器作为闭环回路反馈值的测定装置,实时检测倒立摆杆的旋转角度,并传送给单片机,以控制旋转臂的转动。
构成闭环控制系统。
如图2.4-2所示。
倒立摆是典型的快速、多变量、非线性、强耦合、自然不稳定系统。
一级倒立摆系统由于其本身是自不稳定系统,实验建模存在一定困难,由于在实际建模中,对于摆杆的平衡位置(竖直向上方向)进行了近似线性化与处理,即将系统在平衡点附近进行近似:
当摆杆要与竖直向上方向之间的夹角a与1(单位:
弧度)相比很小时,即夹角a<<1.所以,当旋转臂来回运动过程中,只有保持摆杆微小震动前提下,系统的数学模型才具有意义。
一旦超出这个范围,系统模型的准确性就会大打折扣。
被控对象倒立摆杆的结构和参数不能完全掌握,而且得不到精确的数学模型,系统控制器的结构和参数必须依靠经验和现场调试来确定,所以我们应用PID控制技术。
即根据系统的误差,利用比例、微分计算出控制量进而进行控制。
本作品以ATMEGA32单片机为核心部件,利用闭环控制系统控制倒立摆的运动。
在设计中,我们尽量采用低功耗器件,力求硬件电路的经济性和精简性,充分发挥软件控制
灵活方便的特点,来满足设计要求。
3测试方案与测试结果
3.1测试仪器:
秒表;轻质量角器。
3.2测试方法:
基础要求
(1)
(2)(3),通过量角器直观的测试。
发挥部分
(1)
(2),通过秒表记录时间。
3.3测试数据:
基础一:
次数项目
占空比
计算摆角
实际摆角
时间
1
10%
18.66
21
5s
2
20%
45.21
43
3s
3
40%
68.76
72
2s
基础二:
次数项目
占空比
能否圆周
时间
1
10%
否
50s+
2
20%
否
50s+
3
40%
是
40s+
4
60%
是
26.87s
5
100%
是
3.23s
基础三:
次数项目
占空比
摆杆摆动角度
旋转臂角度
稳定时间
1
10%
不能倒立
360+
无
2
20%
不能倒立
240+
无
3
40%
40+
120+
20s+
4
60%
20+
60+
18s+
5
100%
10以内
40+
12s+
发挥一:
次数项目
起立时间
倒立时间
1
10%
无法倒立
2
20%
无法倒立
3
40%
40s+
4
60%
20s+
5
100%
5s左右
发挥二:
次数项目
摆角
能否继续倒立
恢复时间
1
10
能
2
20
能
3
30
能
4
40
能
5
50
能
发挥三:
次数项目
圈数
圆周时间
1
1
1.32s
2
2
1.08s
3
1
1.25s
4
3
1.04s
5
5
1.00s
4.参考文献
[1]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编[M].北京理工大学出版社,2007
[2]张飞舟,范跃祖,沈程智,李德毅,陈晖;利用云模型实现智能控制倒立摆[J];控制理论与应用;2000年04期
[3]单波,徐燕,赵建涛;预测控制算法及其在倒立摆中的应用[J];华北电力大学学报;2001年02期
{4]王轶卿,赵英凯;基于Bang-Bang控制的倒立摆系统摆起和镇定[J];机械与电子;2004年08期
[5]黄丹,周少武,吴新开,张志飞;基于LQR最优调节器的倒立摆控制系统[J];微计算机信息;2004年02期
5.附录
附1:
部分元器件清单
芯片:
ATMEGA32BTS7960LM2596
欧姆龙E6B2-CWZ6编码器7.2V镍镉电源5V稳压模块
电阻电容若干导线若干
单片机最小系统
附2:
仪器设备清单
秒表米尺万用表量角器示波器
附3.:
程序清单
#defineMAIN
#include
#include
#include
#include
#defineBAUD9600
//#defineUSART_JIESHOU_ON
#include
#include"shengming.h"
#include"pid.h"
#include"jianpan.h"
#include"xianshi.h"
#include"chushi.h"
voidmain()
{
init_5110();
init_usart();
init_bm();
chushi();
DDRA|=BIT
(2)|BIT(3);
PORTA|=BIT
(2)|BIT(3);
_delay_s
(1);
PORTA&=~BIT
(2)&~BIT(3);
_SEI();
while
(1)
{
jianpan();
}
}
#pragmavector=USART_RXC_vect
__interruptvoidkongzhi()
{
uca,str[6];
a=UDR;
switch(a)
{
case'+':
PID.kd++;
int__char(PID.kd,str);
usart_write_str("PID.kd:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
case'-':
PID.kd--;
int__char(PID.kd,str);
usart_write_str("PID.kd:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
case'1':
PID.kp++;
int__char(PID.kp,str);
usart_write_str("PID.kp:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
case'0':
PID.kp--;
int__char(PID.kp,str);
usart_write_str("PID.kp:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
case'2':
mohu++;
int__char(mohu,str);
usart_write_str("mohu:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
case'3':
mohu--;
int__char(mohu,str);
usart_write_str("mohu:
",9);
usart_write_str(str,6);
usart_write_char(0x0a);
usart_write_char(0x0d);
break;
default:
break;
}
}
/**************************PID调节pid.h******************************/
#ifndef__PID_H__
#define__PID_H__
DATA_SFR8(flag_pid);
struct{intset,act,error0,error1,error2,kp,ki,kd;}\
PID={500,0,0,0,0,974,0,0};
#defineSPEED_MAX8000
#defineSPEED_MIN3000
intmohu=5;
intuk=0;
voidzyb()
{
unsignedintlinshi;
if(flag_dj_sn)
{
DJ_NSHI;PORTA_Bit3=0;
}
else
{
DJ_SSHI;PORTA_Bit3=1;
}
linshi=task[1].timer/56;
task[1].timer-=linshi;
if(bm0_num>=433||bm0_num<=-433)
task[1].timer=175;
if(task[1].timer<=175)
task[1].timer=175;
}
voidpid()
{
intduk;
PID.act=bm0_num;
PID.error0=PID.set-PID.act;
duk=(unsignedint)((PID.kp*(PID.error0-PID.error1))\
+PID.ki*PID.error0\
+(PID.kd*(PID.error0-2*PID.error1+PID.error2)));
uk=uk+duk;
PID.error2=PID.error1;
PID.error1=PID.error0;
uk=uk+(mohu*(bm1_num-bm1_jilu)/200);
if(uk>0)
{
if(uk>SPEED_MAX)
uk=SPEED_MAX;
elseif(ukuk=SPEED_MIN;
DJ_NSHI;
OCR1B=uk;
}
elseif(uk<0)
{
if(-uk>SPEED_MAX)
uk=-SPEED_MAX;
elseif(-ukuk=-SPEED_MIN;
DJ_SSHI;
OCR1A=-uk;
}
else
OCR1A=OCR1B=0;
PID.error1=PID.error0;
}
voidinit_jichu1()
{
unsignedchari;
OCR1A=2300;
OCR1B=2300;
DJ_ON;
DJ_NSHI;
_delay_ms(500);
DJ_SSHI;
_delay_ms(500);
for(i=0;i>30;i--)
{
DJ_NSHI;
_delay_ms(470);
DJ_SSHI;
_delay_ms(470);
}
OCR1A=0;
OCR1B=0;
DJ_OFF;
task[0].en=0;
}
voidinit_jichu2()
{
OCR1A=6500;
OCR1B=6500;
DJ_ON;
DJ_NSHI;
_delay_ms(100);
zyb();
task[1].en=1;
}
voidinit_jichu3()
{
PID.set=500;
PID.kp=970;
PID.ki=PID.kd=0;
PORTA_Bit3=1;
_delay_s
(1);
PORTA_Bit3=0;
while(bm0_num<=459&&bm0_num>=-459);
PORTA_Bit3=1;
if(bm0_num>459)
{
flag_pid_6=0;
while(bm0_num>=458&&bm0_num<=542);
if(bm0_num<458)
flag_pid_5=1;
elseflag_pid_5=0;
}
else
{
flag_pid_6