直流电机PID控制.docx

上传人:b****8 文档编号:27835691 上传时间:2023-07-05 格式:DOCX 页数:51 大小:759.48KB
下载 相关 举报
直流电机PID控制.docx_第1页
第1页 / 共51页
直流电机PID控制.docx_第2页
第2页 / 共51页
直流电机PID控制.docx_第3页
第3页 / 共51页
直流电机PID控制.docx_第4页
第4页 / 共51页
直流电机PID控制.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

直流电机PID控制.docx

《直流电机PID控制.docx》由会员分享,可在线阅读,更多相关《直流电机PID控制.docx(51页珍藏版)》请在冰豆网上搜索。

直流电机PID控制.docx

直流电机PID控制

1.设计题目1

2.设计内容1

3.方案总体设计与论证1

4.硬件电路设计2

4.1最小系统设计2

4.2传感器模块2

4.3负载模块3

4.4键盘模块4

4.5显示模块4

5.软件设计5

5.1主函数部分5

5.2中断部分6

5.3显示刷新部分6

5.4按键扫描部分7

5.5按键功能实现部分8

5.6更新输出控制信号部分9

5.7PID控制部分10

5.8LCD显示部分11

5.9延时部分11

6.系统调试12

7.结束语12

8.参考文献12

附录一系统硬件原理图13

附录二源程序代码14

摘要

本文章介绍了由51单片机以及直流电机、三极管驱动电路、矩阵键盘、LCD和红外

传感器构成的转速闭环控制系统。

其中红外传感器负责对电机转速进行测量,并将测量的结果反馈给控制中心,并由控制中心将之与设定值进行比较得到偏差,再由偏差产生直接控制作用去消除偏差。

文章不但介绍了基于单片机的转速控制系统的软件设计,还涉及了硬件设计方法。

文中介绍系统不但可以实现手动控制,还有无人值守,自动调速功能。

关键词直流电机闭环控制单片机矩阵键盘LCD

课程设计任务书

设计题目:

基于单片机的转速控制系统设计

学生姓名

课程名称

智能义器义表设计与调试

专业班级

测控

地点

实验楼I512

起止时间

2010.6.21至2010.7.2

设计内容及要求

要求设计的转速控制系统完成以下功能:

1.基本功能

1按键设定并显示转速,实时显示实际转速

2按键控制电机起停、正反转

3PWM转速闭环控制。

2.扩展功能

实现与PC机的通讯:

将转速的设定值和实测值发送到PC机显示,PC机可

以设定速度,发送到单片机

设计参数

1.转速调节范围:

1500转/分--3000转/分

2.测速误差<10%

进度要求

1.布置任务、方案设计,硬件设计(1天)

2.画电路图(1天)

3.软件设计,画流程图(1天)

4.程序设计和调试(6天)

5.设计验收、撰写报告(1天)详见进度安排表

参考资料

1.程德福•智能义器.机械工业出版社.2009.9

2.胡文金.单片机系统实训教程.重庆:

重庆大学出版社,2005

3.林金阳.基于MC51单片机的直流电机PWM调速系统.长春工程学院学报(自然科学版)2009年第10卷第3期

丿、

1.本表应在母次头施前一周由负责教师填与一份,院系审批后交院系办备案,一份由负责教师留用。

2.若填写内容较多可另纸附后。

3.一题多名学生共用的,在设计

内容、参数、要求等方面应有所区别。

指导教师:

教研室主任:

基于单片机的转速控制系统设计

1•设计题目

基于单片机的转速控制系统设计

2•设计内容

设计的转速控制系统完成以下功能:

a)基本功能

1按键设定并显示转速,实时显示实际转速

2按键控制电机起停、正反转

3PWM转速闭环控制。

b)扩展功能

实现与PC机的通讯:

将转速的设定值和实测值发送到PC机显示,PC机可以设定速度,发送到单片机

3•方案总体设计与论证

图1是基于单片机的转速控制系统的基本组成方框。

主要由测速传感器(红外对管),电机及驱动电路,矩阵键盘,LCD(12864),单片机(80C51)组成。

测速传感器是把电机转速转换成相应的脉冲量的器件,并将该脉冲送给单片机计数。

测速传感器输出脉冲的频率随电机转速的快慢变化而变化。

单片机8051是该系统的核心部分,一方面负责

计算电机的转速,另一方面将计算得到的转速与设定转速相比较,经过计算处理,得到相应的控制信号(PWM),并用该信号控制电机转速。

通过键盘可以设定手动工作模式(通过操作人员修改输出方波占空比实现)或者自动工作模式(由操作人员输入设定转速,单片机自动控制电机转速,使其接近设定值),输入输出方波占空比以及设定转速。

由单片机检测哪一个按键按下,实现占空比或者设定值的修改,并通过LCD实时显示设定值以及测得转速。

由上图可知系统硬件基本上由传感器模块,负载模块,键盘模块,显示模块组成。

而软件设计是紧紧围绕系统的硬件结构展开的,软件主要是配合控制硬件完成预期的设计要求,软件的基本模块也是针对上述硬件结构进行相应操作的。

下面具体阐述系统各功能模块的设计。

4•硬件电路设计

4.1最小系统设计

本次设计中的最小系统模块中包括CPU复位电路和晶振,其最小系统原理图如图

4.1所示。

Y1

C3

VCC

R

RES2

C1

CAP

S0

SWSPST

C2-

CAP

\P11

2

\P12

3

p13

4

\P14

5

\P15

6

\P16

7

\P17

8

\P33

13o

\P32

12o

\P35

15

\P34

14

\Vcc

31

AL

X1

19

1

RYST

X218

RD

ALE/P

WR

PSEN

U5

RESET9

8051AH

\P3717七

\P3616o

39P00/

38P01y

37P02丿

36P03y

35P04/

34P05y

33P06/

32P07y

21P20/

22P21/

23P22/

24P23y

25P247

26P25y

27P26/

28P27>

R2

RES2

10P30y

11P31/

30ALE/29PSEN

图4.1最小系统原理图

4.2传感器模块

本次设计中测速传感器选用红外对管,其有一个红外发射管一个红外接收管。

发射管和接收管位于同一平面,当其发射出的红外遇到风扇的叶片时,红外接收管接收到反射回来的信号,输出一个脉冲,该脉冲作用于单片机的P32引脚,在单片机的外部中断

0中进行计数。

其硬件图如图4.2所示。

4.4键盘模块

34

本次设计中采用的4*4的非编码键盘。

矩阵式非编码键盘的电路原理图如图4.4所

示。

当没有键按下时,行线和列线之间是不相连。

若第N行第M列的键被按下,那么第

N行与第M列的线就被接通。

如果在行线上加上信号,根据列线的状态,便可得知是否有键按下。

如果在行线上逐行加上一个扫描信号(本实验中用的低电平),就可以判断

按键的位置。

常用的按键识别有两种方法:

一种是传统的行扫描法;另一种是速度较快的线反转法。

本实验中采用的是线反转法进行识键。

S2

P00

P01

P02

S5

S8

S9

S11

S12

P07

P06

P05

P04

P03

 

图4.4键盘模块硬件原理图

4.5显示模块

本设计采用ST7920控制器的LCD液晶显示器,其具有低电压,字迹清晰、能够显示汉字和字符等特点,且编程方便,易于查看、修改。

本实验中主要用到了VSSVDDRSRWCS引脚。

ST7920液晶显示器与MCI接口电路原理图如图4.5所示。

R4

Ai

■l

10K

P

0

9

8

7

6

5

4

3

2

1

VCC

U2

SSV

SRWRSCOBD1BD2BD3BD4BD5BD6BD7BD

 

图4.5显示模块硬件原理图

5•软件设计

5.1主函数部分

该函数首先初始化定时器0和外部中断0,然后判断启动键是否按下,如果按下则控制LCD显示数据,如果启动键没有按下,则继续等待。

程序执行过程中,主要通过循环扫描各标志位,如果设定速度、工作模式或者电机实时转速有所改动,就刷新LCD显示。

如果按键扫描标志位允许进行按键扫描即进行按键扫描。

如果有按键按下就进行相应的按键指定功能实现。

主函数流程图如图5.1所示

5.2中断部分

本次设计中主要用到了定时器0和外部中断0。

中断部分的流程图如图5.2所示定时器主要用于控制PWM输出以及控制按键扫描函数的启动,采样周期,控制周期等和时间密切相关的函数。

外部中断主要用于数脉冲输入的个数。

由定时器控制取值并清零的时间。

在一定的时间内采集到和电机转速相关的脉冲数,就可以计算出电机的转速。

入口

脉冲数加一

返回

图5.2中断流程图

5.3显示刷新部分

该函数主要通过判断测得转速是否允许更新,来更新测得转速。

判断设定速度、占空比、是否发生变化,如果有变化则更新,如无变化则不更新。

其流程图如图5.3所示

图5.3显示函数流程图刷新

5.4按键扫描部分

主函数通过判断一个按键扫描标志位来判断是否进行按键扫描。

该标志位在定时器0中进行更改,当定时时间达到100ms该标志位被置一。

主函数在检测到该标志位为一时调用按键扫描函数,进行按键扫描。

在执行按键扫描后,该标志位被清零。

按键扫描函数流程图如图5.4所示。

图5.4按键扫描函数流程图

5.5按键功能实现部分

该函数被主函数调用,以实现其功能。

该函数首要任务是判定到底是哪个按键按下,

然后实现对应功能。

如果是11号键按下,则工作模式设定为自动模式,可以通过0~9

的数字键来更改设定速度,由单片机通过PID算法来控制电机转速接近设定值。

如果是12号键按下,则工作模式设定为手动模式,可以通过0~9的数字键来更改占空比直接控制电机转速。

其流程图如图5.5所示。

图5.5按键功能实现函数流程图

5.6更新输出控制信号部分

如果控制时间到,定时器置一控制标志位。

当主函数检测到该标志位为一,将调用更新输出控制信号函数,并清零标志位。

该函数一经调用便要判断工作模式为自动模式还是手动模式。

如果工作模式为手动模式,便计算之前输入占空比,并判断是否在规定的范围内。

如果不在规定范围内,则强制转化为最大输出或最小输出。

如果工作模式为自动模式,则判断设定值和测得值的差值是否大于设定死区。

如果差值在死区范围内,则输出上次控制量;如果差值超出了死区范围,则调用PID算法,计算输出控制量并判断控制量是否在允许范围内。

如果不在,则输出最值,如果在该范围内,则直接输出计算得到的控制量。

其流程图如图5.6所示。

5.7PID控制部分

当控制时间到后,定时器置一控制标志位,由更新输出控制信号调用该函数。

如果

设定值和测得值的差值大于死区值,更新输出控制信号函数便调用该函数来改变输出控

制量。

如果差值在死区范围内,则不调用,保持上次输出控制信号不变。

该PID控制算

法为增量型PID控制算法,增量型PID算法有计算量减小,计算速度快等优点。

该算法用到的参数为经验参数,是通过大量的实验数据不停地修改得到。

其流程图如图5.7所

示。

图5.7PID控制算法流程图

5.8LCD显示部分

该函数主要为各显示函数调用。

其工作流程为先向LCD发送控制命令,再传送待显

数据,最后刷新屏幕。

其流程图如图5.8所示。

5.9延时部分

该函数主要被LCD显示函数调用。

该函数所延时为不确定时间值。

因为该函数的延时是通过一个空的for循环实现的。

其流程图如图5.9所示。

6.系统调试

在该系统的构想之初有不少困惑。

主要是在定时器个数的选择以及关于PID算法。

最后还是决定用1个定时器。

在调试过程中遇到了不少小小的麻烦。

比如在按键调试的时候,就遇到了按键没反应的问题,后来修改程序后,按键有反应了,但新的问题又出来了。

主要是按键不好使,要么按下没反应,要么按下太久,系统把一次按键动作当成了几次。

后来在按键扫描函数中加入了等待按键弹起的语句,解决了按键的灵敏问题。

在调制PWM波形的时候发现电机的转速并不随输出的控制信号的改变而变化。

用示波器观察输出波形,发现输出波形并不规则。

理论上应该是输出一个一定占空比的方波啊。

经过一段时间的测试,发现信号输出引脚给出了高低电平,但示波器检测出来的信号看上去并不像给了高低电平啊,就像一个脉冲干扰。

突然来个尖脉冲,然后很快衰减。

后来缩短定时器的中断时候后,该问题得到解决,输出波形正常。

输出波形正常后再测试电机转速,电机转速仍然不正常。

后来才发现原来是实验箱的问题。

实验箱中用于测量电机转速的霍尔传感器和电机的供电电源是一个,这就意味着当输出控制信号让电机

停止转动的同时霍尔传感器也停止工作了。

后来用红外对管传感器对转速进行测试,问题得到解决。

在编写PID算法的时候,发现占空比变化剧烈,要么是0,要么就是100,总是在两个极值上变化。

修改PID参数后问题没有得到很好解决,后来才发是因为现变量的类型给定义错了。

修改后,问题得到解决。

在PID的调试过程中还遇到不少小问题,在此就不一一累述了。

在编写完了后,发现程序并没按预定的程式那样运行,后来才发现是定时器中代码太长的原因。

后来只在定时器中保留PWM波形调制部分将一些按键扫描之类的函数都拿到主函数中,在定时器中设立标志位。

在主函数中通过判断标志位来选择调用子函数,该问题得到了解决。

7•结束语

这次课程设计结束在即,在此感谢重庆科技学院给我们提供了一个锻炼的机会,给我们提供场所和设备。

感谢钟秉翔老师和张义辉老师不辞辛苦给我们提供解决问题的思路和方向。

在此次课程设计中我也得到了很好的锻炼,不单在硬件软件方面的能力,而且在独立思考,解决问题,探索解决问题的方向方面的能力得到了提高。

8•参考文献

[1]赵新民•智能仪器设计基础•哈尔滨:

哈尔滨工业大学出版社,2009

[2]程德福•智能仪器.北京:

机械工业出版社,2009.9

[3]张毅刚•单片机原理及接口技术[M]•哈尔滨:

哈尔滨工业大学出版社,2007.

[4]胡文金•单片机应用技术实训教程•重庆:

重庆大学出版社,2005

⑸梁森.自动检测技术及应用•北京:

机械工业出版社,2009

 

附录一系统硬件原理图

C1

CAP

C2

CAP

VCC

CAP

R

丄Y1

RES2

U5

P1

2

P1

3

P1

6

P1

7

T1

TO

yST

X

1

X

2

RESET9

R

P1

P1

P1

P1

INT1

INT0

0

1

4

5

RDWR

717

616

X1

X2

19

18

P1

1

2

P1

2

3

P1

3

4

Pl

4

5

P1

5

6

P1

6

7~

P1

7

8

P3

3

13

P3

2

12d

P3

5

15

P3

4

14

V

CC

31

EA/VP

ESET

8051AH

RES2

P0

P0

P0

P0

P0

P0

P0

P0

P2

P2

RXD

TXD

ALE/P

39P00/

35P04

38P01

36P03

37P02

32P07

3405

33P06

P2

2

P2

3

P2

4

P2

5

P2

6

28P27

P2

7

24P23

25P24

21P20

2/P26

22P21

23P22

11

P3

1

30

ALE

29

PS

EN

a

J

10P30

PSEN

VCC

P0

6

P0

5

P0

4

U902

C10

C

1+

V

+

3

C

1-

6

V

7

C6

T20

R2INR2OUT

104

104_

C

C

2+

2-

1042

C71

C84

1045

T1

VCC

GND

MAX232

16

14

1TTXD

13

RRX

12

RXD

11

TXD

10

9

15

OUT

T1IN

UTT2IN

D

R1IN

R1OUT

5

J1

9

o

4

q

8

RRXD3

7

TTXD2

q

6

o

1

DB9

15u

G1

OTORSERVO

KLB

OBD1BD2BD3BD4BD5BD6BD7BD⑥审AaLB

wR

0DS

VV

■4

Q1

〉NP

P13

U2

LCD

6

ES2

Q2

NPN

 

 

附录二源程序代码

while

(1)

{

rekey=keyscan();

主函数

*******************

**/

#include"reg51.h"

#include"display.h"

#include"keyscan.h"

#include"pid.h"

if(rekey==16)break;

}

#defineTHCOOxfc

#defineTLCO0x17

unsignedchar

//1ms

DispHanzi(0,0,8,"

行0列显示汉字

DispHanzi(1,0,4,"

DispHanzi(2,0,4,"

DispHanzi(3,0,3,"

电机实时控制系统

设定转速");

测得转速");

占空比");

");//第1

reflag=0,pwmflag=0,setflag=0,autoflag=1,ctrlflag=0,scanflag=1;

unsignedcharrekey=0,setnum[8]={'

',51,53,48,48,'r','/','m'},zkb[3]={48,49,48,};

DispZimu(1,4,8,setnum);

DispZimu(2,4,8,received);

DispZimu(3,4,3,zkb);

unsignedcharreceived[8]={'

',48,48,48,48,'r',7','m'},g=0,s=0,b=5,q=3,zg=0.

while

(1)

zs=0,zb=1;

unsignedcharm=0,n=0,mode=0;

unsignedintsetval=0;

intpwm=40;

intsspeed=3500,accept,speed[4];

unsignedintnumber=0;

sbitpwmout=P1A3;

voiddisplay();

voidkey_func();

voidpwm_ctrl();

voidmain()

{

TMOD=0x11;

TH0=THC0;

TL0=TLC0;

TR0=1;

ET0=1;

EX0=1;

IT0=1;

EA=1;//

lnitLCD();

//定时器0初始化

//外部中断0初始化

开启总中断

{

if(mode==1)

{

DispHanzi(3,6,2,"手动");

autoflag=0;

}

else

{

DispHanzi(3,6,2,"自动");

autoflag=1;

}

display();

if(scanflag==1)

{

rekey=keyscan();

scanflag=0;

}

key_func();

if(ctrlflag==1)

{

pwm_ctrl();

ctrlflag=0;

}

}

 

a=0;

}

voiddisplay()

{

if(reflag==1)

{

accept=number*15;

received[1]=accept/1000+0x30;

received[2]=accept%1000/100+0x30;

received[3]=accept%100/10+0x30;

received[4]=accept%10+0x30;

reflag=0;

DispZimu(2,4,8,received);

number=0;

}

if(pwmflag==1||autoflag==1)

{

zkb[0]=pwm/100+0x30;

zkb[1]=pwm/10%10+0x30;

zkb[2]=pwm%10+0x30;

pwmflag=0;

DispZimu(3,4,3,zkb);

}

if(setflag==1)

{

sspeed=q*1000+b*100+s*10+g;

DispZimu(1,4,8,setnum);

setflag=0;

}

}

voidkey_func()

{

if(rekey!

=0)

{

if(rekey==11)

mode=0;

if(rekey==12)

mode=1;

#include"reg51.h"

#include"delay.h"

voidsend_command(unsignedchar

command_data);//发送命令

voidsend_data(unsignedcharcommand_data);

//发送数据

voidInitLCD(void);//液晶初始化

voidDispHanzi(unsignedcharx,unsignedchar

y,unsignedcharhow,unsignedchar*stri);//汉字

显示

voidDispZimu(unsignedcharx,unsignedchar

y,unsignedcharhow,unsignedchar*stri);//字母

数字都可以显示

sbitCS=P1A0;//液晶接口

sbitSID=P1A1;

if(rekey>=1&&rekey<=10)

{

if(mode==0)

{

if(n<3)

n++;

else

n=0;

switch(n)

{

case

1:

setnum[1]=rekey+0x2f;q=rekey-1;break;case

2:

setnum[2]=rekey+0x2f;b=rekey-1;break;case

3:

setnum[3]=rekey+0x2f;s=rekey-1;break;case

0:

setnum[4]=rekey+0x2f;g=rekey-1;break;}

setflag=1;

}

if(mode==1)

{

if(m<2)

m++;

else

m=0;

switch(m){

case

1:

zkb[0]=rekey+0x2f

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1