风力摆控制系统附有程序.docx

上传人:b****4 文档编号:27004771 上传时间:2023-06-25 格式:DOCX 页数:26 大小:31.94KB
下载 相关 举报
风力摆控制系统附有程序.docx_第1页
第1页 / 共26页
风力摆控制系统附有程序.docx_第2页
第2页 / 共26页
风力摆控制系统附有程序.docx_第3页
第3页 / 共26页
风力摆控制系统附有程序.docx_第4页
第4页 / 共26页
风力摆控制系统附有程序.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

风力摆控制系统附有程序.docx

《风力摆控制系统附有程序.docx》由会员分享,可在线阅读,更多相关《风力摆控制系统附有程序.docx(26页珍藏版)》请在冰豆网上搜索。

风力摆控制系统附有程序.docx

风力摆控制系统附有程序

 

全国大学生电子设计竞赛

 

风力摆控制系统

 

 

2015年8月15日

 

摘要

本系统是以STM32ZET6为控制核心的风力摆控制系统。

通过MPU6050三轴角速度感测器检测摆杆的摆动角度,并在12864液晶屏进行实时的显示,同时将检测到的角度信息传输给32单片机。

32单片机将此信号进行PID算法处理后产生相应的pwm信号,控制轴流风机进行不同的动作反应,带动细杆旋转,以此实现不同的控制要求。

通过按键选择电机的工作模式,实现设计的各项要求。

 

关键词:

STM32MPU605012864轴流风机PID算法

目录

一、方案论证1

1、风机模块的论证与选择1

2、电机驱动模块的论证与选择1

3、三轴角速度感测器模块论证与选择1

4、显示模块的论证与选择2

5、控制系统的论证与选择2

6、风力摆运动控制方案论证2

二、测控方法2

1、控制算法的分析2

(1)控制算法2

2、风力摆状态的测量3

3、风力摆运动控制的计算3

三、系统设计3

1、系统结构3

(1)系统总体框图3

(2)轴流风机子系统框图4

(3)陀螺仪与显示子系统框图4

2、电路设计4

(1)电路流程图4

四、系统测试5

1、测试方案5

2、测试条件与仪器5

3、测试数据及分析5

(1)测试数据5

(2)测试分析与结论6

五、结论与心得7

六、参考文献7

风力摆控制系统(B题)

【本科组】

一、系统方案

本系统以STM32ZET6单片机作为主控芯片,主要由风机模块、电机驱动模块、三轴角速度感测器模块、显示模块、电源模块组成,使用C语言编写程序,完成题目的要求。

通过三轴角速度感测器检测并读出摆杆的摆动角度,从而控制轴流风机的运动状态,驱动电机带动摆杆,并通过按键选择电机的工作模式,使激光画出各项要求的图形。

下面分别论证这几个模块的选择。

1、风机模块的论证与选择

方案一:

采用两只直流风机作为动力。

两只风机分别位于摆杆两侧并排同向而立,通过控制风机转速控制风力摆使激光笔画线画圈,此方案风力摆负载轻,但不易微调和快速静止。

方案二:

采用4只轴流风机作为动力。

4只轴流风机采用内转子电机直联传动,安装方便牢固、质量轻、振动小、噪声低、运行平稳,不扭转风管内介质的流向,安装方便。

此方案风力摆负载最重,但对于控制风力摆状态最为精确,且动力最足。

本设计需要风速快、质量轻、控制精准的方案,所以选择了方案二。

2、电机驱动模块的论证与选择

方案一:

采用THB7128电机驱动芯片。

THB7128芯片内部集成了细分、电流调节、CMOS功率放大等电路,配合简单的外围电路即可实现高性能、多细分、大电流的驱动电路。

但THB7218这些性能优势使其更加适合驱动步进电机,不适合本系统直流伺服电机的驱动。

方案二:

使用L298N电流电机驱动模块。

L298N电机驱动芯片工作电压高,输出瞬间峰值电流可达3A,持续工作电流2A,额定工作频率25W。

内含两个H桥的高电压电流全桥式驱动器可以很好的控制本系统中的直流伺服电机,采用标准逻辑电平信号控制,控制直流电机更加简单容易。

根据实用性,本设计采用方案二。

3、三轴角速度感测器模块的论证与选择

方案一:

选用双轴倾角传感器模块LE-60-OEMLE-60-OEM,测量重力加速度变化,转为倾角变化,可测量双向。

具有稳定性高、低功耗、结构简单等优点。

响应速度为5Hz。

它可以测量平衡板与水平方向的夹角,x,y方向可以测,但z轴不可测。

且操作复杂,软件处理难度大。

方案二:

采用三轴角速度传感器模块。

用三维角度传感器时刻测量风力摆当前姿态,可准确追踪快速与慢速动作,通过处理采集的姿态角数据控制风机带动风力摆运动。

此方案可精确测量风力摆当前姿态,实现对风力摆的精确控制。

免除了组合陀螺仪与加速器时之轴间差的问题。

综合考虑,基于操作简便,性价比以及稳定性,本设计采用方案二。

4、显示模块的论证与选择

方案一:

使用1602液晶模块。

性价比高,接口简单,但1602只能显示字母,数字和符号,能显示16*2个字符。

但只有两行,显示字数少。

方案二:

使用12864液晶模块。

12864屏幕为64行,每行可以显示128个字符,能够形象直观的提示信息,且比1602强大。

综合显示信息量,反应速度,以及性价比,本设计采用方案二。

5、控制系统的论证与选择

方案一:

采用ATMEL公司的ATM89C51单片机系统。

它是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,具有体积小、集成度高、结构简单、等特点,但其外围接口少,功能和速度较32单片机弱。

方案二:

采用STM公司的32F103ZET6单片机系统,其拥有专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。

STM32F103ZET6单片机是片内双RC 晶振,提供8M和32K 的频率并拥有42个16位的后备寄存器32 位微控制器。

时钟频率达到72MHz,是同类产品中性能最高的产品。

综合实用性、可靠性、性能,等方面,在控制模块方面我们选择方案二。

6、控制系统的论证与选择

其原理是将角度的变化量变为阻值的变化量,根据阻值的大小判断角度的大小。

当线路连接好以后,通电,每经过10ms,MPU6050就会刷新一次值,往X轴正向转动时,计数增加,转动方向改变时,计数减小(Y轴原理相同)。

二、系统理论分析与计算

1、控制算法的分析

(1)控制算法

本系统采用PID算法来控制风机转动的速度。

风机工作后,MPU6050模块不断采集当前风力摆姿态角状态,并与之前的状态比较,使得风力摆的运动状态逐渐趋向于平稳。

PID算法控制器由舵机转动角度比例P、角度误差积分I和角度微分D组成。

2、风力摆状态的测量

采用的陀螺加速度计MPU6050不断采集风力摆角度数据。

MPU6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP。

MPU6050和所有设备寄存器之间的通信采用400kHz的I2C接口,实现高速通信。

且内置的可编程卡尔曼滤波器,采用最优化自回归数据处理算法精确测量风力摆当前姿态角。

MPU6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量,通过DMP处理器读取测量数据然后通过串口输出。

3、风力摆运动控制的计算

其原理是将角度的变化量变为阻值的变化量,根据阻值的大小判断角度的大小。

当线路连接好以后,通电,每经过10ms,MPU6050就会刷新一次值,往X轴正向转动时,计数增加,转动方向改变时,计数减小(Y轴原理相同)。

风力摆采用4只45W的直流风机为动力驱动系统。

MPU6050采集模块采集风力摆当前角度,32单片机处理姿态角信息调节输出PWM的占空比,控制四只轴流风机的工作状态,从而实现对风力摆的不同控制。

三、系统设计

1、系统结构

(1)系统总体框图

MPU6050陀螺仪

本系统以STM32F103ZET6为单片机控制器,通过三轴角速度感测器检测摆杆的摆动角度,在12864液晶屏上进行实时的显示,并把检测到的角度信息传输给单片机生成相应的pwm信号,控制4个轴流风机进行不同的动作反应,带动细管转动,以此实现不同的控制要求。

通过按键选择电机的工作模式,实现设计的各项要求。

系统的总体框图如下:

 

图1统总体框图

(2)轴流风机子系统框图

1、轴流风机子系统框图

直流伺服电机控制子系统主要包括电机驱动模块、轴流风机、STM32单片机。

通过按键可以选择直流电机的工作模式。

轴流风机

直流伺服电机控制子系统框图如下图所示:

 

轴流风机子系统框

(3)陀螺仪与显示子系统框图

1、陀螺仪与显示子系统框图

12864液晶

 

图2陀螺仪与显示子系统框图

2、电路设计

(1)电路流程图

发挥部分

1、主程序流程图

 

四、系统测试

1、测试方案

驱动风力摆工作,使激光笔稳定地在地面画出一条长度不短于50cm的直线段,来回五次,记录其由静止至开始自由摆时间及最大偏差距离。

2、测试条件与仪器

测试条件:

检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。

测试仪器:

(1)秒表

(2)量角器(3)自制方向角度图纸

3、测试数据及分析

(1)要求1测试数据

表1风力摆画长于50cm直线测试

时间(s)

偏差1

偏差2

偏差3

第一次数据

13.2

2.7cm

2.4cm

2.8cm

第二次数据

12.5

2.3cm

2.0cm

1.9cm

第三次数据

11.7

1.8cm

1.9cm

1.6cm

(2)要求2测试数据

表2风力摆画不同长度直线测试

时间(s)

偏差1

偏差2

偏差3

30cm直线

13.5

2.3

2.0

2.1

40cm直线

12.8

1.9

2.0

1.8

50cm直线

13.7

1.5

1.6

1.2

60cm直线

11.9

1.8

1.2

1.0

(3)要求3测试数据

表3风力摆画不同角度直线测试

时间(s)

偏差1

偏差2

偏差3

画0度直线

11.2

2.2

1.8

1.9

画90度直线

13.5

2.3

2.6

2.4

画180度直线

13.3

2.6

2.5

2.1

画270度直线

12.4

1.9

2.0

2.3

画360度直线

11.8

1.8

1.9

2.4

(4)要求4测试数据

表4风力摆恢复静止测试

时间

(1)

时间

(2)

时间(3)

拉起30度

4.5

4.3

4.1

拉起35度

5.0

4.2

4.1

拉起40度

4.2

4.5

4.6

拉起45度

4.1

4.0

3.8

(1)发挥部分1测试数据

时间1

偏差1

时间2

偏差2

时间3

偏差3

半径15cm

28.6

2.1

23.9

1.9

20.5

2.1

半径20cm

25.3

1.6

25.8

2.0

22.3

2.2

半径25cm

26.3

2.2

27.4

1.9

24.8

2.5

半径30cm

23.4

2.1

24.6

1.5

20.0

1.9

半径35cm

26.4

1.8

26.4

1.9

18.5

1.5

(2)测试分析与结论

根据上述测试数据,由此可以得出以下结论:

1、本系统可以在15秒内画出不小于50cm的直线段,且最大误差符合要求;

2、本系统可在15秒内画出30到60厘米间的直线段,且误差在不大于2.5cm范围内;

3、本系统能在摆杆被拉起设定方向和角度后在规定时间内摆动画出不少于20cm的直线;

4、本系统能够画出规定半径的圆周,且能在被台扇干扰后恢复圆周运动;

5、本系统能够在拉起一定角度后,5秒内恢复静止。

综上所述,本设计基本达到设计要求,且误差在允许范围内。

五、结论与心得

通过这几天的搭建硬件和不断调试,我们的风力摆系统基本能实现大赛所需要求,运用32单片机作为主控芯片,用L298N作为电机驱动,12864作为显示模块,并用MPU6050测量角度,刚开始的手忙脚乱到最后的熟能生巧,团队之间的配合更加默契。

六、参考文献

[1]谭浩强.C语言程序设计[M].北京:

清华大学出版社,2012

[2]童诗白,华程英.模拟电子技术基础(第四版)[M].北京:

高等教育出版社,2009.

[3]阎石.数字电子技术基础(第五版)[M].北京:

高等教育出版社,2009.

[4]黄智伟,王彦,陈文光等.全国大学生电子设计竞赛训练教程[M].北京:

电子工业出版社,2007.

[5]高吉祥,唐朝京.全国大学生电子设计竞赛培训系列教程(电子仪器仪表设计)[M].北京:

电子工业出版社,2007.

 

/*预处理命令*/

#include//包含单片机寄存器的头文件

#include

#include

#include

#include"LCD.h"

#include"anjian.h"

#include"fangxiang.h"

sbitfour=P0^2;

sbitone=P0^0;

sbittwo=P0^1;

sbitsan=P0^4;

//sbitreset=P0^3;

sbitfahui1=P0^5;

unsignedcharRe_buf[11],counter;

unsignedcharucStra[6],ucStrw[6],ucStrAngle[6];

intSetPoint_x;//设定目标DesiredValue

doubleProportion_x;//比例常数ProportionalConst

doubleIntegral_x;//积分常数IntegralConst

doubleDerivative_x;//微分常数DerivativeConst

intLastError_x;//Error[-1]

intPrevError_x;//Error[-2]

intSumError_x;

intSetPoint_y;//设定目标DesiredValue

doubleProportion_y;//比例常数ProportionalConst

doubleIntegral_y;//积分常数IntegralConst

doubleDerivative_y;//微分常数DerivativeConst

intLastError_y;//Error[-1]

intPrevError_y;//Error[-2]

intSumError_y;

intValue[3];

intx,y;

//sbityuyin=P3^6;

voidjiaodu()

{

//intValue[3];

//intx,y;

Value[0]=(((short)(ucStrAngle[1]<<8|ucStrAngle[0]))/32768.0)*180;

Value[1]=((short)(ucStrAngle[3]<<8|ucStrAngle[2]))/32768.0*180;

Value[2]=((short)(ucStrAngle[5]<<8|ucStrAngle[4]))/32768.0*180;

//if((x>0)|(x==0))

//{

//send(0,0x90);

//send(1,'x');

//send(1,'');

//send(0,0x91);

//send(1,x/10000+0x30);

//send(1,x%10000/1000+0x30);

//send(0,0x92);

//send(1,x%10000%1000/100+0x30);

//send(1,'.');

//send(0,0x93);

//send(1,x%10000%1000%100/10+0x30);

//send(1,x%10000%1000%100%10+0x30);

//}

//if(x<0)

//{

//x=-x;

//send(0,0x90);

//send(1,'x');

//send(1,'-');

//send(0,0x91);

//send(1,x/10000+0x30);

//send(1,x%10000/1000+0x30);

//send(0,0x92);

//send(1,x%10000%1000/100+0x30);

//send(1,'.');

//send(0,0x93);

//send(1,x%10000%1000%100/10+0x30);

//send(1,x%10000%1000%100%10+0x30);

//}

//

//if((y>0)|(y==0))

//{

//send(0,0x80);

//send(1,'y');

//send(1,'');

//send(0,0x81);

//send(1,y/10000+0x30);

//send(1,y%10000/1000+0x30);

//send(0,0x82);

//send(1,y%10000%1000/100+0x30);

//send(1,'.');

//send(0,0x83);

//send(1,y%10000%1000%100/10+0x30);

//send(1,y%10000%1000%100%10+0x30);

//}

//if(y<0)

//{

//y=-y;

//send(0,0x80);

//send(1,'y');

//send(1,'-');

//send(0,0x81);

//send(1,y/10000+0x30);

//send(1,y%10000/1000+0x30);

//send(0,0x82);

//send(1,y%10000%1000/100+0x30);

//send(1,'.');

//send(0,0x83);

//send(1,y%10000%1000%100/10+0x30);

//send(1,y%10000%1000%100%10+0x30);

//}

}

voidxyzhi(){

Value[0]=(((short)(ucStrAngle[1]<<8|ucStrAngle[0]))/32768.0)*180;

Value[1]=((short)(ucStrAngle[3]<<8|ucStrAngle[2]))/32768.0*180;

x=Value[0];

y=Value[1];

}

/////////*************X轴PID*******************//////////////////

voidX_IncPIDInit(floatangle_x,doubleP_DATA_X,doubleI_DATA_X,doubleD_DATA_X)

{

LastError_x=0;//Error[-1]

PrevError_x=0;//Error[-2]

SumError_x=0;

Proportion_x=P_DATA_X;//比例常数ProportionalConst

Integral_x=I_DATA_X;//积分常数IntegralConst

Derivative_x=D_DATA_X;//微分常数DerivativeConst

SetPoint_x=angle_x;//目标是0

}

intXIncPIDCalc(intNextPoint)//位置PID

{

floatierr,derr;

intiout;

ierr=NextPoint-SetPoint_x;

SumError_x+=ierr;

derr=ierr-LastError_x;

LastError_x=ierr;

iout=(int)(Proportion_x*ierr

+Integral_x*SumError_x

+Derivative_x*derr

);

return(iout);

}

////////////////////////////////////////////////////////////////////////////

//////////////**********Y轴PID************//////////////////////

voidY_IncPIDInit(floatangle_y,doubleP_DATA_Y,doubleI_DATA_Y,doubleD_DATA_Y)

{

LastError_y=0;//Error[-1]

PrevError_y=0;//Error[-2]

SumError_y=0;

Proportion_y=P_DATA_Y;//比例常数ProportionalConst

Integral_y=I_DATA_Y;//积分常数IntegralConst

Derivative_y=D_DATA_Y;//微分常数DerivativeConst

SetPoint_y=angle_y;//目标是0

}

intYIncPIDCalc(intNextPoint)//位置PID

{

floatierr,derr;

intiout;

ierr=NextPoint-SetPoint_y;

SumError_y+=ierr;

derr=ierr-LastError_y;

LastError_y=ierr;

iout=(int)(Proportion_y*ierr

+Integral_y*SumError_y

+Derivative_y*derr

);

if(ierr<5&&ierr>-5){

iout=iout*2;

}

return(iout);

}

voidmain(void)

{

//intValue[3];

intb,a;

unsignedchari=0;

X_IncPIDInit(-0.6,80,0,40);

Y_IncPIDInit(-0.5,80,0,40);

//lcd_init();

TMOD=0x20;//用定时器设置串口波特率9600

TH1=0xfd;

TL1=0xfd;

TR1=1;

TI=1;

REN=1;//串口初始化

SM0=0;

SM1=1;

EA=1;//开启总中断

ES=1;

//send(0,0x93);

//send(1,'C');

//yuyin=0;

//delay(5000);

//yuyin=1;

while

(1)

{

//-----------------第四步------------------

if(four=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1