风力摆最终版
2015年全国大学生电子设计竞赛
风力摆控制系统(B题)
2015年8月15日
风力摆控制系统
摘要 STC89C52是单片机里应用比较广泛的一款,在自动控制领域里享有很高的价值。本设计采用STC89C52单片机作为主控制芯片,设计并制作一套风力摆控制系统。该系统主要是以单片机最小系统模块、电源模块、电机驱动模块、12864液晶显示模块组成的。利用三轴加速度陀螺仪MPU-6050对轴流风机姿态的采集反馈给STC89C52,通过PID控制算法提高动态性能,实现类似自由摆运动、幅度可控的摆动,以及按照设置的方向(角度)摆动等功能。
关键词:STC89C52,三轴加速度陀螺仪、L298N驱动、轴流风扇、12864液晶显示。
Abstract
STC89C52 is a wide range of applications in the micro controller, in the field of automatic control to enjoy a high value. This design uses STC89C52
micro controller as the main control chip, design and manufacture a set of wind pendulum control system. The system is mainly based on single-chip micro- computer system module, power supply module, motor driver module, 12864 LCD module. Using the three axis acceleration gyroscope MPU-6050 to collect feedback to the STC89C52, the PID control algorithm is used to improve the dynamic performance, and to achieve a similar free swing motion, the am- plitude controllable swing, and in accordance with the direction of setting (angle) swing and other functions.
Keywords: STC89C52, three axis acceleration gyroscope, L298N drive, axial flow fan, 12864 LCD
目录
一.方案论证 ....................................................... 1
1. 系统方案的总体程序框图 ....................................... 1
1.1微控制器的论证与选择.......................................... 1
1.2风扇控制方案选择.............................................. 1
1.3电机驱动的论证与选择.......................................... 2
1.4速度控制的论证与选择.......................................... 2
1.5 角度测量方案选择............................................. 2
1.6 显示方案选择................................................ 3
二.系统理论分析与计算............................................. 3
2.1风扇调试原理.................................................. 3
2.2风力摆状态测量与计算.......................................... 4
2.3控制算法分析.................................................. 4
三.系统结构....................................................... 5
3.1机械结构...................................................... 5
3.2测控电路结构.................................................. 5
四.系统软件........................................................6
4.1主程序流程框图................................................ 6
五.测试方案及结果.................................................. 6
六.结束语.......................................................... 7
七.参考文献........................................................8 附录
一.系统方案:
1.系统总体设计框图如下图所示
1.1微控制器的方案选择与论证
方案一:采用FPGA(现场可编程门阵列)作为系统的控制器。
将所有的器件集成在一块芯片上,这样外围电路较少,控制板的体积小,稳定性高,扩展性能好;而且FPGA采用并行的输入/输出方式,系统处理速度快,再加上FPGA有方便的开发环境和丰富的开发工具等资源可利用,易于调试;但是FPGA得成本偏高,算术运算能力不强,而本设计系统的设计会用到较多算术运算,所以FPGA的高速处理的优势得不到充分体现。
方案二:采用STC公司的STC89S52RC单片机作为主控制器。
STC89C52RC单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。并且由于其成本低,体积小和功耗低等优点,使其在各个领域应用广泛;另外,由于本设计中会用到较多的算术运算,所以对本系统来说非常适合利用单片机作为控制器。
从方便使用的角度考虑,我们选择了方案二,采用STC公司的STC89C52RC单片机作为主控制器。 1.2风扇控制方案选择
方案一:采用可控硅控制调速,通过控制双向可控硅的导通角,使输出端电压发生改变,从而使施加在电风扇的输入电压发生改变,以调节风扇的转速,实现各档位风速的无级调速。但可控硅控制控制原理决定了只能滞后触发,因此,晶闸管可控制整流器对交流电源来说相当于一个感性负载,吸取滞后的无功电流,因此功率因素低。故我们不选用该方案。
方案二:采用直流斩波控制,改变电压输出开关断时间,将直流电源电压断续加到负载上,即可实现风扇调速控制,它具有效率高、体积小、成本低等优点。我们可以采用单片机由软件来实现PWM波,简化系统硬件设计,通过改变PWM波的占空比的值即可改变电枢端电压的平均值从而达到调速的目的。
故综合考虑实际中选择方案二。
1.3电机驱动的论证与选择
方案一:采用继电器对电动机的开或关进行控制,通过开关的切换对轴流风机的速度进行调整。这个方案的优点是电路较为简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短、可靠性不高。
方案二:采用集成电路驱动芯片L298N,L298N内含两个H桥的高电压大电流双全桥式驱动器,可驱动46v,2A以下电机,1和15脚可单独引出接电流采样电阻器,形成电流传感信号,同时通过单片机控制产生PWM波,精确控制电机转速。这种电路驱动能力强,可以简单地实现转速和方向的控制,稳定性高。
方案三:采用互补硅功率达林顿管TIP142T实现电机的驱动,采用该方法电路连接比较简单,稳定性好,成本低廉,但不足之处是由于使用分立元件,安装和调试相对麻烦。
基于上述理论分析,本系统采用方案二作为电机驱动电路。
L298N驱动电路图
1.4速度控制的论证与选择
方案一:采用D/A变换电路将数字量转换成控制电机电压的模拟量。再利用电平的高低达到调速的目的。本方案达到了利用CPU输出的数字量精确控制模拟量的目的。但是电路比较复杂,成本较高。
方案二:采用脉宽调制方式(PWM)从I/O口输出不同占空比的脉冲,经滤波后获得不同甘共苦高低电平控制电机。本方案可以达到对速度的控制要求,且控制简单易实现。
总结:通过比较明显方案二最单洁清晰、容易实现、速度快、精度高。从系统指标要求来看,对速度要求较高,低速与高速之间差别较大,且准确度要求高,各个速度之间的切换也要求简单、迅速。所以我们选用方案二作为控制部分具体实施的方案。
1.5角度测量方案选择
方案1:采用由UZZ9001和KMZ41组成角度测量模块,KMZ41是一种利用磁阻效应测量角度的传感器 ,采用非接触的方式利用磁场对介质材料电阻的影响将角度信号转换为电信号,能够对180 范围内的角度信号进行测量,并利用SPI方式提供 11位的角度信号输出。避免了由接触面带来的损耗 ,该型传感器体积小、价格低、寿命长等优点。但使用该方案需外加磁场,外界磁场对角度测量
影响误差大,故不选用此方案。
方案二:采用三轴加速度陀螺仪。
陀螺仪范围:+250 -250 + 500 -500 + 1000 -1000 + 2000 -2000/s,加速度范围:+ 2 -2 +4 -4 +8 -8 +16 -16g在经过计算之后能准确测量出轴流风机偏离的竖直平面的夹角,易于单片机控制。同时MPU-6050芯片可与52板通信,电路简单。
综上考虑我们选择此方案二,采用三轴加速度陀螺仪。
1.6显示方案选择
方案一:使用数码管显示,通过数码管显示被测角度和设定角度。该方案程序简单,但硬件占用单片机I/O口较多,对于尽量节约端口,让线路简单来说不是好方法,而且显示也不够直观灵活,只能显示数字,不能显示汉字显示功能提示,故不适合本次设计应用。
方案二:使用液晶屏LCD12864,具有体积小,使用方便等特点。并且可以显示字母,数字及汉字等功能,观察显示很直观,通过字幕显示各种菜单界面 、设定角度、测量角度等。该方案程序较复杂,但显示观察清晰,显示直全符合本系统设计功能。故为最佳方案,我们选择方案二。
12864液晶显示原理图
二.系统理论分析与计算
2.1 风扇调试原理
单片机控制的小型直流电机的一般采用PWM脉冲调制方式实现速度的控制。
PWM基本原理: PWM即脉冲宽度调制(定义),是直流电源电压基本不变的情况下通过电子开关的通断,改变施加到电机电枢端得直流电压脉冲宽度(即所谓的占空比),以调节输入电机电枢的电压平均值的调速方式。
通过改变直流电机电枢上电压的"
占空比"来改变平均压的大小,从而控制电动机的转速。只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。
设电机始终接通电源时,电机转速最大为
Vmax, 设占空比为D=t1/T,则电机的平均速度为式中,Vd -- 电机的平均速度; Vmax- -电机全通电时的速度(最大); D=t1/T ---占空比。 由此可见,当我们改变占空比D:t1/T时,就可以得到不同的电机平均速度Vd ,严格地讲,平均速度 Vd与占空比 D并不是严格的线性关系,在一般的应用中,可以将其近似地看成线性关系。
风扇
驱动电路
2.2 风力摆状态的测量与计算
采用高精度的陀螺加速度计MPU6050 不断采集风力摆姿态角数据。
MPU6050 集成了3 轴MEMS 陀螺仪,3 轴MEMS 加速度计,以及一个可扩展的数字运动处理器DMP。MPU6050 和所有设备寄存器之间的通信采用400kHz
的I2C 接口,实现高速通信。且内置的可编程卡尔曼滤波器,采用最优化自回 归数据处理算法精确测量风力摆当前姿态角。MPU6050 对陀螺仪和加速度计分 别用了三个16 位的ADC,将其测量的模拟量转化为可输出的数字量,通过DMP 处理器读取测量数据然后通过串口输出。
角度检测电路
2.3控制算法的分析
本系统采用PID 算法来控制风机转动的速度。风机开始工作后,陀螺加速度计MPU6050采集模块不断采集当前风力摆姿态角状态,并与之前的状态比较,使得风力摆的运动状态逐渐趋向于平稳。PID 算法控制器由舵机转动角度比例P、角度误差积分I和角度微分D 组成。
风力摆转动角度比例P:对风力摆角速度进行比例调整,即对风机转动速度
调整。比例越大,调节速度越快。但不能过大,过大可能造成四风机因工作状态 突变而是摆杆不稳定。
角度误差积分I:使系统消除稳态误差,提高无差度。加入积分调节可使系 统稳定性下降,动态响应变慢。本系统追求更快更稳完成对风力摆的控制,因此, 本系统对积分调节的需要就非常弱。即保证在不需要时系统不会受到影响。 角度微分D:微分作用反映风力摆角度的变化率,即角速度。具有预见性,能预见偏差变化的趋势因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,减少调节时间。
三.系统结构
3.1机械结构
机械结构的稳定性直接影响系统的稳定性。故该风力摆以铁板作为底座,稳固性能好,其机械结构图如下:
风力摆结构示意图
3.2测控电路结构
四.系统软件设计
4.1 主程序流程图
五.测试方案及结果
基本要求一:
六.结束语
经过我们小组的努力,我们终于成功的完成了题目的要求。制作过程中,我们遇到了很多困难,比如三轴加速度陀螺仪的使用,12864液晶屏的显示,风机转速的调整等。但我们通过自己研究,都一一克服了。经过这次比赛我们深刻体会到了团队精神和自己解决问题的能力,在此,衷心的感谢老师们对我们的培养。
七.参考文献
[1] 童诗白,华程英.模拟电子技术基础(第四版)[M].北京:高等教育出版 社,2009.
[2] 阎石.数字电子技术基础(第五版)[M].北京:高等教育出版社,2009.
[3] 黄智伟,王彦,陈文光等.全国大学生电子设计竞赛训练教程[M].北京:电子 工业出版社,2007.
[4] 高吉祥,唐朝京.全国大学生电子设计竞赛培训系列教程(电子仪器仪表设 计)[M].北京:电子工业出版社,2007.
[5]张友德、赵志英、涂时亮.单片微型机原理、应用与实践(第五版)[M].上 海:复旦大学出版社,2009.
[6]郭天祥.新概念51 单片机C 语言教程.入门、提高、开发[M].北京:电子工业
出版社,2009.
[7]梁明理.电子线路(第五版)[M].北京:高等教育出版社,2008.
附录:
主程序:
#include
#include
#include "typedef.h"
#include "lcd12864.h"
#include "I2C.h"
#include "pwm.h"
#include "sbit.h"
BYTE BUF[8];
uchar dis[5], c_i = 0,ds_arr[5],setbh_arr[5];
uchar KEY_1_types =0;
int dis_data,ACCE_X,ACCE_Y,ACCE_Z;
float angleAx,angleYx,angleZx;
void init()
{
EA=1;
EX0=0;
IT0=1;
}
void scanf_key0()
{
if(!KEY_1)
{
delay1ms(10);
if(!KEY_1)
{
while(!KEY_1);
KEY_1_types++;
if(KEY_1_types > 15 )
{
KEY_1_types = 0;
}
}
}
}
void Play_page0()
{
Myprintf_s12864(0,1,"2015年电子设"); Myprintf_s12864(1,2,"计大赛");
Myprintf_s12864(2,0,"风力摆");
Myprintf_s12864(2,3,"控制系统");
Myprintf_s12864(3,0,"基础部分:");
}
void display()
{
float x,y,z;
Myprintf_c12864(1,0,'X');
Myprintf_c12864(2,0,'Y');
Myprintf_c12864(3,0,'Z');
ACCE_X=(GetData(ACCEL_XOUT_H));
ACCE_Z=(GetData(ACCEL_ZOUT_H));
x=(float)ACCE_X/4096.0;
z=(float)ACCE_Z/4096.0;
angleAx=atan2(x,z)*180/3.14;
lcd12864printf(dis,angleAx);
Myprintf_s12864(1,1,"轴夹角");
LCD12864_WriteData(':');
for(c_i = 0;c_i
{
LCD12864_WriteData(dis[c_i]); }
LCD12864_WriteData(0xa1);
LCD12864_WriteData(0xe3);
ACCE_Y=(GetData(ACCEL_YOUT_H));
ACCE_Z=(GetData(ACCEL_ZOUT_H));
y=(float)ACCE_Y/4096.0;
z=(float)ACCE_Z/4096.0;
angleYx=atan2(y,z)*180/3.14;
lcd12864printf(ds_arr, angleYx);
Myprintf_s12864(2,1,"轴夹角");
LCD12864_WriteData(':');
for(c_i = 0;c_i
{
LCD12864_WriteData(ds_arr[c_i]); }
LCD12864_WriteData(0xa1);
LCD12864_WriteData(0xe3);
ACCE_X=(GetData(ACCEL_XOUT_H));
ACCE_Y=(GetData(ACCEL_YOUT_H));
x=(float)ACCE_X/4096.0;
y=(float)ACCE_Y/4096.0;
angleZx=atan2(x,y)*180/3.14;
lcd12864printf(setbh_arr, angleZx);
Myprintf_s12864(3,1,"轴夹角");
LCD12864_WriteData(':');
for(c_i = 0;c_i
{
LCD12864_WriteData(setbh_arr[c_i]); }
LCD12864_WriteData(0xa1);
LCD12864_WriteData(0xe3);
}
void main()
{
init();
LED_1 = 0;
LED_2 = 0;
ENA_1 = 0;
ENB_1 = 0;
ENA_2 = 0;
ENB_2 = 0;
beep = 1;
KEY_1 = 1;
KEY_2 = 1;
LCD12864_PSB = 0;
delay(300);
LCD12864_Init();
InitMPU3050();
delay(100);
Play_page0();
delay(2000);
while(1)
{
scanf_key0();
if(KEY_1_types == 1)
{
LCD12864_WriteCom(0x01);
Myprintf_s12864(0,0,"第一步:");
go_rightone();
if( (-70)> angleZx > (-110)) {
LED_1 = 1;
beep = 1;
delay(200);
}
else
{
LED_1 = 0;
beep = 0;
delay(200);
}
}
else if(KEY_1_types == 3)
{
LCD12864_WriteCom(0x01);
Myprintf_s12864(0,0,"第二步 设定值:"); Myprintf_s12864(1,0,"");
if(KEY_1_types == 5)
{
Myprintf_s12864(2,0,"30CM:"); }
else if(KEY_1_types == 7)
{
Myprintf_s12864(2,4,"40CM:"); }
else if(KEY_1_types == 7)
{
Myprintf_s12864(3,0,"60CM:"); }
}
}
}
void init_0() interrupt 0 using 1
{
if(KEY_2 == 0)
{
delay1ms(5);
if(KEY_2== 0)
{
ENA_1 = 0;
} ENB_1 = 0; ENA_2 = 0; ENB_2 = 0; } }