风力摆控制系统 设计报告
全国大学生电子设计竞赛B题风力摆设计报告

2015年全国大学生电子设计竞赛风力摆控制系统( B 题)2015 年8 月15 日本文以IAP单片机为控制核心,可以在运行过程中对User Flash的部分区域进行烧写;MPU605是陀螺仪与加速度传感器的结合,可实时检测出风力摆的状态并由单片机处理后通过PID控制算法实现闭环调节,实现对直流电机转速的控制以此来达到风力摆的动态平衡。
系统设计结构简单,制作成本低,控制精度高。
风力摆运行状态由液晶显示,智能性好,反应速度快,具有良好的人机交互界面。
目录一、系统方案 (1)1、电机的论证与选择12、单片机的论证与选择...............................................................13、电机驱动电路的论证与选择1二、系统理论分析与计算22.1保证系统稳定性的方法 (2)⑴选取合适的材料搭建支架 (2)(2)选取适宜的硬件提高精准度 (2)1、小型直流电机电路32、显示模块的电路33、电机驱动电路3三、系统设计31、系统流程图32、程序设计(见附录) ................................................................3四、测试方案及结果31、测试仪器32、测试结果33、测试分析 (5)五、结论与心得5六、参考文献5附录1 :源程序 (6)风力摆控制系统( B 题)【本科组】一、系统方案本系统主要由控制处理模块、角度,加速度检测模块、驱动模块、电源模块、显示组成,下面分别论证这几个模块的选择。
1、电机的论证与选择方案一:采用步进电机。
步进电机具有动态响应快、易于起停,易于正反转及变速的优点。
但缺点是它以步进式跟进,角度小于一个步距角时是系统响应盲区,而且经过测试步进电机在控制旋转臂时,抖动性大并且容易出现卡顿现象,所以不适合风力摆的控制。
方案二:采用小型轴流风机。
扭矩大,体积小,驱动电路简单,稳定强,负载能力强等优点。
风力摆系统设计

风力摆系统摘要风力摆系统是一种利用风力对物体进行位置控制的设备,在我国虽然还没有成品的销售与应用,但这种控制理论已经应用于方方面面。
目前的普遍问题风力摆系统的自动控制水平不高。
本设计将设计一款智能的风力摆控制系统。
主要控制程序由STM32来实现。
通过三轴陀螺仪进行角度采集,采集过来的角度值在进行卡尔曼滤波处理,最后将其应用到风力摆系统的控制程序中。
主要实现对风力摆进行偏角的收集和计算、控制其运动轨迹,包括其角加本设计主控制器利用STM32作为开发硬件系统。
它能够对系统进行良好的操控,包括控制与监测风力摆的运动状态、角度值、加速度和平衡参数。
轴部是通过万向节连接的,整体运动自如是通过它来实现。
系统整体架构清晰,便于操控。
关键词:风力摆;STM32;陀螺仪;卡尔曼滤波AbstractWindpendulumsystemisakindofmicrocontrolequipment,thoughnotyetfinishedp roductsalesandapplicationinourcountry,butthiskindofcontroltheoryhasbeenusedin everyaspect.Atpresentthecommonproblemsofwindpowersystemautomaticcontrollevelisnothigh.Thisdesignwilldesignaintelligentwindpendulumcontrolsystem.Thema incontrolprogramimplementedbythestm32.AcquisitionthroughthetriaxialgyroAngl e,theAngleofthecollectedvaluesinthekalmanfilterprocessing,theAnglevalueshavebe enobtainedthroughcomparingtheAnglevaluesbeforeandafterjudgmentaftertheosci llationamplitude,windpendulumswingwillneedthesizeoftheforceisconvertedintoPW Mvalue,thenoutputtothemotordrive,ofcourse,whenthemotortodrivetheoutputtone edtoaddtheprotectionlightcouplingforphotoelectricisolation.Controlsystemtoproce ssthedataofeachsensormeasurementandcalculation,thecorrespondingequipmentd eviceeffectively,goodcontrol,thesystemcanrunsafelyandeffectively.ThisdesignusesS TM32asmaincontrollerhardwaresystemdevelopment.Itcancarryonthegoodcontrolof thesystem,includingthecontrolandmonitoringwindpendulummotionstate,Angle,acc eleration,andbalanceparameters.Axisisthroughuniversaljointconnection,andtheove rallfreelyistoachievethroughit.Overallsystemstructureclear,easytocontrol.Keywords: STM32,microwindpendulumcontrollightcouplinggyroscopeContentsTOC \o "1-3" \h \z \u 摘要IIAbstractIIICONTENTSVI第1章绪论81.1课题背景81.2课题的来源91.3课题的国内外现状91.4本课题研究的内容10第2章总体方案的设计112.1系统功能、要求及原理分析122.1.1设计任务122.1.2系统机械结构122.2控制方式选择132.2.1角度测量方案的论证与选择132.2.2直流风机驱动模块的论证与选择14 2.2.3控制系统的论证与选择142.2.4风力摆运动控制方案的选择与论证15 2.2.5电源方案的论证与选择152.2.6电机速度控制162.2.7控制算法的选择162.2.8理论分析与计算162.3控制系统方案17第3章风力摆控制系统硬件设计173.1芯片选用183.2控制流程图203.3角度采集控制设计203.4程序滤波设计223.5光电隔离设计223.6系统主电路设计243.7电机控制设计243.8电源以及稳压模块设计273.8.1LM2596S电源模块273.8.2LM7805稳压芯片及应用电路28第4章控制系统程序设计294.1程序需求304.2主程序流程图304.3控制程序流程图304.4PWM输出设计314.4.1Pwm构成314.5PID及其应用344.5.1模拟PID控制规律及实现方法35 4.5.2数字PID控制364.5.3增量式PID374.5.4PID参数整定374.5.5PID控制分析384.6圆形轨迹摆动控制39致谢40参考文献41CONTENTSTOC \o "1-3" \h \z \u AbstractI摘要IIAbstractIIICONTENTSVI第1章绪论81.1课题背景81.2课题的来源91.3课题的国内外现状91.4本课题研究的内容10第2章总体方案的设计112.1系统功能、要求及原理分析122.1.1设计任务122.1.2系统机械结构122.2控制方式选择132.2.1角度测量方案的论证与选择132.2.2直流风机驱动模块的论证与选择14 2.2.3控制系统的论证与选择142.2.4风力摆运动控制方案的选择与论证15 2.2.5电源方案的论证与选择152.2.6电机速度控制162.2.7控制算法的选择162.2.8理论分析与计算162.3控制系统方案17第3章风力摆控制系统硬件设计173.1芯片选用183.2控制流程图203.3角度采集控制设计203.4程序滤波设计223.5光电隔离设计223.6系统主电路设计243.7电机控制设计243.8电源以及稳压模块设计273.8.1LM2596S电源模块273.8.2LM7805稳压芯片及应用电路28第4章控制系统程序设计294.1程序需求304.2主程序流程图304.3控制程序流程图304.4PWM输出设计314.4.1Pwm构成314.5PID及其应用344.5.1模拟PID控制规律及实现方法35 4.5.2数字PID控制364.5.3增量式PID374.5.4PID参数整定374.5.5PID控制分析384.6圆形轨迹摆动控制39致谢40参考文献41绪论课题背景风力在能源方面的应用最早可追溯到古代世纪初,那时人们利用风吹动帆,在海上驾驭大型船只。
风力摆控制系统设计

摘要:本次风力摆控制系统设计,采用4个直流风机垂直挂在长约70cm的细管下方,直流风机下方固定一个激光笔,当风力摆受控制按一定规律运动时,激光笔在地上画出相应的轨迹。
本设计以STC15W4K32S4系列的芯片作为主控芯片,采用LM298模块作电机驱动,通过单片机控制其输入占空比获得不同高低电平,达到对电机转速的控制。
空间角度测量中,本设计采用MPU-6050陀螺仪对空间角度进行准确追踪,精度高。
最终可将所测部分数据传输到LCD12864显示出来。
关键字:STC15W4K32S4单片机轴流风机陀螺仪一、设计任务设计一测控系统,控制驱动各风机使风力摆按照一定规律运动,激光笔在地面画出要求的轨迹。
1.基本要求(1)从静止开始,15s内控制风力摆做类似自由摆运动,使激光笔稳定地在地面画出一条长度不短于50cm的直线段,其线性度偏差不大于±2.5cm,并且具有较好的重复性;(2)从静止开始,15s内完成幅度可控的摆动,画出长度在30~60cm间可设置,长度偏差不大于±2.5cm的直线段,并且具有较好的重复性;(3)可设定摆动方向,风力摆从静止开始,15s内按照设置的方向(角度)摆动,画出不短于20cm的直线段;(4)将风力摆拉起一定角度(30°~60°)放开,5s内使风力摆制动达到静止状态。
2.发挥部分(1)以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面画圆,30s内需重复3次;圆半径可在15~35cm范围内设置,激光笔画出的轨迹应落在指定半径±2.5cm的圆环内;(2)在发挥部分(1)后继续作圆周运动,在距离风力摆1~2m距离内用一台50~60W台扇在水平方向吹向风力摆,台扇吹5s后停止,风力摆能够在5s内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹;(3)其他。
二、方案论证基于本次风力摆控制系统的设计,我们有如下几种方案:方案一:采用传统的51单片机做主控芯片,其体积小,价格便宜,控制简单,但其运算速度慢,内部存储容量小,难以存储大体积的程序和实现快速精准的反应控制。
全国大学生电子设计竞赛B题风力摆设计报告精编版

全国大学生电子设计竞赛B题风力摆设计报告公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-2015年全国大学生电子设计竞赛风力摆控制系统(B题)2015年8月15日摘要本文以 IAP 单片机为控制核心,可以在运行过程中对User Flash的部分区域进行烧写;MPU6050是陀螺仪与加速度传感器的结合,可实时检测出风力摆的状态并由单片机处理后通过PID 控制算法实现闭环调节,实现对直流电机转速的控制以此来达到风力摆的动态平衡。
系统设计结构简单,制作成本低,控制精度高。
风力摆运行状态由液晶显示,智能性好,反应速度快,具有良好的人机交互界面。
目录风力摆控制系统(B题)【本科组】一、系统方案本系统主要由控制处理模块、角度,加速度检测模块、驱动模块、电源模块、显示组成,下面分别论证这几个模块的选择。
1、电机的论证与选择方案一:采用步进电机。
步进电机具有动态响应快、易于起停,易于正反转及变速的优点。
但缺点是它以步进式跟进,角度小于一个步距角时是系统响应盲区,而且经过测试步进电机在控制旋转臂时,抖动性大并且容易出现卡顿现象,所以不适合风力摆的控制。
方案二:采用小型轴流风机。
扭矩大,体积小,驱动电路简单,稳定强,负载能力强等优点。
综合比较以上两种电机,结合设计所需平稳的控制摆杆处于竖直状态,故选择小型轴流风机。
2、单片机的论证与选择方案一:采用 AT89C52 单片机。
AT89C52 单片机是一种低功耗、高性能CMOS 8 位微控制器,具有 8K 在系统可编程 Flash 存储器。
方案二:采用IAP15F2K61S2 单片机。
IAP 系列单片机具有低功耗、高速度、超强抗干扰等优点。
方案三:采用 STC89C52RC 单片机本身带有有 8 路十位 AD 转换和 2 路PWM,而且处理速度比一般单片机要快,精度高。
综合比较以上三种单片机。
为了更方便、高精度、高速度地控制系统,完成题目要求,故选择 IAP15F2K61S2 单片机为主控芯片。
全国大学生电子设计竞赛设计报告风力摆

2015年全国大学生电子设计竞赛风力摆控制系统(B题)2015年8月15日摘要本风力摆系统主要包括单片机控制模块,开关电源(电源模块)激光笔及小型轴流风机,以及基于六轴倾角仪mpu6050的闭环控制系统。
其中控制模块采用STM32为核心控制芯片,激光笔作为系统的执行机构,12V2.5A的小型轴流风机作为驱动风力摆的唯一动力,用12V的开关电源驱动轴流风机。
轴流风机和摆杆通过万向节固定在支架上(用粗股导线将风力摆悬挂在支架上)。
固定在支架上,测量得到的角度经过软件处理得到风力摆摆动所需要的PWM值。
(本系统的PID 算法算法是通过实际经验试验出风力摆的控制规律,稳定的完成风力摆运动过程中激光笔画轨迹。
)关键词:风力摆; STM32; 轴流风机; PID算法; mpu6050目录一、系统结构方案与设计 (1)1、机械结构设计 (1)2、主控芯片的论证与选择 (1)3、风力摆结构方案的论证和选择 (2)4、运动控制算法的论证和选择 (2)二、系统理论分析与计算 (2)1、摆杆位置检测 (2)2、风力摆运动控制分析 (2)3、控制算法分析 (2)三、电路与程序设计 (3)1、电路的设计 (3)(1)STM32最小系统电路 (4)(2)稳压电源电路 (4)2、程序的设计 (4)(1)程序功能描述与设计思路 (4)(2)程序流程图 (4)四、测试方案与测试结果 (5)1、测试方案 (5)2、测试条件与仪器 (5)3、测试结果及分析 (5)(1)测试结果(数据) (5)(2)数据分析与结论 (7)五、结论与心得 (7)六、参考文献 (8)附录1:电路原理图 (9)附录2:源程序 (11)风力摆控制系统(B题)【本科组】一、系统结构方案与设计1、机械结构设计我们以生钢为材料加工成的十字作为风力摆支架的底盘,结构坚固克服摆动时的震动。
以实心的钢棒作为摆杆减小了摆动时的自旋,用万向节将摆杆和支架的水平臂连接保证了摆动的灵活性以及达到了摆动角度和速度的精确控制。
风力摆控制系统方案

风力摆控制系统方案简介风力摆控制系统是用来控制风力摆的运动的一种系统。
风力摆通常用于测量风力的强度和方向,以便在风能利用方面进行相应的调整和优化。
本文将介绍一个设计用于控制风力摆运动的系统方案。
目标本系统的目标是实现对风力摆的精确控制,使其可以随需要而停止、开始或改变方向。
通过控制风力摆的运动,可以提高其测量精度,并确保风能的高效利用。
系统组成本系统主要由下面几个组成部分构成:1. 风力摆风力摆是本系统的核心部件,它用于测量风向和风速。
风力摆通常由一个垂直铰接杆和一个悬挂在杆上的摆锤组成。
当风吹过摆锤时,摆锤会向相反方向摆动,从而使测量者能够通过观察摆动的幅度和方向来判断风的强度和方向。
2. 传感器为了实现对风力摆的控制,需要安装相应的传感器来检测风力摆的姿态和运动。
常用的传感器包括倾斜传感器和加速度传感器。
倾斜传感器用于检测风力摆的倾斜角度,而加速度传感器用于检测风力摆的加速度。
这些传感器可以提供给控制系统必要的数据,以便进行相应的控制。
3. 控制器控制器是系统中的核心部件,负责接收传感器的数据并根据设定的控制算法对风力摆进行控制。
控制器通常由微处理器或可编程逻辑控制器(PLC)组成,它可以根据需求改变风力摆的运动方向、幅度或停止风力摆的运动。
4. 电源与通信模块为了保证系统的正常运行,需要为系统提供稳定的电源。
另外,为了方便对系统进行监控和控制,还需要配备相应的通信模块,使得系统可以与外部设备进行数据传输和命令交互。
系统工作原理本系统工作的基本原理是通过控制器对风力摆进行精确控制。
控制器通过接收传感器提供的数据来判断当前风力摆的状态,并根据设定的控制算法采取相应的控制策略。
控制信号经过放大和处理后,通过执行机构控制风力摆的运动。
系统的工作流程如下:1.传感器采集风力摆的姿态和运动数据,并将数据传输给控制器。
2.控制器根据接收到的数据判断风力摆的状态,如姿态角度、加速度等。
3.控制器根据设定的控制算法,计算出相应的控制信号。
简易风力摆报告设计

摘要设计了一个简易风力摆控制装置,由直流风机组,陀螺仪,直流减速电机以及激光笔等组成。
以MSP430F149单片机为核心,用PWM波控制控制电机转速,调节风力大小,并以四个风机上下与左右同面两两并在一起对碳素管及激光笔进行工作,使细杆及激光笔在风机的作用下可进行自由摆动且进一步可控摆动在地上划线,具有很好的重复性,并且可以设定摆动方向且画短线,已经能够在将风力摆拉起一定角度放开后可以在规定时间内达到平衡。
关键词:风力控制摆、陀螺仪、轴流风机、PWM调速、MSP430单片机风力摆控制系统(B题)1方案设计与选择设计内容要求一个下端悬挂有(2~4只)直流风机的细管上端固定在结构支架上,只由风机提供动力,构成一个风力摆,风力摆上安装一个向下的激光笔。
通过单片机代码指令控制驱动风机使风力摆按照一定的规律运动,并使激光笔在地面画出要求的轨迹,风力摆结构图如图1所示。
图1风力摆结构图设计要求基本要求(1)从静止开始,15s 内控制风力摆做类似自由摆运动,使激光笔稳定地在地面画出一条长度不短于50cm 的直线段,其线性度偏差不大于±,并且具有较好的重复性;(2)从静止开始,15s 内完成幅度可控的摆动,画出长度在30~60cm 间可设置,长度偏差不大于± 的直线段,并且具有较好的重复性;(3)可设定摆动方向,风力摆从静止开始,15s 内按照设置的方向(角度)摆动,画出不短于20cm 的直线段;(4)将风力摆拉起一定角度(30~45°)放开,5s 内使风力摆制动达到静止状态。
发挥部分(1)以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面画圆,30s 内需重复3 次;圆半径可在15~35cm 范围内设置,激光笔画出的轨迹应落在指定半径± 的圆环内;(2)在发挥部分(1)后继续作圆周运动,在距离风力摆1~2m 距离内用一台50~60W 台扇在水平方向吹向风力摆,台扇吹5s 后停止,风力摆能够在5s 内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹;(3)其他。
风力摆控制系统方案

风力摆控制系统方案(凌阳版)一、硬件选型(1)万向节(购买的时候注意万向节灵活度)(2)陀螺仪(3)单片机控制板:SPM 75F2413 EVM(也可选用其他单片机)(4)风扇驱动板:VLN2003(5)激光笔(尽量小)(6)PVC管(10MM左右购买的时候长一点根据构架截断)(7)风机:每组4个,同一型号,且符合元器件清单要求(直径5~10cm,5~12V DC)即可(电流值选择偏大的)(8)整体支架结构(暂定凌阳3D打印机直接打印)二、 编程控制思路本系统属于个双摆系统,动力来源由悬挂的一组直流风机。
题目的第一步:由于风机的风力的限制,不可能实现直接把风摆的高度吹到实验的要求的高度。
于是需要利用单摆的思路,在摆动过程中增加摆动的能量。
软件设计思路:第一步:1.由于单摆的周期,T = 2π*根号(L/G)L 位杆的长度,G为重力系数。
在程序启动时,可以近似的根据这个时间转换风机旋转方向。
2.但是由于摆幅越来越大后,陀螺仪的测量的角加速度更加明显,可以通过测量陀螺仪的角加速的,进行判断风机换向的时间点。
第二步:这一步主要的要求是,摆幅可控,可设计。
每次在第一步基础上,在风机换向的时候进行PWM脉宽调节控制,进行风力的调节。
第三步:这一步主要是开始使用两个方向的风机进行动力合成,从而实现摆动方向的改变,换向的时候两组电机同时换向。
方向可以通过矢量合成,通过查询sin表格,进行每个风力计算。
(在路劲规划好的基础上可以用陀螺仪进行路径修正)。
第四步:的思路和第一步的思路正好反过来,需要有陀螺仪的辅助,给定陀螺仪反馈回来的角加速度反向的风力,实现制动,在摆动角度比较小的时候在关闭电机即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:本系统主要是以STM32单片机为控制芯片控制4只直流轴流风机,从而调节风机转速来控制使风力摆呈现不同状态的控制系统。
该系统主要由主控板,无线遥控器,直流轴流风机,摆架框架等四大部分组成风力摆控制系统。
关键字:风力摆无线 STM32单片机直流轴流风机一.系统方案1.系统方案论证本系统主要由遥控模块、控制模块、陀螺仪模块、直流轴流风机组成,添加一些辅助电路作为扩展功能。
系统工作有六种工作模式,使用无线遥控切换模式并显示。
下面分别论证这几个模块的选择。
1.1直流风机的论证与选择方案一:使用直流鼓风机。
直流鼓风机的机械摩擦非常小,具有较大的精度,并能提供足够的风力进行运动。
但在实验过程中,风机启动速度较慢,且由于其自身重量过大,风摆在运动过程中受惯性影响极大,不能有效的完成任务要求。
方案二:采用直流轴流风机。
直流轴流风机是在固定位置使空气流动,自身重量和体积都比较小,且出风口大,能够很好的提供动力与控制。
在实验过程中能够较快的启动,并能较好的实现任务要求,符合实验需要。
综合以上两种方案,风力摆在运动过程中需要进行实时控制摆杆的姿态,且需要风机启停反应快,故选择方案二。
1.2控制器模块的论证与选择根据设计要求,控制器主要用于计算摆杆姿态、控制直流轴流风机PWM、使摆杆能完成相应等功能。
方案一:采用STC89C51作为系统控制器。
它的技术成熟,成本低。
STC89C51是8位的单片机,数据传输速度慢,在用于精密的操作时,不能满足实时控制的要求,且复杂的控制算法难以实现,不利于控制。
方案二:采用意法半导体公司的STM32F103单片机作为控制器。
STM32系列单片机是32位、RISC、低功耗的处理器。
在进行高精密的操作时,处理能力非常强,运算速度快,具有很好的控制能力,且成本低,更符合实验要求。
综合考虑以上两种方案,采用方案二。
2.系统结构根据上述方案的论证,我们确定以STC32F103作为控制核心,采用型号为PFB0812XHE的直流轴风机控制摆杆运动,用陀螺仪MPU6050检测状态数据,并将采集到的数据传输给控制板,然后通过单片机计算处理得出摆杆的姿态并调整直流轴风机的转速,从而使摆杆快速获得需要的状态,通过对应的无线遥控,设置相应的功能并发送给控制板,使其实现对应的功能,完成任务要求。
系统设计框图如图1所示图1 设计系统框图二.系统理论分析与计算1.直流轴风机选型本系统采用型号为PFB0812XHE的直流轴风机控制摆杆运动,电压为12V,电流4.65A。
此型号直流轴风机大小适中,重量较轻,产生的风力较大且能较快的启动,符合本系统要求。
2.摆杆状态检测本系统采用陀螺仪MPU6050采集摆杆的当前姿态数据,将采集到的数据实时传递给单片机,通过单片机PID计算处理后控制PWM的输出,使直流轴流风机转速改变,进而使摆杆达到相应的任务要求。
3.运动控制风力摆的运动是连续运动,摆杆的变化也是连续的变化过程,因此我们采用PID控制算法。
对直流电机或多圈电位器为执行器件的系统中,基本采用增量式PID算法进行控制。
由于单个直流轴风机,只能产生一个方向的力,为了便于控制,我们将4个直流轴风机直立围绕成一个正方形(出风口向外),使四周都能产生相同的风力。
然后单片机将陀螺仪MPU6050采集到的数据,确定其当前摆杆的姿态,在进行PID 算法以后,将得到的结果对应去控制直流轴风机的转速,以达到控制摆杆完成相应动作的效果三.电路与程序设计1.电路设计(1)陀螺仪模块陀螺仪MPU6050模块的实物硬件图如图3所示。
它与单片机的连接图如图附录总图所示。
在这里主要使用的是它的3轴定位功能和加速度功能。
图2 MPU6050硬件模块图(2)最小系统模块STM32单片机是意法半导体公司生产的32位低功耗、具有精简指令集的混合信号处理器。
其主要特点是处理能力强、运算速度快、低功耗等。
在这里主要使用开发板原理图如图4所示。
图3 最小系统板原理图2.程序设计 程序功能描述本系统的软件部分主要由数据采集模块、无线接收和发送、直流轴流风机PWM 、PID 控制模块函数组成。
当单片机上电后,根据不同的按键,遥控模块无线发送对应的工作模式,风力摆的控制板按照接收到的不同工作模式,对应的完成不同的的要求工作。
软件部分可实现对读取陀螺仪输出的数据信号,对直流轴流风机进行控制,实现摆杆的运动。
程序流程图如图5所示。
部分程序如附录一所示。
图4 系统软件流程图模式一:从静止开始,15s 内控制风力摆做自由摆运动,使激光笔稳定地在地面画出一条长度不短于50cm 的直线段,其线性度偏差不大于正负2.5cm ,并且具有较好的重复性;模式二:从静止开始,15s 内完成幅度可控的摆动,画出长度在30—60cm间可设置,长度偏差不大于正负2.5cm的直线段,并且具有较好的重复性;模式三:可设定摆动方向,风力摆从静止开始,15s内按照设置的方向(角度)摆动,画出不短于20cm的直线段;模式四:将风力摆拉起一定角度(30—45度)放开,5s内是风力摆制动达到静止状态;模式五:以风力摆静止时激光笔的光点为圆心,驱动风力摆用激光笔在地面花园,30s内需重复3次;圆半径可在15—35cm范围内设置,激光笔画出的轨迹应落在制定半径2.5cm的圆环内;模式六:在发挥部分(1)后继续作圆周运动,在距离风力摆1—2m距离内用一台50—60w台扇在水平方向吹风力摆,台扇吹5s后停止,风力摆能够在5s 内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹。
四.测试方案与测试结果1.测试方案按照调试的顺序,按照以下步骤进行调试。
1)调试直流轴流风机的(PWM)速度2)调试单片机与陀螺仪之间的数据传输3)调试系统PID控制的三个参数值:balance.kp、balance.ki、balance.kd 4)调试各模式相应直流轴流风机的转速5)调试两个无线模块的数据传输2.测试仪器:数字示波器,秒表,米尺,量角尺,风速仪,12V5A直流电源。
3.测试结果硬件实物图如附录三所示。
(1)直流轴流风机的PWM能够正常控制其运转速度(2)陀螺仪能正常的将数据发送给控制板,其中陀螺仪MPU6050模块的通信模式为IIC(3)PID控制的调试:确定balance.kp、balance.kd、balance.kd三个参数的值(4)各模式直流轴流风机的转速,需要反复测试,目前已达到比较理想的转速,其测试结果如下表一表一测试数据表(5)两个无线NRF模块,能够较精确相互收发数据,完成两块单片机之间的数据传递4.总结本次设计的风力摆控制系统完全可以实现设计基本要求和发挥部分的要求,系统稳定性较好,成功的完成了本次比赛的任务和要求。
参考文献【1】全国大学生电子设计竞赛组委会编《全国大学生电子设计竞赛获奖作品汇编》[M].北京理工大学出版社.2006年【2】黄正瑾.《电子设计竞赛赛体解析》[M].东南大学出版社. 2003年.第五章【3】周航慈.《单片机应用程序设计》[M]. 北京航空航天大学出版社.2006年【4】李朝青.《单片机原理及接口技术》[M]. 北京航空航天大学出版社. 2005年.第四章附录一:include "sys.h"#include "usart.h"#include "delay.h"#include "led.h"#include "key.h"#include "beep.h"#include "24l01.h"#include "spi.h"#include "imu.h"#include "motor.h"#include "mpu6050.h"u8 Rx_buf[RX_PLOAD_WIDTH];int main(void){u8 key_board;u8 i=0;Stm32_Clock_Init(9);//系统时钟设置delay_init(72);LED_Init();uart_init(72,115200);KEY_Init();TIM4_PWM_Init(999,0);mpu6050_init();delay_ms(200);mpu6050_update();Timer3_Init(199,719);NRF24L01_Init();while(NRF24L01_Check()){LED1 = ~LED1;delay_ms(30);}printf("NRF24L01 OK!");NRF24l01_poweroff();delay_ms(3);NRF24L01_RX_Mode();delay_ms(3);while(1){key_board = KEY_Scan(0);if(key_board==1)//基本功能1{while(1){test_1(40);}}if(key_board==4){while(1){test_2(45);}}if(key_board==5){while(1){for(i=0;i<4;i++){ for(i=0;i<3;i++){test_5(20);delay_ms(1000);}for(i=0;i<3;i++){ TIM4->CCR1=1000;delay_ms(1000);TIM4->CCR1=400;}}while(1){if((angle_rao_x<0)&&(angle_rao_y<0)) {TIM4->CCR1=400;TIM4->CCR4=400;TIM4->CCR2=800;TIM4->CCR3=400;delay_ms(1000);}if((angle_rao_x<0)&&(angle_rao_y>0)) {TIM4->CCR1=800;TIM4->CCR2=800;TIM4->CCR3=400;TIM4->CCR4=400;delay_ms(1000);}if((angle_rao_x>0)&&(angle_rao_y>0)){TIM4->CCR1=800;TIM4->CCR4=400;TIM4->CCR2=400;TIM4->CCR3=400;delay_ms(1000);}if((angle_rao_x>0)&&(angle_rao_y<0)){TIM4->CCR3=600;TIM4->CCR4=700;TIM4->CCR1=400;TIM4->CCR2=400;delay_ms(1000);}}}}}#include "24l01.h"#include "delay.h"#include "spi.h"const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x01,0x02,0x03,0x04,0x05}; //发送地址const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x01,0x02,0x03,0x04,0x05}; //发送地址void NRF24l01_poweroff(void){NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x00);}void NRF24L01_Init(void){RCC->APB2ENR|=1<<3; //使能PORTB时钟RCC->APB2ENR|=1<<2; //使能PORTA时钟GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=0X00030000; //PG6 7 推挽GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003; //PG6 7 推挽GPIOB->CRL&=0XFFFFFFF0;GPIOB->CRL|=0X00000004; //PG8 输入SPI1_Init(); //初始化SPISPI1->CR1&=~(1<<6); //SPI设备失能SPI1->CR1&=~(1<<1); //空闲模式下SCK为0 CPOL=0SPI1->CR1&=~(1<<0); //数据采样从第1个时间边沿开始,CPHA=0SPI1->CR1|=1<<6; //SPI设备使能NRF24L01_CE=0; //使能24L01NRF24L01_CSN=1; //SPI片选取消}u8 NRF24L01_Check(void){u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;SPI1_SetSpeed(SPI_SPEED_16); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++)if(buf[i]!=0XA5)break;if(i!=5)return 1;//检测24L01错误return 0; //检测到24L01}u8 NRF24L01_Write_Reg(u8 reg,u8 value){u8 status;NRF24L01_CSN=0; //使能SPI传输status =SPI1_ReadWriteByte(reg);//发送寄存器号SPI1_ReadWriteByte(value); //写入寄存器的值NRF24L01_CSN=1; //禁止SPI传输return(status); //返回状态值}u8 NRF24L01_Read_Reg(u8 reg){u8 reg_val;NRF24L01_CSN = 0; //使能SPI传输SPI1_ReadWriteByte(reg); //发送寄存器号reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1; //禁止SPI传输return(reg_val); //返回状态值}u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len){u8 status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0 XFF);//读出数据NRF24L01_CSN=1; //关闭SPI传输return status; //返回读到的状态值}u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len){u8 status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status = SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //写入数据NRF24L01_CSN = 1; //关闭SPI传输return status; //返回读到的状态值}u8 NRF24L01_TxPacket(u8 *txbuf){u8 sta;SPI1_SetSpeed(SPI_SPEED_16);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)NRF24L01_CE=0;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节NRF24L01_CE=1;//启动发送while(NRF24L01_IRQ!=0);//等待发送完成sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&MAX_TX)//达到最大重发次数{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器return MAX_TX;}if(sta&TX_OK)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败}u8 NRF24L01_RxPacket(u8 *rxbuf){u8 sta;SPI1_SetSpeed(SPI_SPEED_16); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&RX_OK)//接收到数据{NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器return 0;}return 1;//没收到任何数据}void NRF24L01_RX_Mode(void){NRF24L01_CE=0;NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WID TH);//写RX节点地址NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); //使能通道0的自动应答NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); //设置RF通信频率NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db 增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF24L01_CE = 1; //CE为高,进入接收模式}void NRF24L01_TX_Mode(void){NRF24L01_CE=0;NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH) ;//写TX节点地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WID TH); //设置TX节点地址,主要为了使能ACKNRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); //使能通道0的自动应答NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); //设置RF通道为40 NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db 增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE=1;//CE为高,10us后启动发送}void BEEP_Init(void){RCC->APB2ENR|=1<<5; //使能PORTD时钟GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300; //PD2 推挽输出BEEP=0; //关闭蜂鸣器输出}#include <stm32f10x_lib.h>#include <math.h>#include <stdio.h>#include "delay.h"#include "sys.h"#include "mpu6050.h"#include "imu.h"#include "shuxue.h"#include "sys.h"#define PI 3.1415926535897932384626433832795#define FILTER_SIZE 30float P=1;static s16 acc_x_cail=-145,acc_y_cail=-35,acc_z_cail=-555; //起始条件下,偏差,正常是4096,x和y轴都差不多,而z轴接近4900,因此减掉800// static s32 x_sum=0,y_sum=0,z_sum=0;static s16 x_hist_tab[FILTER_SIZE] ,y_hist_tab[FILTER_SIZE] ,z_hist_tab[FILTE R_SIZE] ;s16 ave_acc_x ,ave_acc_y,ave_acc_z;s16 pmx,pmy,pmz;floatv_angle_rao_x=0,v_angle_rao_y=0,piancha_x=0,piancha_y=0,wen_piao_x=0,w en_piao_y=0,angle_rao_x=0,angle_rao_y=0;euler_angle real;double gyro_temp_drift_x,gyro_temp_drift_y,gyro_temp_drift_z;PPID axis13,axis24,axis_z;u16 run_time;double att[3][3]={1 , 0 , 0 ,0 , 1 , 0 ,0 , 0 , 1 ,};double datt[3][3];void init_pid_para(void){axis24.rk=0;axis24.kp=100;//180; //210 axis24.kd=20000; //26000axis24.ki=0.1; //0axis24.sek=0;axis24.ek1=0;axis13.rk=0;axis13.kp=100;//180; //210 axis13.kd=20000; //26000axis13.ki=0.1; //0axis13.sek=0;axis13.ek1=0;axis_z.rk=0;axis_z.kp=150; //200axis_z.kd=7000; //8000axis_z.ki=0.1; //0axis_z.sek=0;axis_z.ek1=0;}void acc_prepare_data_int(void){u8 i;for(i=0;i<FILTER_SIZE;i++){mpu6050_update();x_hist_tab[i]=ax+acc_x_cail;y_hist_tab[i]=ay+acc_y_cail;z_hist_tab[i]=az+acc_z_cail;x_sum+=x_hist_tab[i];y_sum+=y_hist_tab[i];z_sum+=z_hist_tab[i];delay_ms(5);}ave_acc_x=x_sum/FILTER_SIZE;ave_acc_y=y_sum/FILTER_SIZE;ave_acc_z=z_sum/FILTER_SIZE; }void acc_prepare_data(void){static u8 idx=0;if(idx==FILTER_SIZE)idx=0;x_sum-=x_hist_tab[idx];y_sum-=y_hist_tab[idx];z_sum-=z_hist_tab[idx];x_hist_tab[idx]=ax+acc_x_cail;y_hist_tab[idx]=ay+acc_y_cail;z_hist_tab[idx]=az+acc_z_cail;x_sum+=x_hist_tab[idx];y_sum+=y_hist_tab[idx];z_sum+=z_hist_tab[idx];ave_acc_x=x_sum/FILTER_SIZE;ave_acc_y=y_sum/FILTER_SIZE;ave_acc_z=z_sum/FILTER_SIZE;idx++;}void TIM3_IRQHandler(void){if(TIM3->SR&0X0001)//溢出中断{mpu6050_update();acc_prepare_data();piancha_x=(atan2(ave_acc_y,ave_acc_z)*180/PI)-angle_rao_x;//this piancha is -,and it's unit is du //wen_piao_x+=KI_T*piancha_x; //this wen_piao_x is - //v_angle_rao_x=(gx/16.4+wen_piao_x)+KP_T*piancha_x;angle_rao_x+=v_angle_rao_x*0.002;//angle=v_angle*time//piancha_y=(-atan2(ave_acc_x,ave_acc_z)*180/PI)-(angle_rao_y);//thi s piancha is -,and it's unit is du //wen_piao_y+=KI_T*piancha_y; //this wen_piao_x is - //v_angle_rao_y=(gy/16.4+wen_piao_y)+KP_T*piancha_y;angle_rao_y+=v_angle_rao_y*0.002;//angle=v_angle*time//=axis24.kp*axis24.ek+axis24.kd*(axis24.ek-axis24.ek1)+axi s24.ki*axis24.sek;=axis13.kp*axis13.ek+axis13.kd*(axis13.ek-axis13.ek1)+axis13. ki*axis13.sek;axis_=axis_z.kp*axis_z.ek+axis_z.kd*(axis_z.ek-axis_z.ek1)+axis_z. ki*axis_z.sek;run_time= TIM3->CNT;}TIM3->SR&=~(1<<0);//清除中断标志位}void Timer3_Init(u16 arr,u16 psc){RCC->APB1ENR|=1<<1;//TIM2时钟使能TIM3->ARR=arr; //设定计数器自动重装值TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟TIM3->DIER|=1<<0; //允许更新中断TIM3->DIER|=1<<6; //允许触发中断TIM3->CR1|=0x01; //使能定时器2MY_NVIC_Init(0,1,TIM3_IRQChannel,2);//抢占3,子优先级3,组2(组2中优先级最低的)}void ium_init(void){mpu6050_update();acc_prepare_data_int();init_pid_para();Timer3_Init(199,719);}void test_1(u16 angle){u16 i;for(;;){while(absolute(v_angle_rao_y)>30){if(absolute(angle_rao_y)<angle) goto MS;}if(angle_rao_y>0){TIM4->CCR4=1000;TIM4->CCR2=200;}else{TIM4->CCR4=200;TIM4->CCR2=1000;} printf("%f\r\n",angle_rao_y);for(i=0;i<(u16)(P*absolute(angle_rao_y));i++){delay_ms(5);if(absolute(angle_rao_y)<angle)goto MS;}TIM4->CCR4=200;TIM4->CCR2=200;}MS:TIM4->CCR4=200;TIM4->CCR2=200;}void test_2(u16 angle){u16 i;for(;;){while(absolute(v_angle_rao_y)>32){if(absolute(angle_rao_y)<angle) goto MS;}if(angle_rao_y>0){TIM4->CCR2=1000;TIM4->CCR4=480;}else{TIM4->CCR2=480;TIM4->CCR4=1000;}for(i=0;i<(u16)(P*absolute(angle_rao_y));i++){delay_ms(5);if(absolute(angle_rao_y)<angle)goto MS;}TIM4->CCR4=480;TIM4->CCR2=480;}MS:TIM4->CCR4=380;TIM4->CCR2=380;}void test_5(u16 angle){u16 i;for(;;){while(absolute(v_angle_rao_y)>30){if(absolute(angle_rao_y)<angle) goto MS;}if(angle_rao_y>0){TIM4->CCR4=1000;TIM4->CCR2=200;}else{TIM4->CCR4=200;TIM4->CCR2=1000;} printf("%f\r\n",angle_rao_y);for(i=0;i<(u16)(P*absolute(angle_rao_y));i++){delay_ms(5);if(absolute(angle_rao_y)<angle)goto MS;}TIM4->CCR4=200;TIM4->CCR2=200;}MS:TIM4->CCR4=200;TIM4->CCR2=200;}附录二:硬件实物图。