电赛控制类风力摆论文.docx
《电赛控制类风力摆论文.docx》由会员分享,可在线阅读,更多相关《电赛控制类风力摆论文.docx(20页珍藏版)》请在冰豆网上搜索。
电赛控制类风力摆论文
2015年全国大学生电子设计竞赛
风力摆控制系统(B题)
【本科组】
2015年8月15日
摘要
本设计由MC9S12XS128MAL单片机控制模块、角度检测模块、人机交互系统以及风力摆机械结构组成的闭环控制系统。
由BTN7971驱动12V、1.2A的直流风机作为风力摆的动力源,MMA7361采集风力状态角,单片机处理状态角数据后通过PID调节直流风机控制风力摆,实现在直流风机作为动力控制下快速起摆、画线、恢复静止,画圆的功能。
为了使测控系统控制更为精确,在采集数据的过程中采用了非线性误差校正以及卡尔曼滤波等数据处理方法。
同时设计中考虑到可能存在的各种干扰因素,采用软硬件结合的抗干扰方法提高系统控制的稳定性。
经过反复的测验,该方案完全能够实现题目要求!
关键字:
单片机闭环风力摆控制系统卡尔曼滤波
目录
1.方案论证与比较1
1.1.系统主控芯片选择1
1.2.风力摆动力系统方案选择1
1.3.角度检测方案的选择与论证2
1.4.电机驱动模块的选择与论证2
1.5.算法选择2
2.系统设计3
2.1.系统总体设计3
2.2.模块电路设计3
3.系统理论分析与计算5
3.1.风力摆的运动控制分析5
3.2.系统算法的分析5
4.软件设计6
4.1.程序功能描述与设计思路6
4.2.程序流程图6
5.系统调试与测试7
5.1.系统调试7
5.2.系统测试7
6.结束语8
7.附录9
7.1.附录1:
参考文献9
7.2.附录2:
主要元器件清单9
7.3.附录3:
电路原理图10
7.4.附录4:
部分源程序11
1.方案论证与比较
1.1.系统主控芯片选择
方案一:
采用AT89C51系列单片机作为控制的核心。
51单片机价格便宜,应用广泛,I/O口的设置和使用操作简单。
但是51单片机的运行速度过慢,抗静电抗干扰能力弱,内部资源和存储器功能较少,而且无ADC,还需要用外接电路实现AD转换,使硬件电路变得复杂。
另外,51单片机完成系统功能较为困难。
方案二:
采用MC9S12XS128MAL作为控制核心
MC9S12XS128MAL是Freescale公司生产的16位单片机,储存功能强大,具有丰富的输入/输出端口资源,具有多种寄存器功能,而且端口引脚大多为复用口,具有多功能,所有端口都具有通用I/O口功能。
内部本身自带PWM、A/D转换功能,可以直接用,省去了单独做PWM模块和A/D转换模块,节省大量时间。
完全能够实现本系统的所有功能。
综合考虑,本系统选择方案二
1.2.风力摆动力系统方案选择
根据题目要求,用2~4只直流风机,共有一下三种方案选择!
方案一:
采用两只风机作为系统动力系统。
两只风机并排同向而立,分别固定摆杆两侧,通过控制两个风机转速产生不同风力控装置摆动是激光笔划线画圆。
此方案遂犯负载亲,但是在很难控制风力摆的状态修正和制动。
方案二:
采用三只风机作为动力系统。
三只风机成等边三角形相背而立,互成120度夹角(外角)。
此方案相对于方案一在控制风力摆转动过程中状态修正方面有提升,而且对于画圆有一定优势,但是不好掌握相邻风机的推力,在控制系统运动方向难度很大。
方案三:
采用四只直流风机作为动力系统。
四只风机两两背靠背而立,中间用碳纤维棒将四只风机固定成十字架形状。
综合上述比较分析,考虑到系统的快速工作以及精确控制,本系统采用方案三。
1.3.角度检测方案的选择与论证
方案一:
角位移电位器。
角位移电位器属于二位平面内角位移传感器测量摆动时关于静止状态时的偏转角,通过该偏转角控制流风机的状态。
但是角位移电位器只能检测出二维平面内的角度变化,不利于检测风力摆的空间位置。
方案二:
选用三轴加速度传感器。
三周加速度传感器具有体积小和重量轻的特点,可以测得空间加速度,能够全面准确反映物体的运动的空间位置。
此方案课精确测量风力摆的当前状态,实现对风力摆的精确控制。
综合考虑,本系统选择方案二。
1.4.电机驱动模块的选择与论证
方案一:
使用L298芯片实现电机驱动。
L298N内部包含4通道逻辑驱动电路,及内部含两个H桥的双全桥驱动器,接受TTL逻辑电平信号通过PWM实现直流风机调速。
但是L298驱动大功率电机时发热严重易烧毁芯片。
方案二:
使用英飞凌的BTN7971驱动芯片。
BTN7971是大功率集成半桥驱动芯片,在单一封装中集成了PMOS和NMOS高低侧功率开关以及门驱动器,还集成了逻辑控制电路和一些保护检测功能,能够防止过热、过压、欠压、过流和短路。
综合考虑,本系统选择方案二。
1.5.算法选择
算法有很多种,它的选择很重要,它决定处理系统的性能质量和可行性。
方案一:
自适应算法。
自适应过程是一个不断逼近目标的过程。
单片机读取传感器采集来的风力摆空间位置来控制风力摆的运动,但是由于该系统变化太快,自适应算法调节方式难以达到系统要求。
方案二:
PID算法。
在过程控制中,按比例、积分和微分的函数关系,对系统模型进行运算分析,将其运算结果用以输出控制。
控制精度高,且算法简单明了。
2.系统设计
2.1.系统总体设计
根据上述方案论证,我们最终确定了以MC9S12XS128MAL单片机作为中央处理器,采用型号为MMA7361的模拟加速度陀螺仪检测风力摆的空间位置,使用BTN7971芯片驱动4个大功率直流风机。
总体框图如下图2.1所示。
图2.1设计总体框图
2.2.模块电路设计
1、角度传感器
角度传感器选用蓝宙电子生产的3轴陀螺仪+3轴模拟加速度传感器MMA7361模块。
该模块具有ENC-03M(全新包装)三轴陀螺仪传感器、MMA7361三轴模拟量输出。
2、电机驱动模块
BTN7971驱动芯片电路图如图2.2所示,BTN7971属于半桥驱动芯片,所以用两个芯片组成一个完整的全桥驱动芯片,如图2(b)所示。
由于直流风机无法反转,将风机地端连载一起,将电源端接入驱动电路中的OUT1、OUT2、OUT3、OUT4,将驱动电路的输入口接单片机PWM1、3、5、7口,通过个给驱动输入PWM值台阶风机速度达到对风机控制目的。
图2.2
3、拨码开关
在单片机的PB口接一个拨码开关,实现人机交互功能。
当拨动一个值后,系统会切换一个系统模式,完成本系统的全部功能操作。
该模块方便选择各种模式。
3.系统理论分析与计算
3.1.风力摆的运动控制分析
风力摆采用4只功率为12V、1.2A的大功率直流风机为动力驱动系统。
模拟加速度陀螺仪采集风力摆的当前的角度,单片机处理角度信息输出PWM占空比,控制4只风机的工作状态,从而实现对风力摆的控制。
图3.1风力摆结构示意图
3.2.系统算法的分析
本系统采用PID算法来控制流风机的转动速度,流风机开始工作后,姿态采集模块不断采集当前风力摆的空间位置角度,并与之前的状态比较,是的风力摆的运动状态逐渐趋向于平稳。
PID算法由风力摆转动角度比例P、角度误差积分I和角度微分D组成。
其输入e(t)与输出U(t)的关系为:
U(t)=P*[e(t)+1/I∫e(t)dt+D*de(t)/dt]
它的传递函数为:
G(s)=U(S)/E(S)=P*[1+1/(I*s)+D*s]
风力摆转动角度比例P:
对风力摆角速度进行比例调节,即对风机转动速度调整。
比例越大,调节速度越快,但不能过大,过大可能造成四风机因工作状态的突变而使摆杆不稳定。
角度误差积分I:
使系统消除稳态误差。
计入微分调节使系统稳定系数下降,动态相应变慢。
根据本系统要更快更稳完成风力摆的控制,本系统对积分调节的需要就非常弱。
即保证在不需要时系统不会受到影响。
角度微分D:
微分反映风力摆角度的变化率,具有可预见性,能预见偏差变化的趋势因此产生超前的控制作用,在偏差还没有形成之前,已被微分作用调节消除。
因此,可以改善系统的动态性能。
在为分时间选择合适情况下,减少调节时间。
4.软件设计
4.1.程序功能描述与设计思路
系统软件实现的功能如下:
1、读取陀螺仪数据,将数据反馈给单片机;2、单片机将读取数据的模拟量AD转换为数字量后,将相对应的PWM波发送给轴流风机;3、控制平衡板;4、拨码开关控制;5、数据汇总做出判断。
4.2.程序流程图
系统主程序流程图如下图所示,进入主程序并初始化后,等待拨码开关的状态执行相应程序,每个程序能完成一项要求,各子模块是独立模块,结构清楚。
基
本
要求
1
发挥部分
2
发挥部分
1
基
本
要求
3
基
本
要求
2
基
本
要求
4
图4.1系统程序流程图
5.系统调试与测试
5.1.系统调试
为了便于系统调试,本系统使用CodeWarriorIDE进行原程序的编写、编译和链接,并最终生成可执行文件。
该编译器具有高度可视化界面操作及自动创建复杂嵌入式系统应用的功能,包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、连接器以及调试器,可支持在线调试,为使用嵌入式产品开发提供了便利。
5.2.系统测试
1、测试工具
刻度尺、秒表、量角器
2、测试指标及方法
1)基本要求
(1):
驱动风力摆工作,使激光笔稳定地在地面划出的直线段,来回五次,记录七由静止只开始自由摆时间及最大偏差距离。
(15s内完成,线性误差大于±2.5cm),经测验,满足题目要求。
2)基本要求
(2):
设置风力摆划线长度,驱动风力摆工作,记录其由静止开始自由摆时间及在华不同长度直线时的最大偏差距离。
(15s内完成,线性误差大于±2.5cm)。
经测验,满足题目要求。
3)基本要求(3):
设置风力摆自由摆时的角度,驱动风力摆工作,记录其由静止只开始自由摆时间及在画不同角度直线时的最大偏差距离。
经测验,满足题目要求。
4)基本要求(4):
将风力摆拉起任意角度(30度~45度),5s内使风力摆制动达到静止。
将风力摆拉起一定角度放开,测试风力摆制动所需的时间。
经测验,满足规定的5s内静止。
5)发挥部分:
以风力摆静止时的光电为圆心,设置风力摆画圆半径,区东风里摆动激光笔在地面画圆,记录其画三次圆所用的时间以及最大偏差距离,重复测试三次。
改变原半径再次测验,重复以上操作四次,经测验,误差在规定的30s、±2.5cm的线性误差内。
6.结束语
通过紧张的四天三夜的奋力拼搏,与小组其他成员的通力协作,团结互助,终于完成了设计项目。
通过不断地测试调试,本系统达到了设计的四个基本要求和发挥部分,在本次设计的过程中,我们遇到了很多突发事件和各种困难。
尤其是向如何在摆动过程中如何保持激光轨迹的线性度一度陷入困难。
但通过团队的仔细分析和自我调整状态后我们终于解决了问题,取得了比较满意的结果。
经过本次电子设计竞赛让我们对电路的设计、调试有了深刻的印象,加深了对测控技术的理解,同时也深刻体会到了共同协作和团队精神的重要性,提高了我们动手解决问题的能力,设计中还有欠缺的地方,今后的学习工作中会加以注意。
同时感谢竞赛的主办方让我们得到了很好的锻炼机会,由于时间紧迫我们未能将系统方案调整到最优,但是我们会利用课余时间继续深入研究找出更好的的方案!
7.附录
7.1.附录1:
参考文献
[1]黄智伟.大学生全国电子设计竞赛训练教程.北京:
电子工业出版社,2005
[2]谭浩强.C语言程序设计(第二版).北京:
清华大学出版社,2000
[3]郭天祥.新概念51单片机C语言教程.入门、提高、开发[M].北京:
电子工业出版社,2009
[4]张阳、吴晔、滕勤.MC9S12XS单片机原理及嵌入式系统开发.北京:
电子工业出版社
7.2.附录2:
主要元器件清单
元件名称
数量(个)
模拟加速度陀螺仪
1
12V、1.2A轴流风机
4
MC9S12XS128MAL单片机
1
BTN7971驱动芯片
4
12V大功率电源
1
激光笔
1
7.3.附录3:
电路原理图
图7.1主板原理图
图7.2驱动模块整体电路图
7.4.附录4:
部分源程序
voidKalman_Filter_Y(floataccel,floatgyro)//range-1000-2g
{
floatPHt_0,PHt_1,E,K_0,K_1,Y_0,Y_1;
//K_0含有卡尔曼增益的另外一个函数,用于计算最优估计值
//K_1含有卡尔曼增益的函数,用于计算最优估计值的偏差
//先验估计//角度更新
angle_y+=(gyro-gyro_bias)*dt;//由角速度积分得到的角度//计算过程协方差矩阵的微分矩阵
//关于dt的调整,增加dt可使kalmanfilter的输出相位滞后
Pdot[0]=Q_acce-PP[0][1]-PP[1][0];//派生协方差矩阵计算Pk-'0,0先验估计误差协方差的微分
Pdot[1]=-PP[1][1];//0,1
Pdot[2]=-PP[1][1];//1,0
Pdot[3]=Q_gyro;//1,1Pdot=A*P+P*A导+Q
PP[0][0]+=Pdot[0]*dt;//计算协方差矩阵//协方差矩阵更新
PP[0][1]+=Pdot[1]*dt;//Pk-先验估计误差协方差微分的积分=先验估计误差协方差
PP[1][0]+=Pdot[2]*dt;
PP[1][1]+=Pdot[3]*dt;
PHt_0=H_0*PP[0][0];
PHt_1=H_0*PP[1][0];
E=R_angle+H_0*PHt_0;//估计偏差//计算的过程量//误差估计计算
K_0=PHt_0/E;//计算卡尔曼增益//卡尔曼增益,E越大,K越小
K_1=PHt_1/E;
//后验估计//更新状态估计//计算测量角度和估计角度的偏差
angle_error=accel-angle_y;//计算角度偏差//zk-先验估计
angle_y+=K_0*angle_error;//更新角度最优估计值//融合后的角度
gyro_bias+=K_1*angle_error;//更新最优估计值偏差
rotate_y=gyro-gyro_bias;//更新角速度最优估计值//输出值(angle_y)的微分=角速度//融合后角速度
//更新协方差矩阵//后验估计,更新协方差阵
Y_0=PHt_0;
Y_1=H_0*PP[0][1];
PP[0][0]-=K_0*Y_0;//后验估计误差协方差
PP[0][1]-=K_0*Y_1;
PP[1][0]-=K_1*Y_0;//P(K|K)E越大,P越大
PP[1][1]-=K_1*Y_1;
}
/*voidKalman_Filter_Y1(floataccel1,floatgyro1)//range-1000-2g
{
floatPHt_0,PHt_1,E,K_0,K_1,Y_0,Y_1;
//K_0含有卡尔曼增益的另外一个函数,用于计算最优估计值
//K_1含有卡尔曼增益的函数,用于计算最优估计值的偏差
//先验估计//角度更新
angle_y1+=(gyro1-gyro_bias1)*dt1;//由角速度积分得到的角度//计算过程协方差矩阵的微分矩阵
//关于dt的调整,增加dt可使kalmanfilter的输出相位滞后
Pdot1[0]=Q_acce1-PP1[0][1]-PP1[1][0];//派生协方差矩阵计算Pk-'0,0先验估计误差协方差的微分
Pdot1[1]=-PP1[1][1];//0,1
Pdot1[2]=-PP1[1][1];//1,0
Pdot1[3]=Q_gyro1;//1,1Pdot=A*P+P*A导+Q
PP1[0][0]+=Pdot1[0]*dt1;//计算协方差矩阵//协方差矩阵更新
PP1[0][1]+=Pdot1[1]*dt1;//Pk-先验估计误差协方差微分的积分=先验估计误差协方差
PP1[1][0]+=Pdot1[2]*dt1;
PP1[1][1]+=Pdot1[3]*dt1;
PHt_0=H_1*PP1[0][0];
PHt_1=H_1*PP1[1][0];
E=R_angle1+H_1*PHt_0;//估计偏差//计算的过程量//误差估计计算
K_0=PHt_0/E;//计算卡尔曼增益//卡尔曼增益,E越大,K越小
K_1=PHt_1/E;
//后验估计//更新状态估计//计算测量角度和估计角度的偏差
angle_error1=accel1-angle_y1;//计算角度偏差//zk-先验估计
//融合后的角度
angle_y1+=K_0*angle_error1;//更新角度最优估计值
gyro_bias1+=K_1*angle_error1;//更新最优估计值偏差
//融合后角速度
rotate_y1=gyro1-gyro_bias1;//更新角速度最优估计值//输出值(angle_y)的微分=角速度
//更新协方差矩阵//后验估计,更新协方差阵
Y_0=PHt_0;
Y_1=H_1*PP1[0][1];
PP1[0][0]-=K_0*Y_0;//后验估计误差协方差
PP1[0][1]-=K_0*Y_1;
PP1[1][0]-=K_1*Y_0;//P(K|K)E越大,P越大
PP1[1][1]-=K_1*Y_1;
}*/
voidAngleCalculate(void)
{
uinti;
for(i=0;i<3;i++)
{
gyro_temp[i]=ad_once(0);//y陀螺仪
acce_temp1[i]=ad_once
(1);//z加速度计
}
GyroY=Mid(gyro_temp[0],gyro_temp[1],gyro_temp[2]);//求中值
AcceZ=Mid(acce_temp1[0],acce_temp1[1],acce_temp1[2]);
//陀螺仪处理
GyroY_=GyroY-GYROSCOPE_OFFSET;//求陀螺仪偏差
angular_y=-GyroY_*GYROSCOPE_ANGLE_RATIO;//陀螺仪角速度
//加速度处理
AcceZ=AcceZ-GRAVITZ_OFFSET;//加速度计偏差
accel_y=AcceZ*GRAVITY_ANGLE_RATIO;//加速度计角度
Kalman_Filter_Y(accel_y,angular_y);
}