您的当前位置:首页正文

计算机控制技术PID课程设计报告

2020-07-03 来源:爱go旅游网


课 程 设 计

课程名称 计算机控制技术 题目名称 高精度直流电机调速系统 学生学院 信息工程学院 专业班级 应用电子技术2班 学 号 XXXXXXXXXXX 学生姓名 胡丛滟 指导教师 黄国宏

2014 年 06 月 16 日

1

目录

一、方案论证................................................................................................................3

1.1. PID算法...........................................................................................................3 1.2. 简易工程发整定PID参数..............................................................................3 二、理论分析与计算.....................................................................................................3

2.1. 系统设计方案.................................................................................................3 2.2. 数字PID控制器.............................................................................................4 2.3. 凑式法整定PID参数.....................................................................................5 2.4. 直流电机调速与测速.....................................................................................6 三、硬件电路设计.........................................................................................................6

3.1. 电机驱动及传感器电路.................................................................................7 3.2. 串口发送数据电路.........................................................................................7 3.3. LCD1602显示电路.........................................................................................7 四、程序设计................................................................................................................8

4.1. PID增量式算法...............................................................................................8 4.2. 系统程序流程图.............................................................................................8 4.3. 消除积分不灵敏的办法.................................................................................9 4.4. 抗积分饱和的办法.........................................................................................9 五、调试过程...............................................................................................................10

5.1. 只有比例环节...............................................................................................10 5.2. 加入积分环节...............................................................................................11 5.3. 加入积分分离...............................................................................................11 5.4. 加入微分环节...............................................................................................13 六、设计心得................................................................................................ .............15 七、参考文献..............................................................................................................15 八、附录(程序).........................................................................................................16

2

摘要

本作品以单片机STC98C52为控制器,由电机、电机速度采集传感器和电机驱动组成主电路。控制器产生PWM脉冲送到电机驱动电路中,经过功率放大后控制直流电机转速,同时利用速度检测模块将当前转速反馈到控制器中,控制器经过数字PID运算后改变PWM脉冲的占空比,实现电机精确控制转速和改善系统运行目的。实验数据通过LCD1602显示并通过串口发送给PC机进行波形显示。

ABSTRACT

This work STC98C52 MCU as the controller, driven by a motor, motor speed acquisition sensor and the composition of the main circuit. Controller to generate PWM pulse motor drive circuit, after power amplification control dc motor speed, and speed detection module is used to change the current speed feedback to the controller, the controller through a digital PID computation after changing the duty ratio of PWM pulse, it can realize accurate control of motor speed and improve the system operation purpose. The experimental data through the LCD1602 display and waveform display through a serial port is sent to the PC.

3

一、方案论证

1.1. PID算法

方案一:采用位置式PID算法,该控制算法提供了执行机构的具体位置,PID输出与整个过去的状态有关,容易产生大的累加误差。

方案二:采用增量式PID算法,增量算法不需要做累加,控制量增量的确定仅与最近几次误差采样有关,对控制量的计算影响较小,易于实现手动到自动的无冲击切换。

方案采用:在本实验中采用增量式PID算法。主要原因是PWM占空比和转速不成线性关系,意思就是就算知道了现在电机速度,也无法准确改变占空比来达到期望速度,采用增量式的好处是只要有误差存在就可以不断增加或者减少占空比来达到期望速度。

1.2. 简易工程法整定PID参数

方案一:采用扩充临界比例度法,只需选取一个足够短的采样周期,只采用比例作用,不断改小比例度(δ=1/Kp),直到系统发生持续等幅振荡,记下使系统发生振荡的临界比例度δk及系统的临界振荡周期Tk,然后再通过选择控制度和根据表格查找参数就可以求得T、Kp、Ti、Td的值。

方案二:采用凑试法,根据参数对控制过程的影响趋势,对参数实行先比例,后积分,再微分的整定步骤。

方案采用:本实验采用凑试法。主要原因是扩充临界比例度法需要选择足够小的采样周期,但本系统的采样周期为1s,远大于纯滞后时间,因此不能采用扩充临界比例度法。

二、理论分析与计算

2.1. 系统设计方案

显示模块键盘模块控制器模块PWM脉冲电机驱动模块直流电机速度检测模块

图2.1 系统方案框图

4

根据系统设计的任务和要求,设计系统方框图如图2.1所示。图中控制器模块为系统的核心部件,按键和显示器用来实现人机交互功能,其中通过按键将需要设置的参数和状态输入到单片机中,并且通过控制器显示到显示器上。在运行过程中控制器产生PWM脉冲送到电机驱动电路中,经过放大后控制直流电机转速,同时利用速度检测模块将当前转速反馈到控制器中,控制器经过数字PID运算后改变PWM脉冲的占空比,实现电机转速实时控制的目的。

2.2. 数字PID控制器

模拟PID调节器的控制规律为

1u(t)Kp[e(t)TIe(t)dtTD0tde(t)]dt (2.1)

式中,KP为比例系数,TI为积分时间常数,TD为微分时间常数。 当采样周期足够小时,在模拟调节器的基础上,通过数值逼近的方法,用求和代替积分、用后向差分代替微分,使模拟PID离散化变为差分方程。这样,式(2.1)便可离散化以下差分方程:

Tu(n)KP{e(n)TI

式中

e(n)i1nTD[e(n)e(n1)]}u0T (2.2)

u0是偏差为零时的初值;

式(2.2)第一项起比例控制作用,称为比例(P)项uP(n),即

up(n)KPe(n) (2.3)

第二项起积分控制作用,称为积分(I)项uI(n)即

TuI(n)KPTIe(i)i1n (2.4)

第三项起微分控制作用,称为微分(D)项uD(n)即

uD(n)KP

TD[e(n)e(n1)]T (2.5)

式(2.2)的输出量u(n)为全量输出,它对于被控对象的执行机构每次采样时刻应达到的位置。因此,式(2.2)又称为位置型PID算式。

由(2.2)可看出,位置型控制算式不够方便,这是因为要累加偏差e(i),不仅要占用较多的存储单元,而且不便于编写程序,为此对式(2.2)进行改进。 根据式(2.2)不难看出u(n-1)的表达式,即

5

Tu(n1)KP{e(n1)TIe(n)i1n1TD[e(n1)e(n2)]}u0T (2.6)

将式(2.2)和式(2.6)相减,即得数字PID增量型控制算式为

u(n)u(n)u(n1)KP[e(n)e(n1)]KIe(n)KD[e(n)2e(n1)e(n2)] (2.7)

式中: KP称为比例增益;

KIKP

TTI称为积分系数;

KDKPTDT称为微分系数。

2.3. 凑试法整定PID参数

增大比例系数 Kp,一般将加快系统的响应,在有静差的情况下有利于减小静差。但过大的比例 系数会使系统有较大的超调,并产生振荡,使稳定性变坏。 增大积分时间 Ti 有利于减小超调,减小振荡;使系统更加稳定,但系统静差的消除将随之减慢。 增大微分时间 Td 亦有利于加快系统响应,使超调量减小,稳定性增加,但系统对扰动的抑制能 力减弱,对扰动有较敏感的响应。

在凑试时,可参考以上参数对系统控制过程的影响趋势,对参数调整实行先比例、后积分,再微分的整定步骤。

(1)首先整定比例部分,将比例系数由小变大,并观察相应的系统响应,直至得到反应快、超调小的响应曲线。如果系统没有静差或静差已经小到允许范围内,并且对响应曲线已经满意,则只需要比例调节器即可。

(2)如果在比例调节的基础上系统的静差不能满足设计要求,则必须加入积分环节。将已经调节好的比例系数略为缩小(一般缩小为原值的0.8),然后减小积分时间,使得系统在保持良好动态性能的情况下,静差得到消除。在此过程中,可根据响应曲线的好坏反复改变比例系数与积分时间,以期待得到满意的控制过程与整定参数。

(3)如果在上述调整过程中对系统的动态过程反复调整还不能得到满意的结果,则可以加入微分环节。一般的系统D =0,1或2。只有部分滞后较大的系统,D值才可能调大些。

PID参数修改后,可以适度修改设定值(人为的阶跃扰动)观察系统的跟踪响应,以判断PID参数是否合适。 P值太小,I值太小或D值太大均会引起系统超调振荡。

6

2.4. 直流电机调速与测速

调速:根据PWM控制的基本原理可知,一段时间内加在惯性负载两端的PWM脉冲与相等时间内冲量相等的直流电加在负载上的电压等效,可通过改变输出的占空比来改变电压从而改变速度。

测速:在本系统中由于要将电机本次采样的速度与上次采样的速度进行比较,通过偏差进行PID运算,因此速度采集电路是整个系统不可缺少的部分。本次设计中应用了比较常见的光电测速方法来实现,其具体做法是将电机轴上固定一圆盘,且其边缘上有N个等分凹槽如图3.5(a)所示,在圆盘的一侧固定一个发光二极管,其位置对准凹槽处,在另一侧和发光二极光平行的位置上固定一光敏三极管,如果电动机转到凹槽处时,发光二极管通过缝隙将光照射到光敏三极管上,三极管导通,反之三极管截止,电路如图3.4(b)所示,从图中可以得出电机每转一圈在P3.3的输出端就会产生N个低电平。这样就可根据低电平的数量来计算电机此时转速了。例如当电机以一定的转速运行时,P1.2将输出如图3.5所示的脉冲,若知道一段时间t内传感器输出的低脉冲数为n,则电机转速v=n/t。

发光二极管圆盘光敏三极管200Ω+5VR1R2470ΩP3.3 (a) (b)

图2.2 电机速度采集方案

三、硬件电路设计

7

3.1. 电机驱动及传感器电路

图3.1 电机驱动及传感器电路

3.2. 串口发送数据电路

图3.2 串口电路

3.3. LCD1602显示屏电路

图3.3 LCD1602显示屏电路

8

四、程序设计

4.1. PID增量式算法

本系统设计的核心算法为PID算法,它根据本次采样的数据与设定值进行比较得出偏差e(n),对偏差进行P、I、D运算最终利用运算结果控制PWM脉冲的占空比来实现对加在电机两端电压的调节[10],进而控制电机转速。其运算公式为:

UKP[e(n)e(n1)]KIe(n)KD[e(n)2e(n1)e(n2)]

4.2. 系统程序流程图

初始化包括对时钟,中断的初始化,检测完数据再进行PID调节,输出数据,显示并发送。

开始 计算e(n)

初始化 计算Ki*e(n)

计算Kp*[e(n) 检测 -e(n-1)]

PID 计算Kd[e(n) 调节 -2e(n-1)+e(n-2)]

输出显示 计算出△U 串口发送数据 得出占空比 speed=speed+△U 图4.1 系统程序流程图

en2=en1 en1=en

返回

图4.2 PID增量式算法图

9

4.3. 消除积分不灵敏的办法

在本实验,因为转速和占空比是要成正比例关系的,当比如占空比的最小单位是1/100的时候,可能一个最小单位对应的转速是(3~4)rps,那这样的话就消除不了静差,如果把最小单位改成1/400的时候,可能一个最小单位对应不了1rps,但是占空比会累加,从而使转速改变1rps。附上某个区域的对应关系如图4.3所示:

0 0 11 2 22 16 33 71 44 94 55 104

5 6 7 8 9 0 1 1 1 1 16 17 18 19 20 4 5 5 5 7 27 28 29 30 31 44 49 55 60 64 38 39 40 41 42 85 87 89 90 91 49 50 51 52 53 99 100 101 102 102 图4.3

红色代表占空比,比如1代表1/400占空比,白色代表转速,黄色代表线性关系的转速。

1 0 12 2 23 22 34 75 45 95 56 104 2 0 13 3 24 27 35 78 46 97 3 0 14 3 25 33 36 80 47 98 4 0 15 4 26 39 37 82 48 99 10 2 21 11 32 67 43 93 54 103

4.4. 抗积分饱和的办法

如果执行机构机构已到达极限位置,仍然不能消除偏差时,由于积分作用,尽管计算PID差分方程式所得的运算结果继续增大或者减小,但执行机构已无相应动作,这就是积分饱和。当出现积分饱和时,势必使超调量增加,控制品质变坏。作为防止积分饱和的办法之一,可对计算出的控制量u(k)限幅,同时把积分作用切除掉。程序体现:

if(speed>400)speed=400; if(speed<0) speed=0;

10

五、调试过程

5.1. 只有比例环节

Kp=1.8,超调量为3%,调节时间为4s, 峰值时间为3s

只有比例环节,Kp=2.5,超调量为4%,调节时间为14s, 峰值时间为3s

只有比例环节,Kp=3.0,波形振荡

11

在此只举例三个图,其实作者测过很多种Kp了,根据上面三个图:选择Kp=1.8;

5.2. 加入积分环节

PI:T=1;Kp=1.8;Ti=1.8;

出现此现象原因:

在一般的PID控制中,当有较大的扰动或大幅度改变给定值是,由于此时有较大的偏差,以及系统有惯性和滞后,故在积分项的作用下,往往会产生较大的超调和长时间的波动。为此,我采用积分分离措施,即偏差e(k)较大时,取消积分作用;当偏差e(k)较小时才将积分作用投入;

程序有:

en=set-count; if(en>=5&&en<=-5)

{Un=Kp*(en-en1)+Ki*en;} else Un=Kp*en;

5.3. 加入积分分离

12

按Ti从大往小调情况有: T=1;Kp=1.8;Ti=8.0;

T=1;Kp=1.8;Ti=1.8;

超调量3%,3s内达到稳定值,波形与只有比例环节的图形有明显的改善

只有比例环节,与上图进行比较

13

5.4. 加入微分环节

系统只有比例和积分环节PI,当改变期望值时,通过下图可看出过度波动很大,对系统不利。

T=1;Kp=1.8;Ti=1.8;

为此采取积分环节

Td按从小调到大的规则进行寻找合适值 T=1;Kp=1.8;Ti=1.8;Td=1;

【改变调速时,用了6s时间达到稳定,过度波动还是很大】

14

T=1;Kp=1.8;Ti=1.8;Td=1.8;【改变调速时,用5s时间达到稳定,波动明显变小】

T=1;Kp=1.8;Ti=1.8;Td=2.5;【用1s时间达到稳定,过度无波动,完全符合要求】

15

六、设计心得

为时两周时间的课程设计,不但让我对计算机控制技术有了更深的理解,而且熟悉了数字PID的编程办法,在做的过程中遇到的问题很多。比如一开始选PID参数整定办法时我们是用了扩充临界比例度法,但是在调试过程始终达不到理想效果,后来发现是我们采样周期太大的问题,远大于系统纯滞后时间,但是我们改变采样周期后,显示和采样效果均不理想,为此我们决定采用凑试法整定PID参数,在调试过程中,发现效果很明显,先只采用比例环节,待达到理想效果之后保持Kp值不变,继续加入积分环节,但是问题出现了,加入积分环节不但不能消除静差,反而使系统发生了较大超调和长时间的波动,为此我们查找了相关书籍,得出的结论是在一般的PID控制中,当有较大的扰动或大幅度改变给定值是,由于此时有较大的偏差,以及系统有惯性和滞后,故在积分项的作用下,往往会产生较大的超调和长时间的波动。为此我们采用了积分分离的办法,但达到设定误差时才启用积分环节,调试之后效果非常理想。接着再加入微分环节,此环节比较顺利,安照书上办法把Td值从小变到大从而找到合适值,从而使系统在期望值改变的时候不会出现超调或者波动,能实现平缓过渡。至此我们成功设计了直流电机调速系统,对学到知识感动非常开心与满足。

七、参考文献

[1] 于海生. 计算机控制技术. 北京:机械工业出版社

[2] 郭天祥. 新概念51单片机C语言教程. 电子工业出版社 [3] 凑试法整定PID参数.

[4] ULN2003A数据手册[DB/OL]. http://www.docin.com/p-33818289.html.

16

八、附录(源程序)

#include #include

//LCD//

sbit RS=P2^6; sbit RW=P2^5; sbit EN=P2^7;

sbit key=P2^0; sbit key1=P2^1; sbit key2=P2^2; sbit key3=P2^3;

//motor//

unsigned int tt0; unsigned int tt1; sbit A1=P1^2; sbit A2=P1^3;

unsigned char flag; //抽样时间 unsigned int speed=41; unsigned int a;

unsigned char receive;

unsigned int ReData,sum=0,summ=0; //pid

float Kp,Ki,Kd,Ti,Td,T; //

unsigned int set=100; int en,en1,en2,enx; double Un;

void delay(unsigned int xms) {

unsigned i, j;

for(i = xms; i >0; i--)

17

for(j = 110; j >0; j--); }

bit test_busy() { bit result; P0=0xff; RS=0; RW=1; delay(1); EN=1; delay(1); result=(bit)(P0&0x80); EN=0; return result; }

void write_command(unsigned char command) { while(test_busy()); RS=0; RW=0; P0=command; delay(1); EN=1; delay(1); EN=0; }

void write_date(unsigned char date) { while(test_busy()); RS=1; RW=0; P0=date; delay(1); EN=1; delay(1); EN=0; }

void write_string(unsigned char *s)

//写命令//写数据18

{ while (*s) {

write_date(*s); s++; } }

void lcd_initial() //LCD初始化 { RS=1; RW=1; EN=0; write_command(0x38); //设置16X2显示,5X7点阵,8位数据接口 delay(1); write_command(0x01); //显示清零,数据指针清零 delay(1); write_command(0x0c); //设置开显示,不显示光标 delay(1); write_command(0x06); //写一个字符后地址指针加1 }

void keyscan() { if(key==0) { delay(10); if(key==0) { set=set+1; if(set>=138)set=138; while(!key); receive=1; } } if(key1==0) { delay(10); if(key1==0) { set=set-1;

19

if(set<=90)set=90; while(!key1); receive=1; } } }

void keyspeed() { if(key2==0) { delay(10); if(key2==0) { speed=speed+1; while(!key2); } } if(key3==0) { delay(10); if(key3==0) { speed=speed-1; while(!key3); } } }

void init() { TMOD=0x23; SCON=0x50; PCON|=0x80; T2CON=0x02; TH0=(256-100); TL0=(256-250); TH1=243; TL1=243;

//0010_0011 定时器0:模式3 定时器1:模式2 //0101_0000 串行口方式1 10位UART 波特率可变 //SMOD=1 串行口波特率加倍 //计数器2 仅当定时器溢出时捕获和重装 //驱动电机 //定时0.00025s //256-2^1*11.0592/(384*9600) 波特率为9600 20

TH2=0; TL2=0; TR0=1; //启动定时器 TR1=1; TR2=1; ET0=1; //允许T0中断 ET1=1; ET2=1; ES=1; //串行口中断位 EA=1; //中断允许位 }

//************************************************************************ void t_0() interrupt 1 //定时100ms(抽样时间) {

// unsigned char num; TL0=(256-250); tt0++; if(tt0==400) { tt0=0; // num++; flag=1; } }

//************************************************************************ void t_1() interrupt 3 //驱动电机 PWM speed*发生一次中断时间=低电平,(100-speed)*中断时间=高电平 { TH0=(256-100); tt1++; if(tt1>=400) tt1=0; if(tt121

A2=0; } }

/********************基本用不到,防止溢出而已****************************/ void t_2() interrupt 5 //计数器 { TH2=0; TL2=0; TF2=0; }

/*********PID******************************************************/ void pid(unsigned int count) //增量式 { en=set-count; //Un=q0*en; // -q1*en1+q2*en2 if(en>=5&&en<=-5)

{Un=Kp*(en-en1)+Ki*en +Kd*(en-2*en1+en2);} // else Un=Kp*en; speed=speed+Un; if(speed>400)speed=400; if(speed<0) speed=0; en2=en1; en1=en; }

//************************************************************************ void main() { T=1; Kp=1.8; Ti=1.8; Td=2.5;

Ki=Kp*T/Ti;

22

Kd=Kp*Td;

keyscan(); lcd_initial();

write_string(\"INT: rps %\");

write_command(0x80+0x40); //第二行 write_string(\"VALS: rps\"); write_command(0x80+6); // write_date(set/100+0x30); //设置的数据 // write_date(set%100/10+0x30); // write_date(set%10+0x30);

init(); while(1) {

keyscan(); keyspeed(); if(receive) { receive=0; write_command(0x80+6); write_date(set/100+0x30); write_date(set%100/10+0x30); write_date(set%10+0x30); } if(flag)//100ms { unsigned char ge,shi,bai,num; flag=0; a=(TH2*256+TL2); //rps TH2=0; TL2=0; num++; sum=sum+a; //累加10次达到一秒 if(num==10) { summ=sum; num=0; sum=0;

summ=summ/448;

23

bai=summ/100;

shi=(summ%100)/10; ge=summ%10;

}

}

}

write_command(0x80+0x40+6); write_date(bai+0x30); write_date(shi+0x30);

write_date(ge+0x30); TI=1;

printf(\"%d\

while(!TI);

TI=0; delay(10);

pid(summ);

write_command(0x80+12); write_date(speed%1000/100+0x30); write_date(speed%100/10+0x30); write_date(speed%10+0x30); 24

}

因篇幅问题不能全部显示,请点此查看更多更全内容