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

更新时间:2023-10-03 05:07:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于89c52单片机的PWM直流电机PID控制调速系

统 实验报告

指导老师:衣法臻 姓名:杨浩 学号:09212020 班级:自动化0901

日期:2012年7月6日星期五

1

目录

第一章系统方案设计 ................................................................................................................ 3 1.1 1.2 1.3 1.4 1.5

直流电机转速开环控制与闭环控制的选取 ............................................................. 3 直流电机调速方式的选取 ......................................................................................... 4 直流电机测速装置的选取 ......................................................................................... 5 系统控制算法的选取 ................................................................................................. 8 系统总体设计 ........................................................................................................... 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.1各部分传递函数的整定 ................................................................................................ 31 4.2 PID参数的整定 ........................................................................................................ 31 第五章结果分析 ...................................................................................................................... 33 第六章实验总结及感想 .......................................................................................................... 34 参考文献 .................................................................................................................................. 36 附录一硬件系统电路原理图 .................................................................................................. 36 附录二程序源代码 .................................................................................................................. 36

2

第一章、 系统总体方案设计

1.1

直流电机转速开环控制与闭环控制的选取

对直流电机转速的控制有一般有两种方式,一种是开环控制,一种是闭环控制。开环控制的优点是简单、稳定、可靠。若组成系统的元件特性和参数值比较稳定,且外界干扰较小,开环控制能够保持一定的精度。缺点是精度通常较低,无自动纠偏能力;闭环控制的优点是控制的精度可以达到很高,而且对外界的干扰和系统的参数变化有很好的抑制作用,且可以通过输出反馈控制系统的控制过程。缺点是存在稳定性,振荡,超调等一系列问题,对系统的性能分析和设计远比开环控制麻烦。

经过利弊的取舍,本次试验选择的是闭环控制,因为准备应用PID算法控制电机的转速,故而需要有实际转速进行反馈与给定的转速形成对比,进而通过算法输出PWM波形来控制直流电机。

既然选择了直流电机转速闭环控制,可根据反馈机制大概做出其控制模型。

R(t)+ e(t) PID算法 输出PWM 直流电机 c(t) —

测速装置 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

Ea= Ceфn=Ke n可知

1.电刷两端的感应电势与电机的转速成正比。

2.直流发电机能够把转速信号换成电势信号,从而用来测速。 自动控制系统对测速发动机的要求为:1.输出电压与转速的关系曲线为线性。2.输出特性的斜率要大。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) dTe(n)?e(n?1)Tnn?

t0e(t)dt ?e(i)T?T?e(i) i?0i?08

1.4.2 数字PID控制器的差分方程

??TTnu(n)?KP?e(n)??e(i)?D?e(n)?e(n?1)???u0 TIi?0T???uP(n)?uI(n)?uD(n)?u0式中 uP(n)?KPe(n) 称为比例项

TuI(n)?KPTI?e(i) 称为积分项

i?0nuD(n)?KPTD?e(n)?e(n?1)? 称为微分项 T1.4.3 常用的控制方式

1、P控制 u(n)?uP(n)?u0 2、PI控制 u(n)?uP(n)?uI(n)?u0 3、PD控制 u(n)?uP(n)?uD(n)?u0 4、PID控制 u(n)?uP(n)?uI(n)?uD(n)?u0

1.4.4 PID算法的两种类型

1、位置型控制――例如图5-1-5调节阀控制

?Tu(n)?KP?e(n)?TI??e(i)?i?0n?TD?e(n)?e(n?1)???u0 T?2、增量型控制――例如图5-1-6步进电机控制

?u(n)?u(n)?u(n?1)?KP?e(n)?e(n?1)??KP TTe(n)?KPD?e(n)?2e(n?1)?e(n?2)?TIT9

由于控制的是直流电机,当执行机构采用控制直流电机的直流PWM装置和晶闸管整流装置时,可以采用数字PID位置型控制算法;当执行结构采用步进电机,每个采样周期控制输出的控制量时,是相对于上次控制量的增加,故此时要采用数字PID增量型控制算法。

由于此实验控制的是直流电机,故而采用数字PID位置型控制算法。

数字PID控制器主要参数是Kp,τi,τ和采样周期Ts。系统

D

的设计任务是选取合适的PID控制器参数使整个系统具有满意的动态特性,并满足稳态误差要求。具体的参数选取要靠matlab仿真,仿真结果见下文matlab篇。 1.5 系统总体设计

用AT89C52单片机作为控制核心;用uln2003驱动电机转动,用pwm波来控制此芯片间接控制电机转速;用光电编码器测速进行反馈;用复位开关进行电机给定速度的调节,由加速键,减速键和清零键构成。如图:

10

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的程序流程图分别如下:

19

START 单片机初始化 是否有键按下 N Y AddSpeed按下时,一下加50 Stop按下时,要求数显管清零 SubSpeed按下时,一下减50 数显管A显示 给定转速

程序为:

void SegRefre() //数码管显示刷新 {

Data_Buffer[0] = SpeedSet/1000; Data_Buffer[1] = SpeedSet00/100; Data_Buffer[2] = SpeedSet0/10;

20

START 初始化 测速模块 转速/1s刷新一次 数显管B显示实际转速

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

Data_Buffer[3] = SpeedSet; Data_Buffer[4] = num/1000; Data_Buffer[5] = num00/100; Data_Buffer[6] = num0/10; Data_Buffer[7] = num; }

3.2 外部中断p3.3计数程序(void exter0() interrupt 0)

此外部中断主要用于对测速产生的脉冲进行计数。程序流程图为:

程序如下:

void exter0() interrupt 0 //外部中断脉冲计数 { Inpluse++; }

21

测转速脉冲输入 脉冲计数 返回

3.3 定时器0中断软件设计(void timer0() interrupt 1)

定时器0中断主要用于数显管显示数值和一定时间间隔内对转速进行采样计算PID控制,初始化中断时间设置为2ms。 程序流程图为:

计算转速并PID控制 1s计时标志位 计时器初始化 START 数显管显示,送段,位码 N Y

程序如下:

void timer0() interrupt 1 {

static unsigned char Bit = 0; //静态变量,退出程序后,值保留

22

返回 static unsigned int time = 0; static unsigned intaa = 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;

Inpluse = 0; }

24

num = Inpluse*10; //计算转速

PIDControl();// 1s 控制一次

}

3.4 PWM算法程序设计(void PWMOUT())

Pwm是通过PID计算出来的偏差来调整输出脉冲的宽度还控制电机的转速的。 程序流程图如下:

程序如下:

void PWMOUT() {

START N PWM脉宽

if ( cnt

PWM_FC = 0 ; } else {

PWM_FC = 1 ; }

if ( cnt> 250) cnt = 0 ; }

3.5 PID控制算法程序设计(void PIDControl())

当电机转速的设定值突然改变,或电机的转速发生突变时,会引起偏差的阶跃,使e增大,PID的输出uk将急剧增加或减小,以至于超过控制量的上下限,电机的转速SPEEDSET虽然不断上升,但由于控制量受到限制,其增长的速度减慢,偏差E将比正常情况下持续更长的时间保持在较大的偏差值,该程序主要是把设定的转速减当前测量得到的转速来计算偏差,从而用PWM输出方式来确定输出脉冲的宽度。

程序流程图如下:

26

给定pid参数计算duk START 求偏差值e 计算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) { uinti = 0,j = 0; for(i = x ; i> 0 ; i--) }

3.6 按键程序设计

由于按键与数显管的显示相关,故其程序流程图已给,下面只给其算法如下:

void SetSpeed() //按键速度设定 {

if ( AddSpeed==0) {

delay(20) ;

//有键按下

for(j = 50 ; j > 0 ; j--) ;

if(AddSpeed==0) {

SpeedSet=SpeedSet+50 ;

if(SpeedSet>9999)

{ 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

我的参考文献很少,自己买的其中一本书就是很著名的郭天祥老师书叫《51单片机c语言教程》外加全套开发板,另外图书馆里的单片机书基本上都翻过。电机部分参考自控原理书里的电机传递函数。还有keil教程和proteus教程

附录一硬件系统电路原理图

附录二:程序源代码

#include

#define uchar unsigned char #define uintunsigned int #define THCO 0xf8

#define TLCO 0x30 //2ms

uchar code Duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管,0-9段码表

ucharData_Buffer[8]={0,0,0,0,0,0,0,0};//数码管显示数值,数组变量定义

36

uchar Data[4]={0,0,0,0}; ucharArry[4]={0,0,0,0}; bit flag1 = 0 ; bit flag0 = 0; unsigned char i = 0 ; sbitAddSpeed=P1^1; sbitSubSpeed=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;

signedintSpeedSet=500; uintcnt=0;

uintInpluse=0,num=0; //脉冲计数单元 uintPWMTime=0;//脉冲宽度 voidPIDControl(); voidSystemInit();

void delay(uchar x); void PWMOUT(); voidSetSpeed(); voidSegRefre(); 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) {

uinti = 0,j = 0; for(i = x ; i> 0 ; i--) for(j = 50 ; j > 0 ; j--) ; }

void PWMOUT() //PWm输出 {

if ( cnt

PWM_FC = 0 ; } else { PWM_FC = 1 ; }

if ( cnt> 250) cnt = 0 ; }

voidSystemInit() {

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(SpeedSet>9999) { 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] = SpeedSet00/100; Data_Buffer[2] = SpeedSet0/10; Data_Buffer[3] = SpeedSet; Data_Buffer[4] = num/1000; Data_Buffer[5] = num00/100; Data_Buffer[6] = num0/10; Data_Buffer[7] = num; }

void exter0() interrupt 0 //外部中断脉冲计数 {

Inpluse++; }

void timer0() interrupt 1 {

static unsigned char Bit = 0; //静态变量,退出程序后,值保留 static unsigned int time = 0; static unsigned intaa = 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

本文来源:https://www.bwwdw.com/article/9hod.html

Top