电机PID控制.docx
《电机PID控制.docx》由会员分享,可在线阅读,更多相关《电机PID控制.docx(26页珍藏版)》请在冰豆网上搜索。
电机PID控制
一、实验名称:
51系列单片机直流电机闭环调速实验
——基于Proteus仿真实验平台实现
基本情况:
1.学生姓名:
2.学号:
3.班级:
4.实验项目组长:
5.同组其他成员:
序号
姓名
班级
学号
分工系数
1
2
6.具体分工:
(1)组长电路设计仿真整合实验报告
(2)组员相关资料收集
(3)组员程序编写
7.本人在项目组的作用描述:
主要负责实验方案的确定,电路设计仿真和实验报告的整理及完成
主要负责实验前相关资料的收集和试验中主要原理的收集
主要负责C语言程序编写,根据电路仿真图及实验要求,编写程序
二、实验内容(实验原理介绍):
1、实验原理
通过12位的模数串行转换器TLC2543模拟给定直流电机的速度,AT89C51单片机通过电机驱动电路控制直流电机的运转。
同时可以通过4*4键盘对PID的参数进行设定,把实时的速度反馈回来经过PID进行调节,并将调节后的转速通过显示界面LCD1602液晶显示器显示出来。
2、元件原理简介
2.1、TLC2543
TLC2543是是一种数模转换器芯片,是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源;且价格适中,分辨率较高,因此在仪器仪表中有较为广泛的应用。
1、TLC2543具有以下特点:
(1)12位分辩率A/D转换器;
(2)在工作温度范围内10μs转换时间;
(3)11个模拟输入通道;
(4)3路内置自测试方式;
(5)采样率为66kbps;(6)线性误差±1LSBmax;
(7)有转换结束输出EOC;
(8)具有单、双极性输出;
(9)可编程的MSB或LSB前导;
(10)可编程输出数据长度。
2、TLC2543的引脚排列及说明
TLC2543有两种封装形式:
DB、DW或N封装以及FN封装,这两种封装的引脚排列如图1,引脚说明见表1。
图1TLC2543的封装
3、接口时序
可以用四种传输方法使TLC2543得到全12位分辩率,每次转换和数据传递可以使用12或16个时钟周期。
一个片选()脉冲要插到每次转换的开始处,或是在转换时序的开始处变化一次后保持为低,直到时序结束。
图2显示每次转换和数据传递使用16个时钟周期和在每次传递周期之间插入的时序,图3显示每次转换和数据传递使用16个时钟周期,仅在每次转换序列开始处插入一次时序。
引脚号
名称
I/O
说明
1~9,11,12
AIN0~AIN10
I
模拟量输入端。
11路输入信号由内部多路器选通。
对于4.1MHz的I/OCLOCK,驱动源阻抗必须小于或等于50Ω,而且用60pF电容来限制模拟输入电压的斜率
15
I
片选端。
在
端由高变低时,内部计数器复位。
由低变高时,在设定时间内禁止DATAINPUT和I/OCLOCK
17
DATAINPUT
I
串行数据输入端。
由4位的串行地址输入来选择模拟量输入通道
16
DATAOUT
O
A/D转换结果的三态串行输出端。
为高时处于高阻抗状态,
为低时处于激活状态
19
EOC
O
转换结束端。
在最后的I/OCLOCK下降沿之后,EOC从高电平变为低电平并保持到转换完成和数据准备传输为止
10
GND
地。
GND是内部电路的地回路端。
除另有说明外,所有电压测量都相对GND而言
18
I/OCLOCK
I
输入/输出时钟端。
I/OCLOCK接收串行输入信号并完成以下四个功能:
(1)在I/OCLOCK的前8个上升沿,8位输入数据存入输入数据寄存器。
(2)在I/OCLOCK的第4个下降沿,被选通的模拟输入电压开始向电容器充电,直到I/OCLOCK的最后一个下降沿为止。
(3)将前一次转换数据的其余11位输出到DATAOUT端,在I/OCLOCK的下降沿时数据开始变化。
(4)I/OCLOCK的最后一个下降沿,将转换的控制信号传送到内部状态控制位
14
REF+
I
正基准电压端。
基准电压的正端(通常为Vcc)被加到REF+,最大的输入电压范围由加于本端与REF-端的电压差决定
13
REF-
I
负基准电压端。
基准电压的低端(通常为地)被加到REF-
20
Vcc
电源
表1TLC2543引脚说明
2.2、L298
L298是一款单片集成的高电压、高电流、双路全桥式电机驱动,设计用于连接标准TTL逻辑电平,驱动电感负载(诸如继电器、线圈、DC和步进电机)。
L298提供两个使能输入端,可以在不依赖于输入信号的情况下,使能或禁用L298器件。
L298低位晶体管的发射器连接到一起,而其对应的外部端口则可用来连接一个外部感应电阻。
L298还提供一个额外的电压输入,所以其逻辑电路可以工作在更低的电压下。
L298具有以下特性:
(1)L298工作电压高达46V
(2)总DC电流达4A
(3)低饱和电压
(4)L298具有过温保护功能
(5)逻辑“0”输入电压高达1.5V(高抗噪性)
2.3、AT89C51
AT89C51是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
AT89C51为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
2.4、Proteus基本操作
(一)启动Proteus仿真软件:
双击“isis”图标,出现isis操作页面。
(二)搭建单片机系统仿真电路:
分“器件选取”、“器件放置”和“电路连接”三大步来操作。
〖第一步器件选取〗:
isis操作页面的左侧中下部分是电路和器件操作的导航区域,器件选取前“Devices”栏目下为空,器件选取操作的目的是将从器件库中分拣出需要的器件,这些器件排列在“Devices”栏目下。
A:
先选择“器件和仪器工具栏”的“放大器符号样”图标(该工具栏的第一个图标),再单击“P”键即弹出“PickDevices”窗口。
PickDevices窗口左侧可以输入器件类型名称,或者选择器件类型,窗口中部即出现相应类型的器件,若鼠标选中器件,窗口右侧会出现该器件的引脚图和封装图。
B:
在PickDevices窗口中,先选中器件,后点击窗口右下脚的“确定”按钮,即将器件排列在“Devices”栏目下了。
或者直接双击被选的器件,也能收到同样的操作结果。
C:
对于电源、地、输入和输出端等特殊器件,不在“PickDevices”窗口中选取而在“PickTerminals”窗口中选取。
只要选择“器件和仪器工具栏”的“输入输出符号样”图标(该工具栏的第八个图标),即变“Devices”栏目为“Terminals”栏目,“Terminals”栏目下已经将电源、地、输入和输出端等特殊器件列出了一部分,如还要增加时,单击“P”键即弹出“PickTerminals”窗口供选取。
〖第二步器件放置〗:
isis操作页面的中右侧是搭建硬件电路系统原理图和显示系统运行状态的区域。
器件放置前或选择“NewDesign”文件后,器件放置区域同导航区一样栏目内容为空,器件放置操作是把导航区的器件排列在放置区的适当位置,以便于搭建硬件电路系统原理图。
A:
器件放置的基本操作:
是将导航区的器件选中(左键),然后把鼠标移到放置区中适当位置,再点击左键,即放置了器件。
若多次点击左键,则会放置多个相同的器件。
B:
器件的移动、翻转和删除操作:
在放置区中选中器件的方法是用右键点击一次,被选中的器件变成红色,然后用鼠标选中红色的器件再按住左键移动鼠标即移动了器件位置,移动后器件仍然是红色,移动完成后将鼠标移开器件至空白处再点击右键,红色器件变回黑色。
器件翻转的方法是右键选中器件使之变红,然后将鼠标移至导航区下方,点击红色的翻转图标,即可实现器件的翻转,完成后将鼠标移回放置区空白处再点击右键,红色器件变回黑色。
器件删除的的方法是右键选中器件使之变红,再对变红的器件点击右键,即删除了相应的器件。
C:
器件和图形的复制操作:
在放置区中,按住鼠标右键适当移动鼠标即画出一个矩形方框,方框内部的器件和图形变成红色,这时再点击菜单下的复制图标和粘贴图标,即会复制出一个相同的方框图形,移动鼠标即可将复制的图形移到适当的位置,再点击左键定位,若定位之前点击右键即删除复制的图形。
D:
器件属性的设置:
在放置区中右键选中器件后器件变红,再点击左键即弹出“EditComponent”对话框,该对话框内容即器件的属性,其中的一些内容可以选择隐藏不被显示出来。
〖第三步电路连接〗:
搭建硬件电路系统原理图需要把器件的引脚连接起来,其操作比较简单。
A:
电路连接操作方法:
将鼠标移至一个引脚或一条连线上点击左键,再移动鼠标即拉出一条红色导线,导线要拐弯时,则点击左键再移动鼠标即拉出拐弯的导线,最后导线的另一端通常要接到另一个引脚或另一条连线上,再点击左键导线变回黑色完成连接。
若只对导线两端要求正确连接,对导线路由不作要求,则鼠标只需对连接导线始端和末端的引脚进行点击左键,便自动完成布线。
B:
电路连接快速操作方法:
若需要连接的两个器件的引脚都按照一个方向的顺序、等距离地排列,那么只需对第一条导线进行人工布线,从第二条导线开始顺序双击连接导线始端的引脚即可完成对应的导线连接。
C:
导线的删除操作:
右键选中导线后导线变红,再对变红的导线点击右键即删除了导线。
D:
导线属性的设置:
右键选中导线后导线变红,再点击左键即弹出“EditWireStyle”对话框,即可对导线的属性进行设置。
(三)创建和导入ASM源文件
进入菜单栏,选择“Source”下“Add/RemoveSourcefiles…”,即弹出“Add/RemoveSourceCodeFiles”对话框。
再点击“New”按键,弹出“NewSourceFiles”对话框,即可以创建(只在文件名栏目输入一个文件名,后缀为ASM)或导入ASM源文件。
确定后,“Add/RemoveSourceCodeFiles”对话框中“SourceCodeFilename”栏目即有ASM源文件名及路径,然后在“CodeGenerationTool”栏目中选择“ASEM51”,最后点击“OK”按键,即完成了创建和导入ASM源文件。
此后“Source”下即可以看到相应的ASM源文件。
(四)编译ASM和导入HEX文件
编译ASM文件的前提是已导入ASM文件,启动编译的方法有两种:
方法一:
进入菜单栏,选择“Source”下“BuildAll”,即弹出“BUILDLOG”提示框,提示编译ASM文件的结果。
方法二:
直接点击器件放置和运行区下方的“运行”按键,若ASM文件内容有变化,即自动对其编译,若问题即弹出“SOURCECODEBUILDERRORS”提示框,提示编译ASM文件的结果。
编译ASM文件成功后即生成HEX文件,单片机导入HEX文件的方法是,打开单片机器件属性对话框,在“ProgramFiles”栏目里打开文件目录,选择装入HEX文件即可。
单片机此后按照该HEX文件的代码运行程序。
【特别注意】单片机运行速度与晶振频率有关,目前PROTEUS的版本不支持晶振器属性里所设置的频率值,单片机晶振频率必须在单片机器件本身的属性里设置,即打开单片机器件属性对话框,在其“ClockFrequency”栏目里输入频率值。
(五)软件调试菜单
进入菜单栏,选择“Debug”下“Start/ResartDebugging”,即进入调试状态,此后可以进行单步运行、全速运行、断点设置等功能。
【特别提示】:
调试期间,即可看到电路系统的运行结果和状态细节。
可在电路中进行电压、电流和波形测试,其测试操作基本方法是选择“器件和仪器工具栏”的测试工具或测试信号图标,将测试工具和测试信号放置到电路的相应位置,并与测试点连接起来(放置和连接方法同电路器件一样),然后再调试运行即可看到测试结果。
3、模块简介
3.1电机驱动电路模块
图1电机驱动电路模块
L298芯片管脚说明:
SENSA:
电流检测端,H桥的电流反馈脚,不用时可直接接地。
OUT1:
输出端,与M1对应。
OUT2:
VS:
电源,用来给点击供电。
IN1:
输入端。
ENA:
使能端,和M1,M2配合使用。
IN2:
输入端。
GND:
接地。
VCC:
电源,用来给芯片供电。
IN3:
输入端。
ENB:
使能端,和M3,M4配合使用。
OUT3:
输出端,与M3对应。
OUT4:
输出端,与M4对应。
3.2、
键盘控制PID参数的设定模块
图2矩阵键盘电路
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
通过键盘可以设置一定量的PID参数,点击“P”“I”“D”,对其进行参数设置,设置完之后,点击“确定”,运行。
3.3、转速设定模块
图3转速设定模块
通过滑动变阻器改变TLC2543的给定电压,从而设置电机的转速。
其中的直流电压表可以实时地在线显示当前所给定的电压。
三、实验结果分析(含程序、数据记录及分析和实验总结等,可附页):
实验仿真图:
实验数据记录如表:
实验数据记录
数据设定次数
实验次数
设定转速
PID
MAX
MIN
1
52
P
I
D
1
2
0.1
0
58
49
2
12
0.1
0
62
30
3
2
3.3
0
1
0
2
1
104
2
0.1
0
106
103
2
12
0.1
0
107
102
3
2
3.3
0
1
0
实验结果分析:
当PID值维持在较小的数值是,转速控制得比较稳定,当增大相对应的参数值到一定的范围内时,转速就会出现较大的波动。
尤其是当I至增大时,转速的变化巨大,以至于不能正确反映转速的真实值。
编写程序:
#include"Type_Data.h"
#include"1602.h"
#include"TLC2543.h"
#include"Key.h"
#include"PID.h"
#include"stdio.h"
INT32UCount_Num;
INT32UTime_count;
sbitwe=P3^7;
voidSystemInit(void)
{
TMOD|=0x21;
SCON|=0x50;
TH0=(65536-45073)/256;
TL0=(65536-45073)%256;
TR0=1;
ET0=1;
TH1=0xfd;
TL1=0xfd;
TR1=1;
TI=1;//利用printf要置此为1
EX0=1;//中断0用来测量转速
IT0=1;
EA=1;
}
voidmain(void)
{
SystemInit();
IncPIDInit();
Init_1602();
Init_Display();
while
(1)
{
PWMOUT();
}
}
voidInterrupt0()interrupt0
{
Count_Num++;
}
voidInterrupt_Time0(void)interrupt1
{
TH0=(65536-44083)/256;
TL0=(65536-44083)%256;
Time_count++;
if(Time_count>20)
{
Time_count=0;
if(!
Flag_Key)
{
EX0=0;
Diaplay_Num_1602(Line1_Address+13,Count_Num*0.6);
printf("%dr/min\n",(INT16U)(Count_Num*0.6));
sPID.SetPoint=Set_Speed();
Diaplay_Num_1602(Line1_Address+3,sPID.SetPoint);
Speed=Count_Num*0.6;
PID_Adjust();
Count_Num=0;
EX0=1;
}
Key_Option();
}
}
/***********************
filename:
1602.c
data:
2013/3/26
/************************/
#include"1602.h"
/***********************************
函数名称:
Delay_1602(INT8Utime)
函数功能:
1602延迟
日期:
2013/3/26
备注:
无
/***********************************/
voidDelay_1602(INT8Utime)
{
while(time--);
}
/***********************************
函数名称:
Write_Order_1602(INT8Uorder)
函数功能:
1602写命令
日期:
2013/3/26
备注:
无
/***********************************/
voidWrite_Order_1602(INT8Uorder)
{
RS_1602=L;
RW_1602=L;
E_1602=L;
Data_1602=order;
//Write_Read(order);
E_1602=H;
Delay_1602(10);
E_1602=L;
}
/***********************************
函数名称:
Write_Order_1602(INT8Uorder)
函数功能:
1602写数据
日期:
2013/3/26
备注:
无
/***********************************/
voidWrite_Data_1602(INT8Udat)
{
RS_1602=H;
RW_1602=L;
E_1602=L;
Data_1602=dat;
//Write_Read(dat);
E_1602=H;
Delay_1602(10);
E_1602=L;
}
/***********************************
函数名称:
Set_xy_1602(INT8Ux,INT8Uy)
函数功能:
1602设置坐标
日期:
2013/3/26
备注:
无
/***********************************/
voidSet_xy_1602(INT8Ux,INT8Uy)
{
INT8Uaddress=0;
if(y==1)
address=0x80+x;//第一行
else
address=0xc0+x;//第二行
Write_Order_1602(address);//写入地址
}
/***********************************
函数名称:
Display_String_1602(INT8Ux,INT8Uy,INT8U*s)
函数功能:
1602指定位置显示字符串
日期:
2013/3/26
备注:
无
/***********************************/
voidDisplay_String_1602(INT8Ux,INT8Uy,INT8U*s)
{
Set_xy_1602(x,y);
while(*s)
{
Write_Data_1602(*s);
s++;
}
}
/***********************************
函数名称:
Write_Order_1602(INT8Uorder)
函数功能:
1602初始化
日期:
2013/3/26
备注:
无
/***********************************/
voidInit_1602(void)
{
Write_Order_1602(Set_Display_Mode);
Write_Order_1602(Close_Screen);
//Write_Order_1602(Open_Cursor_Flicker);
Write_Order_1602(Open_Ucursor);
}
/***********************************
函数名称:
Diaplay_Num_1602(INT16Unum)
函数功能:
1602显示数
日期:
2013/3/26
备注:
无
/***********************************/
voidDiaplay_Num_1602(INT8Uline,INT32Unum)
{
Write_Order_1602(line);
Write_Data_1602(0x30+num/100%10);
Write_Data_1602(0x30+num/1