1、 显示模块方案选用常见的数码管显示,成本低,只能显示简单的字符和数字。显示位数较多时,轮番扫描占用CPU时间。选用12864显示屏做显示。12864的显示为128x64,显示面积大,数字和汉字显示容易实现,程序要求不是很高,更加方便。方案三:用彩屏做显示。彩屏显示效果好,但成本高,功耗大,编程设计相对繁琐。由于系统显示信息量较多,对比所述方案,选择12864作为系统显示器。电源模块方案电源是任何系统能否运行的能量来源,本系统中电源模块为主控制器、电机驱动、角度检测模块等提供电源。通过电阻分压的形式将整流后的电压分别降为控制芯片和电机运行所需的电压,此种方案原理和硬件电路连接都比较简单,但对能量
2、的损耗大,在实际应用系统同一般不宜采用。通过固定芯片对整流后的电压进行降压、稳压处理(如7812、7805等),此种方案可靠性、安全性高,对能源的利用率高,并且电路简单容易实现。根据系统的具体要求,采用方案二作为系统的供电模块。2.系统理论分析与计算角度确定风板运动过程中需要实时检测角度的变化,通过计算加速度传感器传回的数据,可以测得风板的角度,加速度与角度存在如下关系:风速控制 风速的快慢直接决定了系统风板角度的大小。通过pid调节,单片机输出PWM波形,可对风板进行快速、准确的调整。 通过不断调整P(比例)、I(积分)、D(微分)值,系统的稳定性得到明显的提高,响应时间也加快了。由各个参数
3、的控制规律可知,比例P使反应变快,微分D使反应提前,积分I使反应滞后。在一定范围内,P,D值越大,调节的效果越好。3.电路与程序设计硬件电路设计系统总体框图如图所示。图 系统总体框图单片机最小系统设计 MSP430F149单片机,其最小系统包括电源电路、复位电路、时钟电路,具体电路设计如图所示。图 最小系统原理图 角度测量设计 本系统中要实时监控风板的角度,系统采用mpu6050传感器,通过计算可迅速得出测量的角度,从而反馈给单片机进行相应操作。 显示模块设计本系统采用LCD12864作为显示,模块电路图如图 所示。图 LCD12864电路图直流风机驱动电机驱动芯片L298N内部包含4通道逻辑
4、驱动电路。是一种二相和四相电机的专用驱动器。L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。电机驱动电路如图所示。图电机驱动供电系统电路在电子电路及设备中,一般都需要稳定的直流电源供电。小功率的稳压电源的组成如图所示,它由电源变压器、整流电路、滤波电路和稳压电路四部分组成。直流稳压电源电路如图所示。图 直流稳压电路工作原理图 LM2596可调电源模块程序设计程序功能描述根据设计要求,软件部分主
5、要实现风机转速控制以及声光报警与液晶显示。 (1)风机转速控制部分:在键盘按下设定风板的角度后,风板15s内处于指定位置并稳定5秒以上,上下波动不超过5度,根据传感器测出的距离通过PID算法调整风机转速来调整风板的位置。 (2)键盘设置部分:在键盘按下后,风机作出相应转速,风板达到指定位置。 (3)液晶显示部分:液晶器显示风板位置及维持时间。程序设计思路系统程序主要由角度检测部分,PID调节部分和显示部分组成。设定需求角度,通过获取测量角度值来反馈给单片机,单片机做出相应的PWM调节,从而达到需求的角度。同时液晶将对实时采集的角度和按键值信息进行显示。程序流程图程序总体流程图如图所示,PWM控
6、制流程图如图所示,12864液晶显示电路流程图如图所示。图 程序主流程图 图 PWM控制电路 图 12864液晶程序流程图4系统测试测试仪器高精度的数字毫伏表、模拟示波器、数字示波器、数字万用表、指针式万用表、量角器、秒表。测试方案1、硬件测试对各个模块进行测试,测试通过后使用。2、软件仿真测试对程序的错误和不能正确实现的部分进行调节和改正。3、硬件软件联调对整体功能的实现进行进一步调节。 测试结果及分析测试结果a. 风板实际角度与角度传感器角度比较实测角406080100120130150角度传感器值5981101131b.风板角度与pwm关系如表所示。不带砝码测试次数设定角度测试误差完成时
7、间14526538549051156135带砝码789101112测试分析与结论根据上述测试数据,随着PWM的增加,风机的风速逐渐加大,风板设定的角度能维持35s,由此可以得出以下结论:1、风机的转速可通过PWM调控且成正比关系。2、风板实际角度与传感器检测的角度误差1度,当稳定时,角度误差小于5度波动,符合系统要求。综上所述,本系统达到设计要求。5 设计总结不说我们在电赛中学到的新知识是多么有价值,也不用说它拓宽了多少我们的眼界,只是说它让我们的能力得到提高就已足以成为我们努力付出的回报。在这四天三夜的奋战中,遇到过很多困难,搭载硬件时,由于对量角器安装角度有误差,导致软件校准时存在较大误差
8、,经过仔细排查,不断改变方案,最终解决了问题。软件调试时,PID参量设置成了最头疼的问题,过大调整系统波动较大,过小调整风板很难达到预设角度。功夫不负有心人,两天的幸苦没有白费,当风机稳定的转动到达预设角度时,喜悦之情难以言表。理论与现实总是用通过实践联系起来的,我们在这次比赛中不再是局限于课本或是参考资料中的理论知识,而是把所有的实验都按部就班的做过,并通过实验结果对所理解的知识进行了加强巩固,更是对原来的理解偏差进行了改正,使我们对平时所学的课程更加透彻。当然,我们自己动手焊接了不少硬件电路,用到了大量的基础知识,还把实习中学到的焊接技术,对以前的知识进行了一次整合。再来,它增强了我们的沟
9、通能力。合作精神是一个团队成立成长的根本所在,我们组的队员从第一个合作项目起就十分的团结,大家各有分工,共同讨论,为我们日后的工作能力打下了基础。这次大赛给予了我们很多,通过这次比赛大家一起交流学习,互帮互助,增强了合作意识。老师们的帮助让我们感觉老师不再仅仅是一个指导者,更像一个家长带领我们成长,让我们跟老师之间的关系更加的紧密。最后,我们衷心感谢我们的指导老师,也祝愿此次大赛圆满成功!附录1:电路原理图附录2:源程序#include #include #define P_DATA #define I_DATA 0#define D_DATA 0typedef struct PID int
10、SetPoint; /设定目标 Desired Value long SumError; /误差累计 double Proportion; /比例常数 Proportional Const double Integral; /积分常数 Integral Const double Derivative; /微分常数 Derivative Const int LastError; /Error-1 int PrevError; /Error-2PID;static PID sPID;static PID *sptr = &sPID;void IncPIDInit(int target) sptr-
11、SumError = 0; /误差的累加LastError = 0;PrevError = 0;Proportion =P_DATA;Integral =I_DATA;Derivative =D_DATA;SetPoint =target; /目标/增量式 PID 控制设计void PID_dat(unsigned int target)int IncPIDCalc(int NextPoint) register int iError, iIncpid; /当前误差 iError = sptr-SetPoint - NextPoint; /增量计算 iIncpid = sptr-Proport
12、ion * iError /Ek 项 - sptr-Integral * sptr-LastError /Ek1 项 + sptr-Derivative * sptr-PrevError; /Ek2 项 /存储误差,用于下次计算PrevError = sptr-LastError;LastError = iError; /返回增量值 return(iIncpid);/位置式 PID 控制设计unsigned int LocPIDCalc(int NextPoint) register int iError,dError; /偏差SumError += iError; /积分 dError =
13、iError - sptr- /微分 return(sptr-Proportion * iError /比例项SumError /积分项Derivative * dError); /微分项#includeint cunt=0;uchar dis5; /显示数字(-511至512)的字符数组int dis_data;float Tvae() int data_xyz3; float Roll,Pitch,zz,Q,T,K; data_xyz0=GetData(ACCEL_XOUT_H); /合成数据 data_xyz1=GetData(ACCEL_YOUT_H); data_xyz2=GetDa
14、ta(ACCEL_ZOUT_H); Q=(float)data_xyz0*; /分别是加速度X,Y,Z的原始数据,10位的 T=(float)data_xyz1*; K=(float)data_xyz2*; Roll=(float)(atan2(K,T)*180/-90); /X轴角度值 return ( -Roll);void lcd_printf(uchar *s,int temp_data) if(temp_data0) temp_data=-temp_data; *s=-; else *s= *+s =temp_data/100+0 temp_data=temp_data%100; /
15、取余运算 *+s =temp_data/10+ temp_data=temp_data%10; *+s =temp_data+ *+s=0void InitMPU6050() /Single_WriteI2C(PWR_MGMT_1, 0x80); /复位 Single_WriteI2C(PWR_MGMT_1, 0x00); /解除休眠状态 Single_WriteI2C(SMPLRT_DIV, 0x07); /陀螺仪采样率,典型值:0x07(125Hz) Single_WriteI2C(CONFIG, 0x06); /低通滤波频率,典型值:0x06(5Hz) Single_WriteI2C(G
16、YRO_CONFIG, 0x18); /陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) Single_WriteI2C(ACCEL_CONFIG, 0x01);/加速计自检,测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)/*/合成数据int GetData(uchar REG_Address) char H,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return (H8)+L; /合成数据/在12864上显示10位数据int Display10BitData(in
17、t value) value/=64; /转换为10位数据 lcd_printf(dis, value); /转换数据显示 /csj(y,x,dis); return value;void I2C_Start() SDA1; /拉高数据线 SCL1; /拉高时钟线 delayus(5); /延时 SDA0; /产生下降沿 SCL0; /拉低时钟线/I2C停止信号void I2C_Stop() /拉低数据线 /产生上升沿/I2C发送应答信号/入口参数:ack (0:ACK 1:NAK)void I2C_SendACK(uchar ack) SDAOUT; if(ack) SDA1; else S
18、DA0;/ SDA = ack; /写应答信号/I2C接收应答信号uchar I2C_RecvACK() uchar cy; SDAIN; if(SDADATA) cy=1; else cy=0;/ cy = SDA; /读应答信号 return cy;/向I2C总线发送一个字节数据void I2C_SendByte(uchar dat) uchar i; for (i=0; i8; i+) /8位计数器 if(dati)&0x80) / SDA = cy; /送数据口 I2C_RecvACK();/从I2C总线接收一个字节数据uchar I2C_RecvByte() uchar dat =
19、0,cy; /使能内部上拉,准备读取数据, dat = 1; if(SDADATA) dat |= cy; /读数据 return dat;/向I2C设备写入一个字节数据void Single_WriteI2C(uchar REG_Address,uchar REG_data) I2C_Start(); /起始信号 I2C_SendByte(SlaveAddress); /发送设备地址+写信号 I2C_SendByte(REG_Address); /内部寄存器地址, I2C_SendByte(REG_data); /内部寄存器数据, I2C_Stop(); /发送停止信号/从I2C设备读取一个字节数据uchar Single_ReadI2C(uchar REG_Address) uchar REG_data; /发送存储单元地址,从0开始 I2C_SendByte(SlaveAddress+1); /发送设备地址+读信号 REG_data=I2C_RecvByte(); /读出寄存器数据 I2C_SendACK(1); /接收应答信号 /停止信号 return REG_data;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1