风力摆控制系统(附有程序)
全国大学生电子设计竞赛B题风力摆设计报告
![全国大学生电子设计竞赛B题风力摆设计报告](https://img.taocdn.com/s3/m/c27d073a6529647d26285222.png)
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、电机的论证与选择方案一:采用步进电机。
步进电机具有动态响应快、易于起停,易于正反转及变速的优点。
但缺点是它以步进式跟进,角度小于一个步距角时是系统响应盲区,而且经过测试步进电机在控制旋转臂时,抖动性大并且容易出现卡顿现象,所以不适合风力摆的控制。
方案二:采用小型轴流风机。
扭矩大,体积小,驱动电路简单,稳定强,负载能力强等优点。
风力摆控制系统程序设计
![风力摆控制系统程序设计](https://img.taocdn.com/s3/m/9f1475e6f90f76c661371ad3.png)
上大部分的字符型液晶。(图 2) 3 驱动电路原理图
图 4 主程序流程图
L298N 是一种双 H 桥电机驱动芯片,其中每个 H 桥可以提供 2A
图 5 子程序流程图 表 1 风力摆画长于 5 2.5- 48v,逻辑部分 5v 供电,接受
5vTTL 电平。一般情况下,功率部分的电压应大于 6V 否则芯片可能不
根据上述测试数据,可以得出以下结论: 驱动风力摆工作,激光笔稳定地在地面画出一条长度不短于 50cm 的直线段,来回五次,满足时间要求及最大偏差距离。
参考文献 [1]李硕,赵彤帆,李根全,宋海珍.Matlab 软件在单摆自由振动中的应用[J]. 实验室研究与探索,2013,11:65-68. [2]陈文涛,龚善初.单摆振动分析[J].湖南理工学院学报(自然科学版), 2008,01:66-70. [3]侯祥林,丛德宏,徐心和.倒立单摆摆起开环控制律的最优化算法[J].东 北大学学报,2004,01:9-12. [4]龚善初.影响单摆振动周期的参数研究[J].大学物理,2006,06:12-15. [5]郭鹏.模糊前馈与模糊 PID 结合的风力发电机组变桨距控制[J].中国电 机工程学报,2010,08:123-128. [6]王述彦,师宇,冯忠绪.基于模糊 PID 控制器的控制方法研究[J].机械科 学与技术,2011,01:166-172. [7]何芝强.PID 控制器参数整定方法及其应用研究[D].杭州:浙江大学, 2005. [8]张卫政.基于模糊控制的风机盘管空调系统应用研究[D].广州:广东工 业大学,2005. [9]王冀龙.智能新风机控制系统设计[D].秦皇岛:燕山大学,2014.
1 系统总体框图(图 1)
2 显示模块
1602 液晶也叫 1602 字符型液晶,它
风力摆控制系统 设计报告
![风力摆控制系统 设计报告](https://img.taocdn.com/s3/m/d3d9e20bc5da50e2524d7fa0.png)
摘要:本系统主要是以STM32单片机为控制芯片控制4只直流轴流风机,从而调节风机转速来控制使风力摆呈现不同状态的控制系统。
该系统主要由主控板,无线遥控器,直流轴流风机,摆架框架等四大部分组成风力摆控制系统。
关键字:风力摆无线 STM32单片机直流轴流风机一.系统方案1.系统方案论证本系统主要由遥控模块、控制模块、陀螺仪模块、直流轴流风机组成,添加一些辅助电路作为扩展功能。
系统工作有六种工作模式,使用无线遥控切换模式并显示。
下面分别论证这几个模块的选择。
1.1直流风机的论证与选择方案一:使用直流鼓风机。
直流鼓风机的机械摩擦非常小,具有较大的精度,并能提供足够的风力进行运动。
但在实验过程中,风机启动速度较慢,且由于其自身重量过大,风摆在运动过程中受惯性影响极大,不能有效的完成任务要求。
方案二:采用直流轴流风机。
直流轴流风机是在固定位置使空气流动,自身重量和体积都比较小,且出风口大,能够很好的提供动力与控制。
在实验过程中能够较快的启动,并能较好的实现任务要求,符合实验需要。
综合以上两种方案,风力摆在运动过程中需要进行实时控制摆杆的姿态,且需要风机启停反应快,故选择方案二。
1.2控制器模块的论证与选择根据设计要求,控制器主要用于计算摆杆姿态、控制直流轴流风机PWM、使摆杆能完成相应等功能。
方案一:采用STC89C51作为系统控制器。
它的技术成熟,成本低。
STC89C51是8位的单片机,数据传输速度慢,在用于精密的操作时,不能满足实时控制的要求,且复杂的控制算法难以实现,不利于控制。
方案二:采用意法半导体公司的STM32F103单片机作为控制器。
STM32系列单片机是32位、RISC、低功耗的处理器。
在进行高精密的操作时,处理能力非常强,运算速度快,具有很好的控制能力,且成本低,更符合实验要求。
综合考虑以上两种方案,采用方案二。
2.系统结构根据上述方案的论证,我们确定以STC32F103作为控制核心,采用型号为PFB0812XHE的直流轴风机控制摆杆运动,用陀螺仪MPU6050检测状态数据,并将采集到的数据传输给控制板,然后通过单片机计算处理得出摆杆的姿态并调整直流轴风机的转速,从而使摆杆快速获得需要的状态,通过对应的无线遥控,设置相应的功能并发送给控制板,使其实现对应的功能,完成任务要求。
基于Arduino的风力摆控制系统
![基于Arduino的风力摆控制系统](https://img.taocdn.com/s3/m/895787baf524ccbff1218469.png)
素干扰,完成效果不够理想。
引用:
[1] 黄智伟,王彦,陈文光等 . 全国大学生电子设计竞赛 训练教程 [M]. 电子工业出版社 . 北京 .2007.
[2] 谭浩强。c 语言程序设计(第 4 版)[M]. 清华大学出版 社 . 北京 .2010.
[3] 童诗白,华程英 . 模拟电子技术基础(第四版)[M]. 高等教育出版社 . 北京 .2009.
本系统硬件主要由 MCU、三轴加速度计、空心杯直流电机、 电源供电模块、驱动电路及摆杆构成。Arduino ATMega2560 处理 器作为风力摆控制系统的核心,MMA7361 三维角度传感器对摆 杆的运行状态进行实时采集,形成一个闭环控制系统。单片机结 合 PID 控制算法对输入的信号进行处理,从而实现电机组运行姿 态的变化。
电子技术
基于Arduino的风力摆控制系统
◆朱 超
系统以 Arduino ATMega2560处理器作为风力摆控制系统的核 心,结合 PID 控制算法,采用脉宽调制(PWM)方式控制空心 杯直流电机转速。MMA7361 三维角度传感器对摆杆的运行状态 进行实时采集,所得信息反馈到单片机,形成一个闭环控制系统。 1 设计方案
误差1 0.6 1.2 0.6
误差2 1.3 0.6 0.6
误差3 1.4 0.8 0.9
4.2 始自由摆时间及在画不同长度直线时的最大偏差距离。测试
结果如表 2 所示。
表2 风力摆在画不同长度直线测试
画30cm直线 画40cm直线 画50cm直线
[4] 程晨 .Arduino 开发实战指南 [M]. 机械工业出版社 . 北 京 .2012.
(安徽大学 安徽 合肥 230601)
‖112‖
总程序及PID控制算法程序流图 4 系统测试
风力摆控制系统方案
![风力摆控制系统方案](https://img.taocdn.com/s3/m/ddfb00f888eb172ded630b1c59eef8c75ebf9540.png)
风力摆控制系统方案简介风力摆控制系统是用来控制风力摆的运动的一种系统。
风力摆通常用于测量风力的强度和方向,以便在风能利用方面进行相应的调整和优化。
本文将介绍一个设计用于控制风力摆运动的系统方案。
目标本系统的目标是实现对风力摆的精确控制,使其可以随需要而停止、开始或改变方向。
通过控制风力摆的运动,可以提高其测量精度,并确保风能的高效利用。
系统组成本系统主要由下面几个组成部分构成:1. 风力摆风力摆是本系统的核心部件,它用于测量风向和风速。
风力摆通常由一个垂直铰接杆和一个悬挂在杆上的摆锤组成。
当风吹过摆锤时,摆锤会向相反方向摆动,从而使测量者能够通过观察摆动的幅度和方向来判断风的强度和方向。
2. 传感器为了实现对风力摆的控制,需要安装相应的传感器来检测风力摆的姿态和运动。
常用的传感器包括倾斜传感器和加速度传感器。
倾斜传感器用于检测风力摆的倾斜角度,而加速度传感器用于检测风力摆的加速度。
这些传感器可以提供给控制系统必要的数据,以便进行相应的控制。
3. 控制器控制器是系统中的核心部件,负责接收传感器的数据并根据设定的控制算法对风力摆进行控制。
控制器通常由微处理器或可编程逻辑控制器(PLC)组成,它可以根据需求改变风力摆的运动方向、幅度或停止风力摆的运动。
4. 电源与通信模块为了保证系统的正常运行,需要为系统提供稳定的电源。
另外,为了方便对系统进行监控和控制,还需要配备相应的通信模块,使得系统可以与外部设备进行数据传输和命令交互。
系统工作原理本系统工作的基本原理是通过控制器对风力摆进行精确控制。
控制器通过接收传感器提供的数据来判断当前风力摆的状态,并根据设定的控制算法采取相应的控制策略。
控制信号经过放大和处理后,通过执行机构控制风力摆的运动。
系统的工作流程如下:1.传感器采集风力摆的姿态和运动数据,并将数据传输给控制器。
2.控制器根据接收到的数据判断风力摆的状态,如姿态角度、加速度等。
3.控制器根据设定的控制算法,计算出相应的控制信号。
风力摆控制系统方案
![风力摆控制系统方案](https://img.taocdn.com/s3/m/c8e49da069dc5022aaea002b.png)
风力摆控制系统方案(凌阳版)一、硬件选型(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表格,进行每个风力计算。
(在路劲规划好的基础上可以用陀螺仪进行路径修正)。
第四步:的思路和第一步的思路正好反过来,需要有陀螺仪的辅助,给定陀螺仪反馈回来的角加速度反向的风力,实现制动,在摆动角度比较小的时候在关闭电机即可。
风力摆控制系统
![风力摆控制系统](https://img.taocdn.com/s3/m/5d5c47f2998fcc22bcd10d93.png)
风力摆控制系统摘要:本系统以MSP430F149单片机作为主控芯片,通过陀螺仪传感器MPU-6050检测风力摆的姿态信息,采用PID控制算法和互补滤波,实现了系统的最优控制,角度和X-Y轴等姿态信息的实时显示,使系统按照预期的轨迹运动。
本设计结构简单、可靠性高、操作方便、性能优良。
关键词:风力摆;MSP430F149; PID调节;互补滤波目录一、系统方案 (1)1、检测模块的论证与选择 (1)2、动力模块的论证与选择 (1)3、显示模块的论证与选择 (1)4、控制模块的论证与选择 (2)二、系统理论分析 (2)1、运动情况分析 (2)(1)水平直线运动 (2)(2)自动“归零”运动 (2)(3)圆周运动 (3)2、水平直线运动计算 (3)3、圆周运动计算 (3)4、PID调节和互补滤波 (4)三、电路与程序 (4)1、电路的设计 (4)(1)系统总体框图 (4)(2)供电子系统 (4)(3)检测模块 (5)(4)显示模块 (5)2、程序的设计 (5)(1)程序功能描述与设计思路 (5)(2)程序流程图 (6)四、测试方案与测试结果 (6)1、测试方案 (6)2、测试条件与仪器 (6)3、测试结果及分析 (6)(1)测试结果 (6)(2)测试分析与结论 (8)五、结论与心得 (8)六、参考文献 (8)风力摆控制系统(B题)【本科组】一、系统方案本系统主要由检测模块、显示模块、动力模块和控制模块组成,下面分别论证这几个模块的选择。
1、检测模块的论证与选择方案一:采用MMA7455加速度传感器检测平台倾角。
其核心为飞思卡尔公司的MMA7455L数字三轴加速度传感器,它通过数字输出,工作可靠。
但其8位模式限制了其测量精度,在测量微小的角度变化上误差较大,且7455不含陀螺仪,由此产生陀螺仪与加速器之间时间差的问题。
方案二:采用电位器检测摆杆倾角。
用电阻分压方式可以实现电位器对角度变化的感应。
但是必须经过模数转换才能将信号传给处理器处理,其灵敏度和模数转换器的精度都会对测量结果产生直接影响,误差很大。
风力摆控制系统
![风力摆控制系统](https://img.taocdn.com/s3/m/4127e85d2b160b4e767fcf8c.png)
摆杆
风机 1 风机 2
图 2.3 两个直流风机组合示意图
4
方案 2: 使用四个直流风机,用两个矩形塑料板组成十字形,分别将四个直 流风机放置在四个点上如图 2.4 所示。每个轴上由两个直流风机控制风力摆的摆 动,可以很好地做到加速摆动与快速制动,能够更容易的实现题目的要求。
(2) 在发挥部分(1)后继续作圆周运动,在距离风力摆 1~2m 距离内用 一台 50~60W 台扇在水平方向吹向风力摆,台扇吹 5s 后停止,风力摆能够在 5s 内恢复发挥部分(1)规定的圆周运动,激光笔画出符合要求的轨迹;
(3) 其他。
2 方案论证与设计
2.1 总体方案描述
本设计的结构示意主视图与俯视图如下图 2.1 所示,为了实现题目中的要求, 我们在初始点 O 处 1~4 号直流风机全部开始运转,1、3 号直流风机用来调节垂 直于运动方向上的距离,使其摆动时偏差不超过允许范围;2、4 号直流风机同时 运转,但转速不同,使风力摆向风速小的方向运动。风力摆无法直接运动到指定 位置,所以需要多次摆动,每次到达最高点时将其推向另一侧,最终使其实现摆 动。采用姿态采集模块来测量摆动角度,进而推断画线长度;通过几个在直流风 机的合力使风力摆向任意指定方向摆动;改变各个直流风机的风速使其尽快制动。 调节各个风机使其在有无干扰的情况下完成画圆功能。
方案 1:12864 液晶显示,12864 不仅能显示数字符号,还能显示汉字与图 形,操作方法与其他液晶显示相似。但其体积较大,并且价格较高。
全国大学生电子设计竞赛设计报告B题风力摆控制系统精编版
![全国大学生电子设计竞赛设计报告B题风力摆控制系统精编版](https://img.taocdn.com/s3/m/f21685181711cc7931b71664.png)
全国大学生电子设计竞赛设计报告B题风力摆控制系统公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-2015年全国大学生电子设计竞赛风力摆控制系统(B题)参赛学校:长安大学队伍编号:XZ015参赛队员:崔曜东、马若斯、李宝才指导教师:2015年8月15日摘要本系统为由STM32单片机控制模块、姿态采集模块、风力摆模块、人及交互系统以及风力摆机械结构组成的闭环控制系统。
MPU-6050陀螺仪传感器实时采集风力摆的姿态角及角速度,STM32f103单片机通过PID 算法调节轴流电机转速以控制风力摆。
风力摆能够实现快速起摆、画线、恢复静止的功能,并能准确画圆。
同时系统可以通过键盘设定运行模式和相关角度值,风力摆的角度和运行时间由液晶显示,具有较好人机界面。
系统设计结构简单,制作成本低,控制精度高。
关键词:STM32f103、MPU-6050模块、PWM调速AbstractThis system is composed of STM32 control module, attitude acquisition module, wind force model, human and interactive system, and the closed-loop control system composed of wind force. The attitude and angular velocity of the MPU-6050 gyroscope sensor are acquired in real time, and the speed of the motor is controlled by the PID algorithm, and the speed of the motor is controlled by the STM32f103 algorithm. Wind power can be achieved quickly, draw lines, restore the function of static, and can accurately draw circle. At the same time, the system can set up the operating mode and the relevant angle value, and the angle of the wind force and the running time of the system are displayed by the LCD. The system has theadvantages of simple structure, low cost and high control precision.Key words: MPU-6050, STM32f103 module, PWM speed control目录风力摆控制系统(B题)【本科组】一、系统方案本风力摆控制系统主要包括控制模块、电源模块、姿态采集模块、轴流风机及驱动模块、LCD显示模块、人机交互系统以及风力摆机械结构组成。
L002风力摆控制系统
![L002风力摆控制系统](https://img.taocdn.com/s3/m/fde871ec700abb68a982fbfe.png)
方案比较与论证风力摆控制系统摘要本系统为风力摆控制系统,由四只直流风机用碳素杆通过万向节固定在支架上构成。
以STM32f103高性能单片机作为系统的控制核心。
采用Mpu6050传感器,利用陀螺仪和加速度计来测量风力摆运动时坐标系三个轴的角度和加速度,然后解算其运动姿态,用BTS7971大功率芯片驱动电路来驱动四个不同朝向的风机进行控制,达到准确控制风力摆运动轨迹的目的。
本系统可在做出幅度可控的直线运动,线性误差在范围内,具有较好重复性。
可作曲线运动。
关键词: 风力摆; STM32; Mpu6050; 驱动电路【 abstract 】this system for wind pendulum control system, by four dc fan with carbonrod through the universal joint is fixed on the bracket. STM32high-performance single chip microcomputer is control core of the system.Mpu6050 sensor, the use of gyroscope and accelerometer to measure windpendulum motion coordinate system when the Angle of the three axis andacceleration, and then calculating the movement posture, with BTS7971chip driver circuit to drive the four different towards fan control, toachieve the purpose of accurate control wind pendulum motion.This systemcan be made the amplitude, the linear motion of the controlled linear errorwithin the range, has a good repeatability and can do curve movement. key words : wind pendulum ; STM32 ; Mpu6050 ; drive circuit方案比较与论证一、方案比较与论证1.1硬件方案系统主要由:MPU6050传感器模块,BTS7971驱动电路模块,运动模式选择模块,激光笔等组成。
风力摆
![风力摆](https://img.taocdn.com/s3/m/44cb41d52cc58bd63186bdb6.png)
风力摆控制系统(B题)摘要本系统为由STM32单片机控制模块、姿态采集模块、风力摆模块、液晶显示模块、人机交互系统以及风力摆机械结构组成的闭环控制系统。
MPU6050采集风力摆姿态角,单片机处理姿态角数据后通过PID精确算法调节直流风机以控制风力摆。
本系统实现了风力摆在仅受直流风机为动力控制下快速起摆、画线、恢复静止的功能,并能准确画圆,且受风力影响后能够快速恢复画圆状态,具有很好的鲁棒性。
另外,本系统具有良好的人机交互界面,各参数及测试模式可由按键输入并通过液晶显示,智能性好,反应速度快。
关键词:PID算法MPU6050STM32单片机人机交互1、系统方案本风力摆控制系统主要包括单片机控制模块、电源模块、姿态采集模块、风力摆模块、液晶显示模块、人机交互系统以及风力摆机械结构组成。
风力摆由万向节连接碳杆再连接风机组成。
位于碳杆最下方的姿态采集模块不断采集风力摆当前姿态角,并返回单片机。
单片机控制液晶显示姿态角数据并处理数据后通过控制PWM波占空比控制风机转速,实现对风力摆的控制。
本系统结构框图如图1所示。
姿态采集模块风力摆模块单片机系统人机交互系统液晶显示模块1.1风力摆运动控制方案的选择与论证方案一:采用2只直流风机作为动力系统。
采用2只风机并排同向而立,分别位于摆杆两侧,通过控制风机转速控制风力摆使激光笔画线画圆。
此方案风力摆负载轻,但风力摆摆动过程中状态微调和快速静止不易实现。
方案二:采用3只直流风机作为动力系统。
三只风机为等边三角形三边,相背而立,互成120°夹角。
此方案相对于方案二在控制风力摆转动过程中状态微调方面有提升,但自成三角形,相邻两风机夹角过大,依旧不利于精确控制风力摆状态。
方案三:采用4只直流风机作为动力系统。
四只风机取一边靠于摆杆,朝向成顺时针排列,通过控制四只风机转速控制风力摆当前状态。
此方案风力摆负载最重,但对于控制风力摆状态最为精确,且动力最足。
综合上述比较,考虑系统的快速工作以及精确控制,本系统采用方案三。
风力摆控制系统
![风力摆控制系统](https://img.taocdn.com/s3/m/9c3b16c776a20029bd642dca.png)
【 关键 词 】 MS P 4 3 0 1 4 9 单 片机 ;角度传感器 ;万向节 ;直流轴风机
注意功耗 问题 、散热 问题 。
1 基本 要求
1 ) 从静 止开 始 ,l 5 s 内控制 风 力摆做 类 似 自由摆 运 动 ,使激光 笔稳定 地在地面 画 出一 条长度不 短于5 0 a m 的 直线段 ,其线性度偏差不大于 ±2 . 5 c m ,并且具 有较好 的
E L E C T R ONI C S WOR L D ・技 术 交 流
风力摆控制 系统
天津现代 职业技 术学院 王娜丽
【 摘 要 】本 系统主要  ̄MS P 4 3 0 — 1 4 9 单片机、轴流 电机 、万向节、陀螺仪 传感器、 电机 驱动 电路 、降压模块 。通过 开关
电源输 出1 2 V%源经过 降压模块 降压输 出3 . 3 V和5 V电压给驱动模块 ,由MS P 4 3 0 — 1 4 9 输 出P wM给 驱动电路 ,来控制风机 的转速 ,然后 通过 陀螺仪传 感器进行A D采集 ,进 而控 制蜂呜器 ,发 出响声 ,完成各 项任务 。
方案三 :N e w W a y 2 9 8 一 M 电机驱动模块是N e w w a y 电子精 心打造的一款 电机驱动器 ,它能够很方便的驱动2 路直流 电
2 . 2 模块方案论证
2 . 2 . 1 电 源模 块 ( 5 V)
方 案一 :采用7 8 0 5 ,7 8 0 5  ̄端稳 压I c 内部 电路具 有
本系 统 以4 3 0 单 片机作控 制器 , 由开关 电源产生 1 2 V 电源 ,经 过 降压 得到5 V 和3 . 3 V 的 电源对 风机驱动 电路进
行供 电,通过4 3 0 进 行输 出P W M 给驱动 电路控制 直流轴 风 机 ,风 机上 装陀螺仪 传感器 ,通过 陀螺仪 传感器 反馈信 息来调节P W M 进 行风机 的调节 ,最 后 进行调试 完成
风力摆控制系统
![风力摆控制系统](https://img.taocdn.com/s3/m/0c71469afe4733687f21aa41.png)
风力摆控制系统本系统采用STC12C5A60S2为主控芯片,通过MPU6050传感器提供反馈信息、采用PID控制算法调整轴流风机的状态、在液晶和按键的人机交互作用下显示并切换工作模式,形成一闭环测控系统。
该测控系统通过控制驱动各风机,使风力摆按照一定规律运动,同时保证摆杆下方悬挂的激光笔能在地面画出要求的轨迹。
一、方案论证1.1 控制器模块方案。
控制器是整个控制系统的核心,承载着执行控制算法,实现控制功能的作用。
因此,要保证系统整体的控制质量,控制器的选择非常重要!在控制器的选择方案中,主要进行了如下對比:方案一:选择常见且应用广泛的AT89C52作为控制芯片。
对于这种单片机,我们有良好的知识基础,上手快,成本低。
然而对于本控制系统,程序量较大、所需I/O口较多,89单片机将很难满足控制要求,难以胜任控制任务。
因此,89单片机并不适合作为本系统的控制器。
方案二:较之89系列单片机,STC12单片机资源丰富,集成EEPROM、AD、PCA可编程计数阵列等;其功能更强大,执行速度更快。
对于本系统来说,足以完成控制任务。
故而作为本控制系统的首选。
2.2位置检测模块。
检测模块不仅是获得被控系统所需信息的唯一渠道,而且从根本上决定了被控系统的控制精度,相当于控制系统中的“眼睛”;因此检测模块的设计对整个控制系统的设计至关重要!基于此,在选择检测元件时,主要做了如下对比:方案一:选择整合性6轴运动处理组件MPU6050,利用其自身集成的3轴MEMS陀螺仪,3轴MEMS加速度计精确地对被控对象的运动状态进行数据采集;在数据处理上采用卡尔曼滤波算法,测量精度极高。
另外,该传感器封装小节省空间,对本系统的控制十分有利。
方案二:选择角度、加速度模块MMA7361传感器。
这一模块虽有压降小,适合高噪声电源环境工作等特点,但其测量精度及测量范围等各方面性能不及MPU6050。
综合考虑,选取MMA7361作为检测变送传感器并不明智。
风力摆控制系统(B题)资料
![风力摆控制系统(B题)资料](https://img.taocdn.com/s3/m/983e912e7cd184254b35354f.png)
风力摆控制系统(B题)摘要本系统由STM32单片机控制模块、姿态采集模块、风力摆模块、液晶显示模块、人机交互系统以及风力摆机械结构组成。
MPU6050 采集风力摆姿态角,单片机处理姿态角数据后通过PID精确算法调节直流风机以控制风力摆。
本系统实现了风力摆在仅受直流风机为动力控制下快速起摆、画线、恢复静止的功能,并能准确画圆,且受风力影响后能够快速恢复画圆状态,具有很好的鲁棒性。
另外,本系统具有良好的人机交互界面,各参数及测试模式可由按键输入并通过液晶显示,使得测试时操作更加方便。
关键词:姿态采集STM32单片机PID算法人机交互1、 方案论证本风力摆控制系统主要包括单片机控制模块、电源模块、姿态采集模块、风力摆模块、液晶显示模块、人机交互系统以及风力摆机械结构组成。
风力摆由万向节连接碳杆再连接风机组成。
位于碳杆最下方的姿态采集模块不断采集风力摆当前姿态角,并返回单片机。
单片机控制液晶显示姿态角数据并处理数据后通过控制 PWM 波占空比控制风机转速,实现对风力摆的控制。
本系统结构框图如图1所示。
图1 系统结构框图1.1 风力摆运动控制方案的选择与论证方案一:采用2只直流风机作为动力系统。
采用2只风机并排同向而立,分别位于摆杆两侧,通过控制风机转速控制风力摆使激光笔画线画圆。
此方案风力摆负载轻,但风力摆摆动过程中状态微调和施加阻力使之快速静止不易实现。
方案二:采用3只直流风机作为动力系统。
三只风机为等边三角形三边,相背而立,互成120°夹角。
此方案相对于方案二在控制风力摆转动过程中状态微调方面有提升,但自成三角形,相邻两风机夹角过大,依旧不利于精确控制风力摆状态。
方案三:采用4只直流风机作为动力系统。
四只风机相背呈正方体四周站立。
通过控制四只风机转速控制风力摆当前状态。
此方案风力摆负载最重,但对于控制风力摆状态最为精确,且动力最足。
综合上述比较,考虑系统的快速工作以及精确控制,本系统采用方案三,使用四只空心杯电机接螺旋桨制成的直流风机作为动力执行系统。
课程设计风摆角度自动控制——程序附录
![课程设计风摆角度自动控制——程序附录](https://img.taocdn.com/s3/m/c0ea6afb941ea76e58fa0413.png)
程序附录/*****************************************************This program was produced by theCodeWizardAVR V1.25.7a StandardAutomatic Program Generator?Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.Project :Version :Date : 2011-9-22Author : chengweiCompany : hduComments:Chip type : ATmega16Program type : ApplicationClock frequency : 8.000000 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 256*****************************************************/#include <mega16.h>#include <delay.h>#define ADC_VREF_TYPE 0x60#define DATA PORTB#define SEG PORTC#define KEY_MODE (PINA & 0x10) //PA4#define KEY_ADD (PINA & 0x20) //PA5#define KEY_MINUS (PINA & 0x40) //PA6#define KEY_ENTER (PINA & 0x80) //PA7unsigned char angle_sp, angle_pv;unsigned char pid_p, pid_i, pid_d;unsigned char disBuf[8] = {0};unsigned char curMode = 0;unsigned char Enter_Mode=1; //0:off 1:on 选择是否进入设置状态int mv0, mv1, mv, err0, err1, err2;const unsigned char seg[4] = {~0x01, ~0x02, ~0x04, ~0x08}; //采用npn三极管作开关选择,选择控制数码管亮const unsigned char code[14] = {~0x3f, ~0x06, ~0x5b, ~0x4f,~0x66, ~0x6d, ~0x7d, ~0x07, ~0x7f, ~0x6f, 0x8c, 0xf0, 0xa1, 0x88}; //4位数码管选择位PORTC低4位输出控制动态显示unsigned char read_adc(unsigned char adc_input) //Read the AD conversion result{ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); //用于选择哪一个AD口进行数据转换,能够根据时隙来决定多路复用delay_us(10);ADCSRA|=0x40;while ((ADCSRA & 0x10)==0); //等待ADC转换结束,中断置位ADCSRA|=0x10;return ADCH; //转换结果左对齐,最高只需8位的转换精度,读取ADCH即可}void Mode_Change(void){if(0==KEY_MODE)//判断模式选择KEY_MODE是否按下{delay_ms(1);//调用内部定时函数,去抖动if(KEY_MODE)//再次判断return;while(0==KEY_MODE);//键被按下,等待释放,不对按键时长作处理,按下--释放,算一次按键CurMode++;if(CurMode>4)//5种模式选择CurMode=0;}}void Para_Adj(void){if(0==KEY_ADD) //按键一次,操作值加1{delay_ms(1);if(KEY_ADD)return;while(0==KEY_ADD);switch(CurMode){case 1:pid_p++;if(pid_p>99)pid_p=0; //pid参数取值范围[0,99]break;case 2:pid_i++;if(pid_i>99)pid_p=0;break;case 3:pid_d++;if(pid_d>99)pid_p=0;break;case 4:angle_sp++;if(angle_sp>90)angle_sp=0; //风摆角度取值[0,90]break;default:break;}}else if(0==KEY_MINUS) //按键一次,操作值减1{delay_ms(1);if(KEY_MINUS)return;while(0==KEY_MINUS);switch(CurMode){case 1:pid_p--;if(pid_p<0)pid_p=99;break;case 2:pid_i--;if(pid_i<0)pid_i=99;break;case 3:pid_d--;if(pid_d<0)pid_d=99;break;case 4:angle_sp--;if(angle_sp<0)angle_sp=90;break;default:break;}}}// By the type,Select display paravoid display_par(uchar type ,uchar value){uchar i,j;data_buf[0]=type;data_buf[1]=14; //用于选择0xff, 使数码管全灭data_buf[2]=value%100/10;//取十位data_buf[3]=value%10;//取个位for(i=0;i<4;i++){SEG=0xff; //4位数码管全灭DATA=code_dpy[data_buf[i]]; //要显示的数据编码SEG=seg[i]; //选择哪个数码管点亮for(j=0;j<25;j++); //稍作延时,用于动态显示数码管}}//According to the CurMode / Select display Modevoid display_select(void){switch(CurMode){case 0:display_angle(); // 显示anglebreak;case 1:display_par(10,pid_p);break;case 2:display_par(11,pid_i);break;case 3:display_par(12,pid_d);break;case 4:display_par(13,angle_sp);break;default:break;}}// display anglevoid display_angle(void){uchar i,j;data_buf[0]=angle_sp%100/10;data_buf[1]=angle_sp%10;data_buf[2]=angle_pv%100/10;data_buf[3]=angle_pv%10;for(i=0;i<4;i++){SEG=0xff;//4位数码管全灭DATA=code_dpy[data_buf[i]];//要显示的数据编码SEG=seg[i];//选择哪个数码管点亮for(j=0;j<25;j++);//稍作延时}}//Read the conversion anglevoid ReadAngle(){unsigned int result;result=read_adc(0);result*=90;result>>=8;angle_pv=result;}//Adjust the PWM 占空比,以此输出到转换电路,控制输入风扇的电压,进而进一步控制风扇转速void PidControl(){e2=e1;e1=e0;e0=angle_sp-angle_pv;u1=u0;u=pid_p*(e0-e1)+pid_i*e0+pid_d*(e0+e2-2*e1);u0=u+u1;if(u0>100){u0=100;}if(u0<0){u0=0;}OCR2=u0*255/100;}//initialization for allvoid on_off(){if(0==KEY_ENTER){delay_ms(1);if(KEY_ENTER)return;while(0==KEY_ENTER);Enter_Mode++;if(Enter_Mode>1)Enter_Mode=0;}}void main(void){// Declare your local variables here// Input/Output Ports initialization// Port A initialization// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In// State7=P State6=P State5=P State4=P State3=T State2=T State1=T State0=TPORTA=0xF0;DDRA=0x00;// Port B initialization// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0PORTB=0x00;DDRB=0xFF;// Port C initialization// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0PORTC=0x00;DDRC=0x0F;// Port D initialization// Func7=Out Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In// State7=0 State6=T State5=T State4=T State3=T State2=T State1=T State0=TPORTD=0x00;DDRD=0x80;// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: 1000.000 kHz// Mode: Fast PWM top=FFh// OC0 output: Non-Inverted PWM TCCR0=0x6A;TCNT0=0x00;OCR0=0x55;// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer 1 Stopped// Mode: Normal top=FFFFh// OC1A output: Discon.// OC1B output: Discon.// Noise Canceler: Off// Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off// Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00;TCCR1B=0x00;TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer 2 Stopped// Mode: Normal top=FFh// OC2 output: Disconnected ASSR=0x00;TCCR2=0x00;TCNT2=0x00;OCR2=0x00;// External Interrupt(s) initialization // INT0: Off// INT1: Off// INT2: OffMCUCR=0x00;MCUCSR=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=0x00;// Analog Comparator initialization// Analog Comparator: Off// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;SFIOR=0x00;init_all();while (1){on_off();while (Enter_Mode){on_off();Mode_Change();if((PINA&0x60)!=0x60){Para_Adj();}ReadAngle();PidControl();display_select();}ReadAngle();PidControl();display_select();};}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国大学生电子设计竞赛风力摆控制系统2015年8月15日摘要本系统是以STM32ZET6为控制核心的风力摆控制系统。
通过MPU6050三轴角速度感测器检测摆杆的摆动角度,并在12864液晶屏进行实时的显示,同时将检测到的角度信息传输给32单片机。
32单片机将此信号进行PID算法处理后产生相应的pwm 信号,控制轴流风机进行不同的动作反应,带动细杆旋转,以此实现不同的控制要求。
通过按键选择电机的工作模式,实现设计的各项要求。
关键词:STM32 MPU6050 12864 轴流风机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单片机系统,其拥有专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-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)系统总体框图本系统以STM32F103ZET6为单片机控制器,通过三轴角速度感测器检测摆杆的摆动角度,在12864液晶屏上进行实时的显示,并把检测到的角度信息传输给单片机生成相应的pwm信号,控制4个轴流风机进行不同的动作反应,带动细管转动,以此实现不同的控制要求。
通过按键选择电机的工作模式,实现设计的各项要求。
系统的总体框图如下:图1统总体框图(2)轴流风机子系统框图1、轴流风机子系统框图直流伺服电机控制子系统主要包括电机驱动模块、轴流风机、STM32单片机。
通过按键可以选择直流电机的工作模式。
轴流风机子系统框(3)陀螺仪与显示子系统框图1、陀螺仪与显示子系统框图图2 陀螺仪与显示子系统框图2、电路设计(1)电路流程图1四、系统测试1、测试方案驱动风力摆工作,使激光笔稳定地在地面画出一条长度不短于50cm 的直线段,来回五次,记录其由静止至开始自由摆时间及最大偏差距离。
2、测试条件与仪器测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:(1)秒表(2)量角器(3)自制方向角度图纸3、测试数据及分析(1)要求1测试数据表1 风力摆画长于50cm 直线测试(2)要求2测试数据表2 风力摆画不同长度直线测试(3)要求3测试数据表3 风力摆画不同角度直线测试(4)要求4测试数据表4 风力摆恢复静止测试(1)发挥部分1测试数据(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 <reg52.h> //包含单片机寄存器的头文件#include <string.h>#include <stdio.h>#include <dianji.h>#include "LCD.h"#include "anjian.h"#include "fangxiang.h"sbit four = P0^2;sbit one = P0^0;sbit two = P0^1;sbit san = P0^4;//sbit reset = P0^3;sbit fahui1=P0^5;unsigned char Re_buf[11],counter;unsigned char ucStra[6],ucStrw[6],ucStrAngle[6];int SetPoint_x; //设定目标Desired V aluedouble Proportion_x; //比例常数Proportional Constdouble Integral_x; //积分常数Integral Constdouble Derivative_x; //微分常数Derivative Constint LastError_x; //Error[-1]int PrevError_x; //Error[-2]int SumError_x;int SetPoint_y; //设定目标Desired V aluedouble Proportion_y; //比例常数Proportional Constdouble Integral_y; //积分常数Integral Constdouble Derivative_y; //微分常数Derivative Constint LastError_y; //Error[-1]int PrevError_y; //Error[-2]int SumError_y;int Value[3];int x,y;//sbit yuyin = P3^6;void jiaodu(){// int Value[3];// int x,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(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);// }}void xyzhi(){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];}/////////*************X轴PID*******************//////////////////void X_IncPIDInit(float angle_x,double P_DATA_X,double I_DATA_X,double D_DATA_X) {LastError_x = 0; //Error[-1]PrevError_x = 0; //Error[-2]SumError_x=0;Proportion_x =P_DATA_X; //比例常数Proportional ConstIntegral_x =I_DATA_X; //积分常数Integral ConstDerivative_x =D_DATA_X; //微分常数Derivative ConstSetPoint_x =angle_x; //目标是0}int XIncPIDCalc(int NextPoint)//位置PID{float ierr,derr;int iout;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************//////////////////////void Y_IncPIDInit(float angle_y,double P_DATA_Y,double I_DATA_Y,double D_DATA_Y) {LastError_y = 0; //Error[-1]PrevError_y = 0; //Error[-2]SumError_y=0;Proportion_y =P_DATA_Y; //比例常数Proportional ConstIntegral_y =I_DATA_Y; //积分常数Integral ConstSetPoint_y =angle_y; //目标是0}int YIncPIDCalc(int NextPoint)//位置PID{float ierr,derr;int iout;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);}void main(void){// int Value[3];int b,a;unsigned char i=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;ES=1;// send(0,0x93);// send(1,'C');// yuyin = 0;// delay(5000);// yuyin = 1;while(1){//-----------------第四步------------------if(four == 0){delay(10);if(four == 0){while(1){xyzhi();a= XIncPIDCalc(x);b=YIncPIDCalc(y);if(a > 0){tiaojie1(a);tiaojie3(0);}else{tiaojie1(0);tiaojie3(-a);}if(b>0){tiaojie2(b);tiaojie4(0);}else{tiaojie2(0);tiaojie4(-b);}{tiaojie1(0);tiaojie2(0);tiaojie3(0);tiaojie4(0);break;}}}}//fahui1--------------------------------------------------------------if(fahui1 == 0){delay(10);if(fahui1== 0){while(1){tiaojie2(1000);tiaojie4(0);delay(200);tiaojie2(0);tiaojie4(1000);delay(200);if(reset == 0){delay(10);if(reset == 0){tiaojie2(0);tiaojie4(0);break;}}}}}//------------------------------第一步--------------------------------if(one == 0){delay(10);if(one == 0)while(1){tiaojie2(1000);tiaojie4(0);delay(250);tiaojie2(0);tiaojie4(1000);delay(250);if(reset == 0){delay(10);if(reset == 0){tiaojie2(0);tiaojie4(0);break;}}}}}//----------------------第二步------------------------if(two == 0){delay(10);if(two == 0){while(1){matrixkeyscan();if(reset == 0){tiaojie2(0);tiaojie4(0);break;}}}}// if(fahui1 == 0)// delay(10);// if(fahui1== 0)// {// while(1)// {// tiaojie2(1000);// tiaojie4(0);// delay(100);// tiaojie2(0);// tiaojie4(1000);// delay(100);// if(reset == 0)// {// delay(10);// if(reset == 0)// {// tiaojie2(0);// tiaojie4(0);// break;// }// }// }// }//// }// }//}//---------------------第三部-------------------------------------------if(san == 0){delay(10);if(san == 0){while(1){fangxiang();if(reset == 0){tiaojie1(0);tiaojie2(0);tiaojie3(0);tiaojie4(0);}}}}}}void ser() interrupt 4{if (RI){RI=0;Re_buf[counter]=SBUF;if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头counter++;if(counter==11) //接收到11个数据{counter=0; //重新赋值,准备下一帧数据的接收switch(Re_buf [1]){case 0x51:ucStra[0]=Re_buf[2];ucStra[1]=Re_buf[3];ucStra[2]=Re_buf[4];ucStra[3]=Re_buf[5];ucStra[4]=Re_buf[6];ucStra[5]=Re_buf[7];break;case 0x52:ucStrw[0]=Re_buf[2];ucStrw[1]=Re_buf[3];ucStrw[2]=Re_buf[4];ucStrw[3]=Re_buf[5];ucStrw[4]=Re_buf[6];ucStrw[5]=Re_buf[7];break;case 0x53:ucStrAngle[0]=Re_buf[2];ucStrAngle[1]=Re_buf[3];ucStrAngle[2]=Re_buf[4];ucStrAngle[3]=Re_buf[5];ucStrAngle[5]=Re_buf[7];break;}}}}。