产品展示 | 联系我们 您好,欢迎访问M6米乐官网登录,我们将竭诚为您服务!
20年专注设备技术研发 专注技术 专心质量 专业服务
全国咨询热线:13528178965
您的位置: 首页 > 客户案例
客户案例

联系我们contact us

M6米乐官网登录
地址:广东省深圳市南山区前海路1428号南岗商务大厦1304室
联系人:米乐电竞下载
电话:13528178965
手机:13528138044

客户案例

计算机控制实验课程设计报告-直流电机转速pid控制

时间:2023-11-02 04:48:36 来源:M6米乐官网登录 点击:1次

  基于89c52单片机的PWM 直流电机PID控制调速系 统 实验报告 1 目录 第一章系统方案设计3 1.1 直流电机转速开环控制与闭环控制的选取 3 1.2 直流电机调速方式的选取4 1.3 直流电机测速装置的选取5 1.4 系统控制算法的选取8 1.5 系统总体设计10 第二章硬件设计11 2.1AT89C52 芯片介绍11 2.2 直流电机驱动芯片ULN2803 设计 13 2.3 数显管显示给定速度和实际速度模块 15 2.4 按键模块设计 16 2.5 测速模块设计 18 第三章软件部分设计19 3.1 数显管显示软件设计部分 19 3.2 外部中断P3.3 计数程序21 3.3 定时器0 中断软件设计 22 3.4 PWM 算法程序设计 25 3.5 PID 控制算法程序设计26 3.6 按键程序设计 29 第四章基于matlab的PID参数设计及仿线 各部分传递函数的整定 31 4.2 PID 参数的整定 31 第五章结果分析33 第六章实验总结及感想34 参考文献36 附录一硬件系统电路原理图36 附录二程序源代码36 2 第一章、 系统总体方案设计 1.1 直流电机转速开环控制与闭环控制的选取 对直流电机转速的控制有一般有两种方式,一种是开环控 制,一种是闭环控制。开环控制的优点是简单、稳定、可靠。 若组成系统的元件特性和参数值较为稳定,且外界干扰较小, 开环控制能够保持一定的精度。缺点是精度通常较低,无自动 纠偏能力;闭环控制的优点是控制的精度能够达到很高,而且 对外界的干扰和系统的参数变化有很好的抑制作用,且可以通 过输出反馈控制管理系统的控制过程。缺点是存在稳定性,振荡, 超调等一系列问题,对系统的性能分析和设计远比开环控制麻 烦。 经过利弊的取舍,本次试验选择的是闭环控制,因为准备 应用PID算法控制电机的转速,故而需要有实际转速进行反馈 与给定的转速形成对比,进而通过算法输出PWM波形来控制直 流电机。 既然已经选择了直流电机转速闭环控制,可根据反馈机制大概做出 其控制模型。 + R(t) e(t) c(t) PID算法 输出PWM 直流电机 — 测速装置 3 1.2 直流电机调速方式的选取 直流无刷电机由电动机、转子位置传感器和电子开关线路三 部分所组成。直流电源通过开关线路向电动机定子绕组供电,电 动机转子位置由位置传感器检验测试并提供信号去触发开关线路中 的功率开关元件使之导通或截止,从而控制电动机的转动。在 应用实例中,磁极旋转,电枢静止,电枢绕组里的电流换向借 助于位置传感器和电子开关电路来实现。电机的电枢绕组作成 三相,转子由永磁材料制成,与转子轴相连的位置传感器采用 霍尔传感器。3600范围内,两两相差1200安装,共安装三个。 为了更好的提高电机的特性,电机采用二相导通星形三相六状态的工 作方式。开关电路采取三相桥式接线方式。 基于直流电机的特性,本次试验使用的是 PWM 脉宽调制方 法。脉宽调制 (PWM)是利用数字输出对模拟电路来控制的一 种有效技术,尤其是在对电机的转速控制方面,可非常大地节省能 量。PWM 有着非常强的抗噪性,且有节约空间、比较经济等特 点。模拟控制电路有以下缺陷:模拟电路容易随时间漂移,会产 生一些不必要的热损耗,以及对噪声敏感等。而在用了 PWM 技术后,避免了以上的缺陷,实现了用数字方式来控制模拟信 号,可以大幅度减少相关成本和功耗。PWM对调速系统来说,系统 的响应速度和稳定精度等指标比较好;电枢电流的脉动量小,容 易连续,还能够不必外加滤波电抗也可以平稳工作;系统的调 4 速范围宽;使用元件少、线路简单。 PWM的原理: 理论基础:冲量相等而形状不同的窄脉冲加在具有惯性的环节上 时,其效果基本相同。冲量指窄脉冲的面积。效果基本相同,是指环 节的输出响应波形基本相同。低频段非常接近,仅在高频段略有差异。 用一系列等幅不等宽的脉冲来代替一个正弦半波,正弦半波N等 分,看成N个相连的脉冲序列,宽度相等,但幅值不等;用矩形脉冲 代替,等幅,不等宽,中点重合,面积(冲量)相等,宽度按正弦规 律变化。脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成, 占空比与信号的瞬时采样值成比例。图1所示为脉冲宽度调制系统的 原理框图和波形图。该系统有一个比较器和一个周期为Ts 的锯齿波 发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数 A, 否则输出0。因此,从图1中能够准确的看出,比较器输出一列下降沿调制 的脉冲宽度调制波。 1.3 直流电机测速装置的选取 经过查阅了大量资料,发现目前常用的测速装置有三种。 1.3.1 直流测速发电机测速 直流测速发电机可分为励磁式和永磁式两种。励磁式由励磁绕 组接成他励,永磁式采用矫顽力高的磁钢制成磁极。由于永磁 式不需另加励磁电源,也不因励磁绕组气温变化而影响输出电 压,故应用较广。 根据已学过的直流发电机的工作原理知,电刷两端的感应电势 : 5 E = C фn=K n 可知 a e e 1.电刷两端的感应电势与电机的转速成正比。 2.直流发电机能够把转速信号换成电势信号,从而用来测速。 自动控制系统对测速发动机的要求为:1.输出电压与转速的关 系曲线.输出特性的斜率要大。3.气温变化对输出特 性的影响要小。4.输出电压的波纹要小。5.正反转两个方向的 输出特性要一致。 图中实线为直流测速发电机的理想输出特性,虚线为实际输出 特性,实际特性与要求的线性特性之间有误差,且该误差与 负载电阻有关。 直流测速发电机的优点是原理简单,且在一些范围内能够很好的满足 系统的需求。缺点是其输出的是电压值,若使用在数字信号 电路里是必须得用AD 转换芯片转化成数字信号。而且其需要处 于线性区,但是现实中线性的系统基本上很少,故而现在已经 不常用。鉴于本实验使用的是单片机控制管理系统,故而此测速方 6 式不适用。 1.3.2 霍尔传感器测速 霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔 效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855— 1938)于1879 年在研究金属的导电机构时发现的。后来发现半 导体、导电流体等也有这种效应,而半导体的霍尔效应比金属 强得多,利用这现象制成的各种霍尔元件,广泛地应用于工业 自动化技术、检测技术及信息处理等方面。霍尔效应是研究半 导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数, 能够判断半导体材料的导电类型、载流子浓度及载流子迁移率 等重要参数。 电机每转一圈,每一相霍尔传感器产生2 脉冲,且其周期与 电机转速成反比,因此能利用霍尔传感器信号得到电机的实 际转速。为尽可能缩短一次速度采样的时间,可测得任意一相霍 尔传感器的一个正脉冲的宽度,则电机的实际转速为: V=N*30; V:速度 R/min N:每秒采样的脉冲个数 霍尔传感器输出的是脉冲,可以直接将输出脉冲接入单片 机外部计数器,故而格外的简单实用。 7 1.3.3 光电编码器测速 其效果跟霍尔测速一致,但是霍尔元件利用的是电磁产生脉冲, 光电编码器利用的是光产生脉冲。它的原理是通过电动机的转 动带动码盘的转动,码盘上有很多缝隙,缝隙每经过红外管一 次就会产生一个脉冲,进而直接输入单片机,经过算法处理得 到实际转速。 经过分析,本次试验选取的是光电码盘测速。首先是因为同时 测量霍尔元件和光电编码器,发现光电编码器的灵敏度更高, 且其价格实惠公道。最关键的是它很好用。 1.4 系统控制算法的选取 控制算法是微机化控制软件系统的一个重要组成部分,可以说 总系统的控制功能主要由控制算法来实线。所以控制算法的 好坏直接决定了这个系统的好坏。根据偏差的比例(P)、积分 (I)、微分(D)来控制,称为PID控制。它能满足相当多工 业对象的控制要求,至今仍是一种应用最广的控制算法。由于 是用单片机控制的系统,故而我们采用数字PID控制。 1.4.1模拟PID控制规律的离散化 模拟形式 离散化形式 e(t)r(t)c(t) e(n)r(n)c(n) de(t) e(n)e(n1) dT T t  e(t)dt n n   0 e(i)T T e(i) i0 i0 8 1.4.2数字PID 控制器的差分方程  T n TD   u(n)K e(n) e(i) e(n)e(n1) u P  TI i0 T  0 u (n)u (n)u (n)u P I D 0 式中 u (n)K e(n) 称为比例项 P P T n u (n)K  e(i) 称为积分项 I P T I i0 u (n)K TD e(n)e(n1) 称为微分项 D P T 1.4.3常用的控制方式 1、P 控制 u(n)u (n)u P 0 2、PI 控制 u(n)u (n)u (n)u P I 0 3、PD 控制 u(n)u (n)u (n)u P D 0 4、PID 控制 u(n)u (n)u (n)u (n)u P I D 0 1.4.4PID 算法的两种类型 1 位置型控制――例如图5-1-5 调节阀控制 、  T n TD   u(n)K e(n) e(i) e(n)e(n1) u P  TI i0 T  0 2 增量型控制――例如图5-1-6 步进电机控制 、 u(n)u(n)u(n1)   T TD   K e(n)e(n1) K e(n)K e(n)2e(n1)e(n2) P P T P T I 9 由于控制的是直流电机,当执行机构采用控制直流电机的 直流PWM装置和晶闸管整流装置时,能够使用数字PID位置型 控制算法;当执行结构采用步进电机,每个采样周期控制输出 的控制量时,是相对于上次控制量的增加,故此时要采用数字 PID增量型控制算法。 由于此实验控制的是直流电机,故而采用数字PID位置型控 制算法。 数字PID控制器主要参数是Kp,τ τ和采样周期Ts。系统 i, D 的设计任务是选取合适的PID控制器参数使总系统具有满意 的动态特性,并满足稳态误差要求。具体的参数选取要靠matlab 仿真,仿真结果见下文matlab篇。 1.5 系统总体设计 用AT89C52单片机作为控制核心;用uln2003驱动电机转动,用 pwm 波来控制此芯片间接控制电机转速;用光电编码器测速进行 反馈;用复位开关进行电机给定速度的调节,由加速键,减速键 和清零键构成。如图: 10 PWM 驱动电路 直流电机 STC89C52 数显管显示给 定速度和实际 速度脉冲 单片机 速度 码盘测速 键盘调速 第二章、硬件设计 2.1 AT89C52 芯片介绍 AT89C52 是一个低电压,高性能CMOS 8 位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器 256 bytes 的随机存取 数据存储器(RAM),器件采用ATMEL 公司的高密度、非易失性存储 技术生产,兼容标准MCS-51 指令系统,片内置通用8 位中央处理器 Flash 存储单元,AT89C52 单片机在电子行业中存在广泛的应用。 11 其基本功能特性: 1、兼容MCS51 指令系统 2、8k 可反复擦写(大于1000 次)Flash ROM; 3、32 个双向I/O 口; 4 、256x8bit 内部RAM; 5、3 个16 位可编程定时/计数器中断; 6、时钟频率0-24MHz ; 7、2 个串行中断,可编程UART 串行通道; 8、2 个外部中断源,共8 个中断源; 9、2 个读写中断口线、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能; 11、有 PDIP、PQFP、TQFP 及 PLCC 等几种封装形式,以适应不 同产品的需求。 AT89C52 为 40 脚双列直插封装的 8 位通用微处理器,采用 工业标准的 C51 内核,在内部功能及管脚排布上与通用的8xc52 相同,其大多数都用在会聚调整时的功能控制。功能包括对会聚主 IC 内部寄存器、数据RAM 及外部接口等功能部件的初始化,会聚调 整控制,会聚测试图控制,红外遥控信号IR 的接收解码及与主板 CP 通信等。主要管脚有:XTAL1 (19 脚)和XTAL2 (18 脚)为 振荡器输入输出端口,外接 12MHz 晶振。RST/Vpd (9 脚)为复 位输入端口,外接电阻电容组成的复位电路。VCC (40 脚)和VSS 12 (20 脚)为供电端口,分别接+5V 电源的正负端。P0~P3 为可编 程通用 I/O 脚,其功能用途由软件定义,在本设计中,P0 端口 (32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能 管脚相连接,13 脚定义为 IR 输入端,10 脚和 11 脚定义为 I2C 总线 脚、27 脚及 28 脚定义为握手信号功能端口,连接主板 CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的 控制功能。 AT89C52 参数 AT89C52 基本信息参数 FLASH (bytes) 8K RAM (Bytes) 256 最大频率 (MHz) 24 Vcc (V) 5±20% AT89C52 其他特性 I/O 引脚 32 ISP -- AT89C52 封装类型 PDIP40, PLCC44, TQFP44, PQFP44 2.2直流电机驱动芯片ULN2803 的设计 13 此驱动芯片采用的是高电压大电流八达林顿晶体管阵列,该阵列 的八个 NPN 达林顿管连接晶体管是低逻辑电平数字电路和大电流高 电压要求的灯、继电器、打印机和其他类似负载间的接口的理想器件。 大范围的应用于计算机,工业和消费类产品中。所有器件有集电极开路输 出和用于瞬变抑制的续流二极管。ULN2803 的设计与标准TTL 系列兼 容,而ULN2804 可使6 至15 伏高电平CMOS 或 PMOS 优化。它的最 大额定值为如下表: ULN2803 是一个 7 路反向器电路,即当输入端为高电平时 ULN2803输出端为低电平,当输入端为低电平时ULN2803输出端 为高电平,继电器得电吸合。 本次试验驱动电路如下: 14 通过 1B接口输入PWM波形,1C 口输出相反电平。 2.3 数显管显示给定速度和实际速度模块 此处用的是共阴极数显管,为四位数显管。其段选接 P0 口,由于 P0 口是高阻态,故而接在单片机上时要接上拉电阻,一般上拉电阻 定为 10k。其位选接 P2 口。驱动数显管的芯片有很多,有一个很 流行的是 74HC573 锁存器,但是由于单片机的接口充足,所以这里 没有采用驱动装置,用的是小的数显管,也不需要用三极管放大电流, 所以侧重它的编程。显示的方法是应用的动态显示,应用人的视觉暂 留来显示数值。 此模块电路图如下: 15 2.4 按键模块设计 键盘分为编码键盘和非编码键盘。靠软件编程来识别的键盘称为 非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。 非编码键盘又分为独立键盘和行列式键盘。 单片机检测按键的原理是:单片机 I/O 口既可作为输出也可作为 输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接 地,另一端与单片机的某个I/O 口相连,开始时先给该I/O 口赋以高 电平,然后让单片机不断的检测该I/O 口是否变为低电平,当按键闭 合时,既相当于该I/O 口通过按键与地相连,变成低电平,程序一旦 检测到I/O 口变成低电平则说明按键被按下,然后执行相应的指令。 但是在按键按下的时候,由于按键是弹性的,这过程会产生抖动, 抖动时间的长短和按键的机械特性有关,一般为5—10ms。 16 通常我们手动按下键然后立即释放,这一个动作中稳定闭合的时间 超过20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作, 有专用的去抖动电路,也有专用的去抖动芯片,但通常我们用软件掩 饰的方法就能很容易的解决抖动问题,而没有必要再添加多余的硬件 电路。 刚开始想用4*4键盘输入给定速度,但是仔细考虑了一下性价比, 经过慎重选择,我抛弃了这个键盘,改用3个复位开关调节给定速度。 具体过程是:一个复位开关决定了速度的加,每一次加一定的速度值; 还有一个复位开关见决定了速度的减,每一次减一定的速度值;还有 一个复位键是用来置零的。加速键接在p1.0 口上,减速键接在P1.1 口上,置零键接在P1.3 口上。 17 2.5 测速模块设计 本实验应用的是红外管输入脉冲,深色物的红外反射率因不同的材料 而不同,发射管发射出红外线,在材料上反射回来,由接受管接受。 当有信号反射回来时输出低电平,没有反射时输出高电平。 这个光电编码器整体是买来的实物,在仿真软件protues中没有很合 适的仿真物,我用可以直接输出脉冲的直流电机代替了。买的时候我 进行了现场的测试,发现它非常的灵敏,作为电动机转速的测量绰绰 有余了。 18 第三章、软件部分设计 3.1 数显管显示软件设计部分(void SegRefre()) 数显管有八位,前四位显示的是给定速度,后四位现实的是实际测得 的转速。假设前四位数显管为管A ,后四位为管B,则经过分析研究作 出数显管AB 的程序流程图分别如下: START 单片机初始化 N 是否有键按下 Y AddSpeed 按下 Stop 按下时,要求 SubSpeed 按下时, 时,一下加50 数显管清零 一下减50 数显管A显示 给定转速 19 START 初始化 测速模块 转速/1s 刷新一次 数显管B 显示实际转 速 程序为: void SegRefre() //数码管显示刷新 { Data_Buffer[0] = SpeedSet/1000; Data_Buffer[1] = SpeedSet%1000/100; Data_Buffer[2] = SpeedSet%100/10; 20 Data_Buffer[3] = SpeedSet%10; Data_Buffer[4] = num/1000; Data_Buffer[5] = num%1000/100; Data_Buffer[6] = num%100/10; Data_Buffer[7] = num%10; } 3.2 外部中断p3.3计数程序(void exter0() interrupt 0) 此外部中断大多数都用在对测速产生的脉冲进行计数。程序流程图为: 测转速脉冲输入 脉冲计数 返回 程序如下: void exter0() interrupt 0 //外部中断脉冲计数 { Inpluse++; } 21 3.3 定时器0 中断软件设计(void timer0() interrupt 1) 定时器 0 中断大多数都用在数显管显示数值和一段时间间隔内对转速进 行采样计算PID 控制,初始化中断时间设置为2m 。 程序流程图为: START 计时器初始化 数显管显示,送 段,位码 N 1 计时标志位 Y 计算转速并PID控制 返回 程序如下: void timer0() interrupt 1 { static unsigned char Bit = 0; //静态变量,退出程序后,值保留 22 static unsigned int time = 0; static unsigned int aa = 0; TH0 = THCO; TL0 = TLCO; aa ++ ; //100MS 串口输出一次数据 if ( aa == 50) { aa = 0; flag0 = 1; } cnt ++ ;// PID 脉冲周期 Bit ++ ; time ++ ;//转速测量周期 if(Bit = 8) Bit=0; P2 = 0xff; //先关位 P0 = Duan[Data_Buffer[ Bit ] ]; //开段码 switch(Bit) //送位码 { case 0: P2 = 0XFE; break; case 1: P2 = 0XFD; break; case 2: P2 = 0XFB; break; 23 case 3: P2 = 0XF7; break; case 4: P2 = 0XEF; break; case 5: P2 = 0XDF; break; case 6: P2 = 0XBF; break; case 7: P2 = 0X7F; break; } if(time = 500) //1s 钟读取一次转速 { time = 0; num = Inpluse*10; //计算转速 Inpluse = 0; PIDControl();// 1s 控制一次 } } 24 3.4 PWM 算法程序设计(void PWMOUT() ) Pwm 是通过 PID 计算出来的偏差来调整输出脉冲的宽度还控制电机 的转速的。 程序流程图如下: START N PWM 脉宽PID 输出值 输出高电平 输出低电平 Y 返回 程序如下: void PWMOUT() //PWm 输出 { 25 if ( cnt PWMTime ) { PWM_FC = 0 ; } else { PWM_FC = 1 ; } if ( cnt 250) cnt = 0 ; } 3.5 PID 控制算法程序设计(void PIDControl()) 当电机转速的设定值突然改变,或电机的转速发生突变时,会引起 偏差的阶跃,使e 增大,PID 的输出u 将飞速增加或减小, 以至于超过控 制量的上下限, 电机的转速 SPEEDSET 虽然一直上升,但由于控制量受 到限制,其增长的速度减慢,偏差 E 将比正常情况下持续更长的时间保 持在较大的偏差值,该程序主要是把设定的转速减当前测量得到的转 速来计算偏差,从而用PWM 输出方式来确定输出脉冲的宽度。 程序流程图如下: 26 START 求偏差值e 给定pid参数计算 duk 计算uk 判断uk范围 Uk=250 Uk=0 输出pwm 返回 27 程序如下: void PIDControl() //PID 偏差计算 { e = SpeedSet - num ; duk=( Kp*(e - e1) + Ki*e + Kd*(e - 2*e1 + e2))/100 ; uk = uk1 + duk ; out = (int)uk ; if(out 250) { out = 250 ; } else if(out 0) { out = 0 ; } uk1 = uk ; e2 = e1 ; e1 = e ; PWMTime = out ; 28 } void delay(uchar x) { uint i = 0,j = 0; for(i = x ; i 0 ; i--) for(j = 50 ; j 0 ; j--) ; } 3.6 按键程序设计 由于按键与数显管的显示相关,故其程序流程图已给,下面只给其算 法如下: void SetSpeed() //按键速度设定 { if ( AddSpeed==0) { delay(20) ; //有键按下 if( AddSpeed==0) { SpeedSet=SpeedSet+50 ; if( SpeedSet9999) { SpeedSet=0; 29 } while(!AddSpeed);//等待按键释放 } } if ( SubSpeed == 0) //速度减 delay(20); if( SubSpeed == 0) SpeedSet -= 50; //有键按下 if (SpeedSet=0) SpeedSet = 0; while(!SubSpeed); } } if (Stop == 0) // 电机停止 delay(20); if(Stop==0) SpeedSet = 0 ; 30 PWM_FC = 1 ; } while(!Stop); } } 第四章、基于matlab 的PID 参数设计及仿线 各部分传递函数参数的整定 有前面所说的控制模型可知,系统的架构模型有PID,PWM,直流电机 这3 个,故而只需求取PWM,和直流电机的传递函数即可。 经查资料知道 Pwm 的传递函数为: G1(s)= 44 0.00157s+1 直流电机的传递函数为:G2(s)= 1/0.1925 0.075*0.017s +0.075s+12 根据传递函数搭建的仿线 PID 参数的整定 下面我们通过仿真来确定离散 PID 控制器的参数,一般有两种方法。 我们用试凑法 31  试凑法要求按照先求出Kp,后求出 ,最后求出 的顺序来调试系i  D 统的PID参数,目标是知道调到满意的结果为止。由于直流电机的纯 滞后时间为零点零几秒左右,可以再一次进行选择一个足够短的采样周期,使其 为直流电机对象的纯滞后时间的十分之一以下。在此我选择十分之一, 因此Ts是零点零几秒的数量级,确定它为0.001s来整定控制参数。 经过整定后发现当Kp=0.5,Ki=7,Kd=0.001时较为贴切。 波形如下 从仿真波形可知,电机转速的上升时间为0.3s左右,没有超调,静差 为0,说明其过度特性很好。也说明1ms的采样周期很合适。 32 第五章、结果分析 这里主要分析的结果是电机启动到电机达到给定转速所需要的时间: 仿真开始: 达到给定速度时: 可知其所需要的时间为31秒,比想象中的长,但是误差很小,基本 上达到指定速度后就不会再改变了。 我也试着改进参数使其时间变得更短,但是真实的操作起来发现当你改 33 变参数的时候,它的超调会很大,而且波动很强,不适合作为pid参 数,综上,pid参数还是matlab仿真得来的参数最好的。但是用matlab 仿真发现电机达到稳态所需的时间仅为0.3s左右,本人认为用proteus 仿真出来的更具有实用性,matlab仿真的最大的目的还是选最合适的 pid参数。 第六章、实验总结及感想 这次实验周期很长,从6月25号开始做一直到7月7号才结束,期 间也碰到了许多难题,在此简要总结一下。 由于本人单片机基础很不牢固,但是这个课程设计要用到单片机,所 以首先做的是不断琢磨单片机的基本功能和基本外设,如定时器计数 器的使用,数显管的显示和键盘的输入,刚开始认真研究单片机的时 候基本上遇到的问题都是问题,举步维艰,也曾到图书馆翻了很多关 于单片机的书,经过不断学习,最后考虑到有一定的c语言基础,而 汇编语言短时间内学不扎实,果断选择了用c语言编程。进过几天不 断的学习,对单片机的理解也慢慢变得深,知道的也慢慢变得多,这为 此课程设计打下了很扎实的基础。 开始做此课设时考虑到要输入数据和输出数据,但是这期间走了很多 弯路。刚才是准备使用4*4矩阵键盘进行给定转速的输出,最后鉴于 本人的单片机基础有限,发现此程序很复杂,进过很久的研究, 最后明智的抛弃了他,而选择速度增加键减少键和清零键取代。数显 管刚开始想选用74HC573锁存器来进行动态数显管的显示,但是发 现数显管的前4位后后四位如果不使用同一个显示算法的线 很多,而且最后发现单片机的I/O 口很充足,所以就直接用16个I/O 来进行数显管的显示了,这样很对自己最合适想的算法,然后省下了很大 的麻烦。 大的范围就遇到这两个问题,小的范围内发现了很多细节上的理解错 误,比如数据类型的设定,当设定的速度通过subspeed键减小到0 的时候再减会出现数显管上显示436 的数字,这很不符合逻辑,因为 开始已经设定当setspeed小于0的时候永远为0。进过仔细分析发现 setspeed的数据类型不能为unsigned,而是singed,因为当你小于0 的时候,unsigned虽说不输出负数,但是会输出它的反码,反码会对 应一个值,如果signed的线。事实上改过来 之后就解决了这样的一个问题,让我了解到了数据类型是多么的重要。还遇 到的问题比如数显管其他位都很正常,但是只有第二位总是闪,这让 我难为了很久也找不到毛病,最后无意间删掉了一段没有用的程序后 一切都好了,这让我了解到程序一定要精简,不然你永远都不可能知道它 会出现什么不可预知的错误。其他小的问题也有很多,但是都被我经 过仔细的研究慢慢的克服,最后仿真结果和硬件都很合适。 总之单片机是个很细致的学科,我们要坚持做完,碰到问题一定要仔 细想,这样才可以发现它的强大。 参考文献: 35 我的参考文献很少,自己买的其中一本书就是很著名的郭天祥老师书 叫《51单片机c语言教程》外加全套开发板,另外图书馆里的单片 机书大多数都翻过。电机部分参考自控原理书里的电机传递函数。还 有keil 教程和proteus 教程 附录一硬件系统电路原理 附录二:程序源代码 #include reg52.h #define uchar unsigned char #define uint unsigned int #define THCO 0xf8 #define TLCO 0x30 //2ms uchar code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴 极数码管,0-9 段码表 uchar Data_Buffer[8]={0,0,0,0,0,0,0,0};//数码管显示数值,数组变量定义 36 uchar Data[4]={0,0,0,0}; uchar Arry[4]={0,0,0,0}; bit flag1 = 0 ; bit flag0 = 0; unsigned char i = 0 ; sbit AddSpeed=P1^1; sbit SubSpeed=P1^2; sbit Stop=P1^3;//按键调速 sbit PWM_FC=P1^0;//PWM 控制端 int e=0,e1=0,e2=0;//PID 偏 float uk=0,uk1=0.0,duk=0.0;//PID 输出值 float Kp=0.5,Ki=7,Kd=0.001;//PID 控制系数 int out=0; signed int SpeedSet=500; uint cnt=0; uint Inpluse=0,num=0; //脉冲计数单元 uint PWMTime=0;//脉冲宽度 void PIDControl(); void SystemInit(); void delay(uchar x); void PWMOUT(); void SetSpeed(); void SegRefre(); void main() { SystemInit() ; while(1) { SetSpeed() ; SegRefre() ; PWMOUT() ; } } void PIDControl() //PID 偏差计算 { e = SpeedSet - num ; duk=( Kp*(e - e1) + Ki*e + Kd*(e - 2*e1 + e2))/100 ; uk = uk1 + duk ; out = (int)uk ; if(out 250) { out = 250 ; 37 } else if(out 0) { out = 0 ; } uk1 = uk ; e2 = e1 ; e1 = e ; PWMTime = out ; } void delay(uchar x) { uint i = 0,j = 0; for(i = x ; i 0 ; i--) for(j = 50 ; j 0 ; j--) ; } void PWMOUT() //PWm 输出 { if ( cnt PWMTime ) { PWM_FC = 0 ; } else { PWM_FC = 1 ; } if ( cnt 250) cnt = 0 ; } void SystemInit() { TMOD = 0x21; //定时器0,计数器的初始化 TH0 = THCO ; TL0 = TLCO ; TR0 = 1 ; ET0 = 1 ; EX0 = 1 ; IT0 = 1 ; PCON = 0x00 ; //方式一,8 位数据位,一位起始位和一位结束位 SCON = 0x50 ; // 串口通信控制寄存器模式一,收发使能 TH1= 0xfd ; //波特率为9600,11.0592HZ TL1= 0xfd ; 38 ES = 1 ; TR1= 1 ; EA = 1 ; e = 0 ; e1 = 0 ; e2 = 0 ; } void SetSpeed() //按键速度设定 { if ( AddSpeed==0) { delay(20) ; //有键按下延时10ms if( AddSpeed==0) { SpeedSet=SpeedSet+50 ; if( SpeedSet9999) { SpeedSet=0; } while(!AddSpeed);//等待按键释放 } } if ( SubSpeed == 0) //速度减 { delay(20); if( SubSpeed == 0) { SpeedSet -= 50; //有键按下 if (SpeedSet=0) SpeedSet = 0; while(!SubSpeed); } } if (Stop == 0) // 电机停止 { delay(20); if(Stop==0) { SpeedSet = 0 ; PWM_FC = 1 ; } 39 while(!Stop); } } void SegRefre() //数码管显示刷新 { Data_Buffer[0] = SpeedSet/1000; Data_Buffer[1] = SpeedSet%1000/100; Data_Buffer[2] = SpeedSet%100/10; Data_Buffer[3] = SpeedSet%10; Data_Buffer[4] = num/1000; Data_Buffer[5] = num%1000/100; Data_Buffer[6] = num%100/10; Data_Buffer[7] = num%10; } void exter0() interrupt 0 //外部中断脉冲计数 { Inpluse++; } void timer0() interrupt 1 { static unsigned char Bit = 0; //静态变量,退出程序后,值保留 static unsigned int time = 0; static unsigned int aa = 0; TH0 = THCO; TL0 = TLCO; aa ++ ; //100MS 串口输出一次数据 if ( aa == 50) { aa = 0; flag0 = 1; } cnt ++ ;// PID 脉冲周期 Bit ++ ; time ++ ;//转速测量周期 if(Bit = 8) Bit=0; P2 = 0xff; //先关位 P0 = Duan[Data_Buffer[ Bit ] ]; //开段 switch(Bit) //送位 { case 0: P2 = 0XFE; break; 40 case 1: P2 = 0XFD; break; case 2: P2 = 0XFB; break; case 3: P2 = 0XF7; break; case 4: P2 = 0XEF; break; case 5: P2 = 0XDF; break; case 6: P2 = 0XBF; break; case 7: P2 = 0X7F; break; } if(time = 500) //1s 钟读取一次转速 { time = 0; num = Inpluse*10; //计算转速 Inpluse = 0; PIDControl();// 1s 控制一次 } } 41

  高中英语 新人教必修一 Unit 2 reading for writing.ppt

  物理军事与科技(课件)-2021-2022学年综合实践 通用版.ppt

  劝学-【中职专用】中职高考语文必考九篇文言文专项练习(湖北适用)(解析版).docx

  原创力文档创建于2008年,本站为文档C2C交易模式,即用户上传的文档直接分享给其他用户(可下载、阅读),本站只是中间服务平台,本站所有文档下载所得的收益归上传人所有。原创力文档是网络服务平台方,若您的权利被侵害,请发链接和相关诉求至 电线) ,上传者

在线客服
联系方式

热线电话

13528178965

上班时间

周一到周五

手机号码

13528138044

二维码
线