《风力摆控制系统设计.doc》由会员分享,可在线阅读,更多相关《风力摆控制系统设计.doc(23页珍藏版)》请在工友文库上搜索。
1、 第十二届智能控制设计大赛题目:风力摆设计学 院: 专 业: 队 长: 队 员: 队 员: 起始日期: 摘 要 本风力摆系统主要包括单片机控制模块,开关电源(电源模块)激光笔及小型轴流风机,以及基于六轴倾角仪mpu6050的闭环控制系统。其中控制模块采用STM32为核心控制芯片,激光笔作为系统的执行机构,3.7V的小型轴流风机作为驱动风力摆的唯一动力,用3.7V的开关电源驱动轴流风机。轴流风机和摆杆通过万向节固定在支架上(用粗股导线将风力摆悬挂在支架上)。固定在支架上,测量得到的角度经过软件处理得到风力摆摆动所需要的PWM值。(本系统的PID算法算法是通过实际经验试验出风力摆的控制规律,稳定的
2、完成风力摆运动过程中激光笔画轨迹。) 关键词:风力摆; STM32; 轴流风机; PID算法; mpu6050 III目 录一、系统结构方案与设计11、机械结构设计12、主控芯片的论证与选择13、风力摆结构方案的论证和选择24、运动控制算法的论证和选择2二、系统理论分析与计算21、摆杆位置检测22、风力摆运动控制分析23、 控制算法分析2三、电路与程序设计31、电路的设计3(1)STM32最小系统电路4(2)稳压电源电路42、程序的设计4(1)程序功能描述与设计思路4(2)程序流程图4四、测试方案与测试结果51、测试方案52、测试条件与仪器53、 测试结果及分析5(1)测试结果(数据)5(2)
3、数据分析与结论7五、结论与心得7六、参考文献8附录1:电路原理图9附录2:源程序11风力摆控制系统设计一、系统结构方案与设计1、机械结构设计 我们以轻质木条为材料加工成的十字作为风力摆支架的底盘,结构坚固克服摆动时的震动。以空心轻质塑料纤维棒作为摆杆减小了摆动时的自旋,用万向节将摆杆和支架的水平臂连接保证了摆动的灵活性以及达到了摆动角度和速度的精确控制。置于摆杆上的姿态采集模块mpu6050作为系统的闭环控制。四个轴流风机连接成方形作为系统的动力。这样我们就搭建了一个稳定可靠的机械系统,这使系统的各项参数处于比较稳定的状态,有利于后期控制系统的调节。 (本系统的PID算法是通过实际经验试验出风
4、力摆的控制规律,稳定的完成风力摆运动过程中激光笔画轨迹。)图1 风力摆结构示意图2、主控芯片的论证和选择方案一:选择STC89C52单片机作为核心控制芯片,该单片机体积小操作简单,价格便宜。因为STC89C52单片机内部没有集成的函数库,且控制芯片外设模块较多,实际软件编写时复杂麻烦。 方案二:选择stm32单片机进行系统的控制。STM32系列芯片时钟频率高达168MHz 具有512K字节SRAM,具有极强的处理计算能力。较为适合需要快速反应的倒立摆系统。通过比较,我们选择方案二,采用STM32系列的F103C8T6单片机作为控制器。3、风力摆结构方案的论证和选择方案一:采用3个风机连接背向摆
5、成三角形作为摆的结构方案二:用4个风机连接摆成方形。比较:三角形较方形来说结构稳固,且风摆整体重量较轻。但在设置风力摆摆动的任意角度时方形结构容易控制,程序算法较为简单,故采用方形结构。4、运动控制算法的论证和选择方案一:使用LQR控制器进行控制。LQR控制需要调整两个矩阵,对于LQR控制来说,需要求解Riccati方程和确定Q和R权矩阵,算法较为复杂,计算代价较高,相应时间较长,且不易被操作人员理解Q与R矩阵的物理意义。 方案二:虽然PID算法调整参数较为麻烦,但PID可以实现单环稳定,对于PID控制来说,更容易被人理解,PID控制结构简单,调试方便,易于工程上实现。综上,我们采用PID控制
6、算法对风力摆运动系统进行控制。二、系统理论分析与计算 1、摆杆位置检测为了检测摆杆的角度,从而判断摆杆的位置。我们采用高精度的串口6轴加速度计/陀螺仪MPU6050模块不断采集杆的位置信息。通过MPU6050模块与单片机的串口通信我们可以直接获取摆杆的三维角度pitch, roll, yaw。姿态采集模块得到的角用于闭环控制系统摆动的线路确保激光笔按照要求画出轨迹。2、风力摆运动控制分析 风力摆采用4个0.1A的轴流风机作为动力系统。姿态采集模块mpu6050不断采集摆杆的角度,返给单片机处理调节单片机调节风机的PWM,从而是实现对风力摆的控制。3、控制算法分析本系统采用PID算法来控制风机转
7、动的速度。风机开始工作后,姿态采集模块不断采集风力摆摆动的角度,并与之前的角度比较使得风力摆的摆动状态趋向平稳。PID分别表示摆杆的角度比例(P)、角度误差(I)、角度积分(D)。P:对风摆的当前角度偏差e(t)进行调整,系数越大调节速度越快,减小误差,但是过大的比例,会造成风机速度状态的突变,从而导致摆杆状态不稳定I:加入积分调节,可以消除系统的稳态误差,提高无误差度。系统的稳定性下降,动态响应变慢。D:微分调节反应的是风摆的角速度,可以预见偏差变化的趋势具有可预见性因而可以产生超前调节,加入微分调节可以改善系统的动态性能。比例(P)执行器积分(I)微分(D) 传感器图2 PID结构原理图
8、PID控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。其输入e (t)与输出u (t)的关系为:u(t)=kp(e(t)+1/TIe(t)dt+TD*de(t)/dt) 式中积分的上下限分别是0和t。因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp为比例系数; TI为积分时间常数; TD为微分时间常数 三、电路与程序设计1、电路的设计 (1)电路模块 经过上述的分析和论证,决定了系统各模块采用的最终方案如下: 控制模块:采用STM32单片机; 姿态采集模块:6轴加速度计/陀螺仪MPU6050模块电源模块:稳压5V给单片机风机供电通信模
9、块:使用蓝牙模块实现上位机与单片机的无线通信; 显示模块: 使用上位机实现对下位机的操作与接收来自下位机的信息 根据题目要求,系统主要实现风力摆的各项功能系统框图如图所示激光笔风力摆轴流风机姿态采集模块上位机蓝牙模块Stm32控制系统图3 系统框图(2)STM32最小系统电路(见附录1)(3)稳压电源的电路设计(见附录1)(4)实物图与上位机界面图(见附录1)2、程序的设计在Keil uVision5开发环境下,采用C语言编程实现对对传感器输入信号的处理、对上位机指令的接收和对传感器信息的上传,以及对风力摆风速、方向的精确控制。(1)程序功能描述与设计思路 程序功能描述: 1)从静止开始,15
10、 秒内完成幅度可控的摆动,画出长度在 3060 厘米间可设置,长度偏差不大于2.5 厘米的直线段,并且具有较好的重复性;2)风力摆在一定角度放开后快速静止,风力摆拉开一定角度,10 秒内达到静止;3)做可控半径的圆周运动,指定半径下,40 秒内重复三圈,轨迹落在指定半径2.5 厘米的圆环内;4)将当前角度和角速度上传到上位机,并画出动态曲线;(2)程序流程图硬件初始化接收来自上位机指令模式4模式5模式1模式2模式3模式6X轴划线快速定位画方画圆快速停止任意划线采集角度和加速度,发送给上位机图4 程序流程图四、测试方案和测试结果1、测试方案1、 硬件测试:分别对每个模块做相应的测试。2、 软件仿
11、真测试:使用Keil MDK软件进行仿真。 3、硬件软件联调:在符合要求的环境中按照题目要求对风力摆的各项功能逐一进行测试2、测试条件和仪器测试条件:上位机测试仪器:秒表,尺子,数字万用表3、测试结果及数据分析(1)测试结果(数据) 基本要求:(1)从静止开始,15s内风摆做类似自由摆运动,使激光笔稳定在地面画出一条不短于50cm的直线段并具有良好重复性。表1 风力摆画长于50cm直线测试测试次数直线段长度时间149cm3.5s250.2cm3.7s350.1cm3.6s(2)静止开始完成,15s内完成幅度可控的摆动,画出长度在30-60cm间可设置,长度偏差不大于+-2.5cm,并且具有较好
12、的重复性长度设置长度偏差时间30cm1.1cm2.6s45cm0.9cm2.8s60cm1cm3.9s表2 风力摆画不同长度直线测试(3) 从静止开始,15s内按照设置的方向画出不短于 20cm的直线段。表3 设置方向不短于20cm线段测试测试次数线段长度时间120.9cm2.3s219.8cm2.4s320.5cm2.4s(4) 将风摆拉倒一定角度(30-45度)5s内使风摆达到静止状态。风摆角度是否达到静止时间30是8s35是5.8s40是6.1s表4 风力摆静止测试 拓展部分: (1)以风力摆静止时的激光笔的光点为圆心,风力摆驱动激光笔在地面画圆30s内需重复3次,圆半径可在15-35c
13、m范围内设置,激光笔画出的轨迹指定半径+-2.5cm的圆环内。表5 风力摆画圆测试圆半径(r)是否可以画圆重复3次时间15是20.8s25是15.1s30是14.4s(2) 在发挥部分(1)后继续做圆周运动,在距离风力摆1-2m内用一台50-60w的台扇在水平方向吹向风力摆,台扇吹5s后停止,风力摆能够在5s内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹。实验次数是否可以恢复恢复时间1是7s2是6.2s3是5.8s.表6 风力摆抗干扰测试(2)测试分析和结论根据上述测试数据,可以得出以下结论:1、 风力摆能够很好的完成基本功能和部分拓展功能。 2、风力摆系统完成任务的时间较快。3
14、、风力摆系统保持了很好的稳定性。综上所述,本设计基本达到设计要求。五、结论与心得 进入大学后,我们被提供了更多的实践机会和平台,我们学习的不再仅仅局限于理论知识。此次智控竞赛题目的综合性很强,将我们之前所学的知识进行融合,这就要求我们在牢固掌握基本理论知识的同时,更需要灵活的运用。 高级组赛题无论哪个题目综合性都很强,解答的过程也很复杂,在如此短暂的时间内,要想独立将题目的基础部分和拓展部分完成是相当困难的,这就需要在电子设计方面有相当良好的基础以及对PID控制原理有相当程度的掌握。通过这次大赛,我们在各方面都获得了很大的进步,得到了一定的锻炼。6、 参考文献1谭浩强.C语言程序设计M.北京:
15、清华大学出版社,20122 全国大学生电子设计竞赛组委会. 全国大学生电子设计竞赛获奖作品选编 (19941995)M.北京:北京理工大学出版社,1997年第1版.3高吉祥,黄智伟,陈和.高频电子线路M. 北京:电子工业出版社,2003年第1版 4吴运昌.模拟集成电路原理与应用M.广州:华南理工大学出版社,2001年第1版 附录1:电路原理图图5 5V稳压电路图6 Stm32最小系统原理图图7 作品实物图图8 上位机界面图附录2:源代码#include delay.h#include MPU6050/mpu6050.h#include MPU6050/eMPL/inv_mpu.h#includ
16、e usart.h#include math.h#include L298/l298.h#include Blt/bluetooth.h#include stdlib.h#include Led/led.hfloat pitch, roll, nyaw;/yaw没用到short gx, gy, ngz;/角速度, ngz没用到int main()s16 sumGx=0, sumGy=0; /角速度三次相加的值,用来算平均值u8 mode = 0;/模式float setpitch=0, setroll=0, errpitch, errroll; /目标pitch、roll, 偏差pitch、r
17、olls32 errpitchSum=0, errrollSum=0, errR2Sum=100000; /偏差的累加,相当于积分项float kp, ki, kd;/PID参数s16 setR2=16, errR2=0, errR2last=0;/画圆模式目标半径s16 valx, valy, R2;/x,y方向pid算出的结果,根据这个结果确定PWM, R2是画圆模式当前半径float kx, ky;/系数,用来校正s8 kturn = 1;/画圆模式下表示正反转u8 cnt1=0;/count临时变量extern u8 time;/时间,每10ms加1, 周期1460ms即加到146时清
18、0(这个频率时画圆效果好) delay_init();while(MPU_Init() /MPU6050初始化while(mpu_dmp_init() /DMP库初始化l298Init(); /风机驱动初始化uart_init(115200); LedInit();bltTimerInit(); /蓝牙驱动初始化delay_ms(1000);while(1)if(USART_RX_STA&0x8000)!=0) /如果接收到了数据USART_RX_STA = 0;mode = USART_RX_BUF0; /接收到的第一个字节为模式位switch(mode)case 0:/模式0:清除偏差积分
19、项,停止errpitchSum = errrollSum = 0;errR2Sum=100000;break;case 1: /模式1:在任意方向画线段,线段长度由上位机设定的角度计算得到errpitchSum=1600;errrollSum=2200;setroll = USART_RX_BUF1+0.1*USART_RX_BUF2; /上位机设定的横滚角值,第1个字节是整数部分,第2是小数部分(1位)if(USART_RX_BUF3 = 90)mode = 6; /模式6:在X轴方向画线段setpitch = USART_RX_BUF1+0.1*USART_RX_BUF2; /上位机设定的
20、俯仰角值elsesetpitch = 57.3*atan(tan(setroll/57.3)*tan(USART_RX_BUF3/57.3);/第3个字节是设定划线的角度,以此算出目标pitchbreak;case 2: /模式2:清除偏差积分项,停止errpitchSum = errrollSum = 0;errR2Sum=100000;break;case 3: /模式3:画圆setR2 = (s16)(USART_RX_BUF1*USART_RX_BUF1); /第1个字节是目标半径,setR2代表的是半径的平方if(USART_RX_BUF2 = 0)/转向kturn = -1; el
21、sekturn = 1;break;case 4: /模式4:画方形errpitchSum = errrollSum = 0;setpitch = USART_RX_BUF1+0.1*USART_RX_BUF2;/目标pitch的整数部分和小数部分setroll = USART_RX_BUF3+0.1*USART_RX_BUF4;break;case 5: /模式5:快速定位if(USART_RX_BUF17) = 0)setpitch = 57.3 * atan2(USART_RX_BUF1, 70);/x方向上的长度 算出目标pitchelse setpitch = 57.3 * atan
22、2(USART_RX_BUF1-256, 70);/x方向上的长度为负if(USART_RX_BUF27) = 0)setroll = 57.3 * atan2(USART_RX_BUF2, 70);else setroll = 57.3 * atan2(USART_RX_BUF2-256, 70);break;switch(mode)case 1: /划线模式,除了90以外, 90度另分为mode=6kp = 2.8;ki = 0.090;kd = 3.0; /设定PID的比例系数,积分时间常数和微分时间常数,利用PID调节电机速度if(roll=setroll-3)&(setroll0)
23、| (roll=setroll+4)&(setroll abs(setroll)+3)valy = 0;elsevaly = (s16)(kp*errroll + ki*errrollSum - kd*gx); /利用PID控制Y轴方向的电机if(setpitch -1)/0度kp = 0;kd = 4;setpitch = 0;errpitch = setpitch - pitch;valx = (s16)(kp*errpitch - kd*gy);elsekp = 2.8;ki = 0.10;kd = 2.8;if(pitch=setpitch-3)&(setpitch0) | (pitc
24、h=setpitch+4)&(setpitch abs(setpitch)+3)valx = 0;elsevalx = (s16)(kp*errpitch + ki*errpitchSum - kd*gy);break;case 6:/划线模式 画90度kp = 2.8;ki = 0.10;kd = 2.8;if(pitch=setpitch-3)&(setpitch0) | (pitch=setpitch+4)&(setpitch abs(setpitch)+3)valx = 0;elsevalx = (s16)(kp*errpitch + ki*errpitchSum - kd*gy);k
25、p = 0;kd = 4;setroll = 0;errroll = setroll - roll;valy = (s16)(kp*errroll - kd*gx);break;case 2:/快速停止模式kp = 0.2;kd = 4;setpitch = 0;errpitch = setpitch - pitch;valx = (s16)(kp*errpitch - kd*gy);setroll = 0;errroll = setroll - roll;valy = (s16)(kp*errroll - kd*gx);break;case 3:/画圆模式delay_ms(10);kp =
26、20;ki = 0.03;kd = 0.13;errR2 = (s16)(setR2 - 4900*(sin(pitch/57.3)*sin(pitch/57.3)+sin(roll/57.3)*sin(roll/57.3);errR2Sum += errR2;R2 = (s16)(kp*errR2 + ki*errR2Sum - kd*(errR2-errR2last);errR2last = errR2;if(kturn = 1)/正转(画的不圆,需要kx, ky 修正)ky = 0.0060*(1-0.00040*setR2);kx = 0.0059*(1+0.00018*setR2);
27、else/反转ky = 0.0059*(1-0.00039*setR2);kx = 0.0059*(1+0.00017*setR2);valy = (s16)(ky*kturn*R2*cos(4.303*time*0.01);valx = (s16)(kx*R2*sin(4.303*time*0.01);break;case 4: /画方模式kp = 0.2;ki = 0.1;kd = 4.0;if(pitch=setpitch-1&setpitch0) | (pitch=setpitch+1&setpitch=setroll&setroll0) | (roll=setroll+3&setro
28、ll0)if(kturn = 1)setroll = -setroll;errrollSum = 0;kturn = -1;elsesetpitch = -setpitch;errpitchSum = 0;kturn = 1;errroll = setroll - roll;errrollSum += errroll;valy = (s16)(kp*errroll + ki*errrollSum - kd*gx);errpitch = setpitch - pitch;errpitchSum += errpitch;valx = (s16)(kp*errpitch + ki*errpitchS
29、um - kd*gy);break;case 5: /快速定位kp = 8.8;ki = 0.2;kd = 4.0;errroll = setroll - roll;errrollSum += errroll;valy = (s16)(kp*errroll + ki*errrollSum - kd*gx);errpitch = setpitch - pitch;errpitchSum += errpitch;valx = (s16)(kp*errpitch + ki*errpitchSum - kd*gy);break;default: valx=valy=0; break;MoterMove
30、(valx, valy);while(mpu_dmp_get_data(&pitch, &roll, &nyaw) != 0)cnt1+;delay_ms(1);if(cnt1 = 5) cnt1=0;break;sumGy = sumGx = 0;MPU_Get_Gyroscope(&gx, &gy, &ngz);/取三次均值sumGy += gy;sumGx += gx;MPU_Get_Gyroscope(&gx, &gy, &ngz);/取三次均值sumGy += gy;sumGx += gx;MPU_Get_Gyroscope(&gx, &gy, &ngz);/取三次均值sumGy += gy;sumGx += gx;gy = sumGy/49;gx = sumGx/49 + 3;20