全国大学生电子设计竞赛设计报告B题风力摆控制系统精编版Word格式.docx
《全国大学生电子设计竞赛设计报告B题风力摆控制系统精编版Word格式.docx》由会员分享,可在线阅读,更多相关《全国大学生电子设计竞赛设计报告B题风力摆控制系统精编版Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
自制单片机印刷电路板
自制印刷电路实现较为困难,实现周期长,此外也会花费较多的时间,影响整体设计进程。
不宜采用该方案。
方案三:
采用单片机最小系统。
单片机最小系统包含了显示、矩阵键盘、A/D、D/A等模块,能明显减少外围电路的设计,降低系统设计的难度,非常适合本系统的设计。
综合以上三种方案,选择方案三。
2、角度测量模块的论证与选择
采用MPU-6050模块
MPU-6000(6050)为整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的封装空间。
该芯片内部整合了3轴陀螺仪和3轴加速度传感器,并可利用自带的数字运动处理器(DMP:
DigitalMotionProcessor)硬件加速引擎,通过主IIC接口,向应用端输出姿态解算后的数据。
采用ADXL345倾角传感器
ADXL345是超低功耗3轴加速度计,分辨率高(13位),测量范围达±
16g。
数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。
综合以上两种方案,选择方案一。
3、风扇驱动模块的论证与选择
采用L298N驱动模块
L298N是一种双H桥电机驱动芯片,其中每个H桥可以提供2A的电流,功率部分的供电电压范围是2.5-48v,逻辑部分5v供电,接受5vTTL电平。
一般情况下,功率部分的电压应大于6V否则芯片可能不能正常工作。
自己设计驱动模块
自己设计的大电流驱动模块可以完全符合系统要求,真正做到完美适配。
综合考虑采用方案二
4、电源方案的论证与选择
使用大功率开关电源接模块和单片机单独直流电源。
大功率开关电源接模块给风机供电,单片机单独由直流电源供电。
方案简单易可靠,双电源还可保证单片机系统和电机系统的完全隔离,提高系统可靠性。
采用双电源供电。
风机驱动电源和控制电源分开,控制电机部分通过光耦隔离。
电机使用12V锂电池供电,此方案可确保系统的稳定性,但由于我们选择了12V3.2A的大功率轴流风机,锂电池无法提供足够的功率。
综合上述比较,考虑系统的安全性、稳定性以,本系统采用方案一。
二、系统理论分析与计算
1、风力摆状态的测量与计算的分析
(1)姿态采集分析
本系统采用高精度的陀螺加速度计MPU6050不断采集风力摆姿态角数据。
MPU6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP。
MPU6050和所有设备寄存器之间的通信采用400kHz的I2C接口,实现高速通信。
且内置的可编程卡尔曼滤波器,采用最优化自回归数据处理算法精确测量风力摆当前姿态角。
MPU6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量,通过DMP处理器读取测量数据然后通过串口输出。
(2)控制算法分析
本系统采用PID算法来控制风机转动的速度。
风机开始工作后,姿态采集模块不断采集当前风力摆姿态角状态,并与之前的状态比较,使得风力摆的运动状态逐渐趋向于平稳。
PID算法控制器由舵机转动角度比例P、角度误差积分I和角度微分D组成。
其输入e(t)与输出U(t)的关系为:
它的传递函数为:
风力摆转动角度比例P:
对风力摆角速度进行比例调整,即对舵机转动速度调整。
比例越大,调节速度越快。
但不能过大,过大可能造成四风机因工作状态突变而是摆杆不稳定。
角度误差积分I:
使系统消除稳态误差,提高无差度。
加入积分调节可使系统稳定性下降,动态响应变慢。
本系统追求更快更稳完成对风力摆的控制,因此,本系统对积分调节的需要就非常弱。
即保证在不需要时系统不会受到影响。
角度微分D:
微分作用反映风力摆角度的变化率,即角速度。
具有预见性,能预见偏差变化的趋势因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。
因此,可以改善系统的动态性能。
在微分时间选择合适情况下,减少调节时间。
2、角速度的计算
根据三角函数知识,已知某一轴的角加速度可以求得对应的角速度。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
系统包括STM32f103单片机;
轴流风机和电机驱动模块;
MPU-6050传感器。
由四台成九十度放置的轴流机来控制旋转臂转动从而来使摆杆摆动,在摆杆和风机平台相结合处加MPU-6050传感器.使摆杆一开始能快速得沿一条直线摆动,并且能保持画出长度偏差不大于±
2.5cm的直线段,并且具有较好的重复性。
系统总体框图如图3.1所示
图3.1系统总体框图
(2)MPU-6050子系统框图与电路原理图
1、MPU-6050子系统框图
图3.2MPU-6050子系统框图
2、MPU-6050子系统电路
图3.3MPU-6050子系统电路
(3)电机驱动模块子系统框图与电路原理图
1、电机驱动模块子系统框图
图3.4电机驱动模块子系统框图
2、电机驱动模块子系统电路
图3.5电机驱动模块子系统电路
(4)电源
电源由变压部分、滤波部分、稳压部分组成。
为整个系统提供
5V或者
12V电压,确保电路的正常稳定工作。
这部分电路比较简单,都采用三端稳压管实现,故不作详述。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现键盘的设置和显示。
1)键盘实现功能:
2)显示部分:
2、程序设计思路
(2)程序流程图
1、主程序流程图
四、测试方案与测试结果
1、测试方案
(1)电路功能测试
每块电路板分开进行功能测试,进行逐项功能的测试。
(2)机械结构测试
搭建好机械结构后,利用等重负载进行负载承重和摇摆震动测试。
(3)硬件软件联调
驱动风力摆工作,使激光稳定地在地面画出一条长度不短于50cm的直线段,来回五次,记录其由静止至开始自由摆时间及最大偏差距离。
测试结果如表1所示。
2、测试条件与仪器
测试条件:
检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
机械结构通过负载测试和电机振动测试。
测试仪器:
数字示波器,数字万用表,卷尺,量角器,方向角度图纸
3、测试结果及分析
(1)测试结果(数据)
(2)测试分析与结论
根据上述测试数据,由此可以得出以下结论:
1、
2、
3、
综上所述,本设计达到设计要求。
五、结论与心得
本次电子设计竞赛,通过对此系统前期的方案设计、方案的选择、方案论证,中期的机械结构的的搭建,硬件的设计和具体程序的实现和后期系统的测试,最终基本能达到要求,通过这次课程设计小组成员之间的分工和合作,交流配合,各项工作有序的进行,完成这次的设计,我没每个人都有很多的收获,但最大的收获不是这个结果,而是在这个过程中,每个人都学到了很多的新知识,提升了解决问题的能力和如何与他人很好的合作。
无论最终测评的结果如何,我们都该为此次比赛感到高兴和满足。
六、参考文献
[1]童诗白,华程英.模拟电子技术基础(第四版)[M].北京:
高等教育出版社,2009.
[2]阎石.数字电子技术基础(第五版)[M].北京:
高等教育出版社,2009.
[3]黄智伟,王彦,陈文光等.全国大学生电子设计竞赛训练教程[M].北京:
电子工业出版社,2007.
[4]高吉祥,唐朝京.全国大学生电子设计竞赛培训系列教程(电子仪器仪表设计)[M].北京:
[5]张友德、赵志英、涂时亮.单片微型机原理、应用与实践(第五版)[M].上海:
复旦大学出版社,2009.
[6]郭天祥.新概念51单片机C语言教程.入门、提高、开发[M].北京:
电子工业出版社,2009.
[7]梁明理.电子线路(第五版)[M].北京:
高等教育出版社,2008.
[8]谭浩强.C语言程序设计[M].北京:
清华大学出版社,2012
附录1:
电路原理图
附图1.1MCU部分原理图
附图1.2MPU-6050模块原理图
附图1.3驱动模块原理图
附录2:
源程序
#include"
sys.h"
usart.h"
delay.h"
led.h"
lcd.h"
key.h"
mpu6050.h"
usmart.h"
inv_mpu.h"
inv_mpu_dmp_motion_driver.h"
#include<
math.h>
staticfloatError=0;
//Error
staticfloatLastError=0;
//Error[-1]
staticfloatPrevError=0;
//Error[-2]
staticfloatd_Error=0,dd_Error=0;
intKp=10;
intKi=0;
intKd=0;
u8t=0,report=1;
//è
aé
±
¨
u8key;
doublestand_len=1.055,l1=0.75;
//μ¥?
×
floatpitch,roll,yaw;
//·
à
-
shortaacx,aacy,aacz;
//ó
ù
è
′D÷
-ê
ê
yY
shortgyrox,gyroy,gyroz;
//í
ó
Yò
shorttemp;
//è
floatfirst_yaw=0;
floatcurrent_yaw=0;
floatx=0.15;
//′ú
1·
¢í
1×
·
//c:
ò
a·
μ×
voidusart1_send_char(u8c)
{
while((USART1->
SR&
0X40)==0);
//μè
′yé
′·
í
USART1->
DR=c;
}
//′í
yYá
é
ú
t(V2.6°
)
//fun:
1|ü
.0XA0~0XAF
//data:
yYo′,×
28×
!
//len:
dataó
DD§
yYê
y
voidusart1_niming_report(u8fun,u8*data,u8len)
u8send_buf[32];
u8i;
if(len>
28)return;
//×
yY
send_buf[len+3]=0;
//D£é
yá
send_buf[0]=0X88;
send_buf[1]=fun;
//1|ü
send_buf[2]=len;
//ê
yY3¤
for(i=0;
i<
len;
i++)send_buf[3+i]=data[i];
//′ê
len+3;
i++)send_buf[len+3]+=send_buf[i];
oí
len+4;
i++)usart1_send_char(send_buf[i]);
//·
yYμ′ú
1
}
//·
yYoí
//aacx,aacy,aacz:
x,y,zè
y·
μó
μ
//gyrox,gyroy,gyroz:
μí
voidmpu6050_send_data(shortaacx,shortaacy,shortaacz,shortgyrox,shortgyroy,shortgyroz)
u8tbuf[12];
tbuf[0]=(aacx>
>
8)&
0XFF;
tbuf[1]=aacx&
tbuf[2]=(aacy>
tbuf[3]=aacy&
tbuf[4]=(aacz>
tbuf[5]=aacz&
tbuf[6]=(gyrox>
tbuf[7]=gyrox&
tbuf[8]=(gyroy>
tbuf[9]=gyroy&
tbuf[10]=(gyroz>
tbuf[11]=gyroz&
usart1_niming_report(0XA1,tbuf,12);
//×
0XA1
//í
1y′ú
1é
á
oó
ì
yYμ
//roll:
oá
1.μ¥0.01è
£-18000->
18000ó
|-180.00->
180.00è
//pitch:
.μ¥0.01è
£-9000-9000ó
|-90.00->
90.00è
//yaw:
oò
.μ¥a0.1è
0->
3600ó
|0->
360.0è
voidusart1_report_imu(shortaacx,shortaacy,shortaacz,shortgyrox,shortgyroy,shortgyroz,shortroll,shortpitch,shortyaw)
u8tbuf[28];
28;
i++)tbuf[i]=0;
//0
tbuf[18]=(roll>
tbuf[19]=roll&
tbuf[20]=(pitch>
tbuf[21]=pitch&
tbuf[22]=(yaw>
tbuf[23]=yaw&
usart1_niming_report(0XAF,tbuf,28);
0XAF
//////////////////////////////////////////////////////
voidTIM2_PWM_Init(u16arr,u16psc)
{
//IO
RCC->
APB1ENR|=1<
<
0;
//TIM2
APB2ENR|=1<
2;
//PORTA
3;
//PORTB
//GPIOB->
CRL&
=0XFF0FFFFF;
//PB5
GPIOB->
=0XFFFF0FFF;
//PB3
CRH&
=0XFFFF00FF;
//PB10/PB11
GPIOA->
=0X0FFFFFFF;
//PA15
CRL|=0X00B00000;
//PB5
CRL|=0X0000B000;
CRH|=0X0000BB00;
CRH|=0XB0000000;
//
//AFIO->
MAPR&
=0XFFFFF3FF;
//MAPR[11:
10]
AFIO->
=0XFFFFFCFF;
//MAPR[9:
8]
MAPR|=1<
11;
//,TIM3_CH2->
PB5
MAPR|=0X02000300;
//JTAG-DPSW-DP
TIM2->
ARR=arr;
PSC=psc;
//TIM2->
CCMR1|=7<
12;
//CH2PWM2
CCMR1|=0X7070;
CCMR1|=1<
//CH2
CCMR1|=0X0808;
CCMR2|=0X7878;
/*,PB10/PB11PWM*/
CCER|=1<
4;
//OC2
CCER|=0X1111;
//OC2
CR1=0x0080;
//ARPE
CR1|=0x01;
//3
}//CH1PA15
//CH2PB3
//CH3PB10
//CH49B11
///////////////////////////////////////////////////////////////////////////
shortget_gyrox(floatfirst_yaw,doublepoint,shortcurrent_gyrox,shortcurrent_gyroy)
{
doublep;
//μ±
°
D
doublepd;
//ú
μD
doublep1;
current_gyrox=current_gyrox/(16.384);
//μμù
pd=atan(point/stand_len);
p=asin(sqrt(sin(current_gyrox)*sin(current_gyrox)+sin(current_gyroy)*sin(current_gyroy)));
p1=sqrt(19.6/l1*(cos(p)-cos(pd)));
if(fabs(p)<
fabs(pd))//è
1μ±
Dó
{
gyrox=asin(sin(p1)*cos(yaw));
μXù
if(current_gyrox>
0)gyrox=fabs(gyrox);
else
{
gyrox=-fabs(gyrox);
}
}
else
gyrox=-asin(sin(p)*cos(yaw));
returngyrox;
shortget_gyroy(floatfirst_yaw,doublepoint,shortcurrent_gyroy,shortcurren