摘 要:基于Matlab GUI(图形用户界面)设计了一种以单片机为控制核心的直流电机PID调速系统。利用GUI作为上位机对单片机采集的信息进行处理,实现电机转速的波形显示、存储、PID控制等功能。由于该系统的PWM信号由专门PWM芯片产生,因此降低了单片机程序的复杂程度,提高了系统的可靠性和控制精度。实验结果表明,该系统运行稳定,界面的人机交互性好,操作简单方便。在对PID参数的选定中可提高对PID算法和电机性能的直观认识,对自动控制、电机拖动等研究领域具有一定的现实意义。
关键词:Matlab图形用户界面;直流电机;比例积分微分;闭环控制
相对于其他类型的电机,直流电机具有很多优点,包括速度的可控性,启动、 制动的稳定性,以及调速的平滑性和经济性等[1]。运用其中的一些优点可以实现频繁的无极快速起动、制动和反转,能满足生产过程中自动化系统各种不同的特殊要求[2]。其有很多不同的控制算法和手段,模拟PID控制是最早发展起来的控制策略之一,长期以来形成了典型的控制结构。模拟PID参数整定方便,能够满足一般控制的要求,但是在实际中,现场的参数是易发生变化的(如温度、湿度等),而模拟PID控制系统一旦给定参数,则其在整个控制过程中是不能改变的,故其难以使系统达到满意的控制效果[3-4]。随着计算机技术与现代控制理论的发展,数字PID技术逐渐发展起来,它不仅能够实现模拟PID所完成的控制任务,而且具备控制算法灵活、可靠性高等优点,应用面也越来越广。Matlab具有强大的数值计算、可视化功能和系统建模仿真能力,在高校和科研机构使用极为广泛[5]。图形用户界面是目前计算机应用程序界面的主要形式。Matlab为用户提供了功能强大的集成图形用户界面开发环境(GUI),通过GUI,用户可方便、快捷地设计图形用户界面,开发自己的应用程序。并且GUI平台界面友好、使用简单,运用十分广泛,能够方便地进行某种技术或方法的演示,将GUI运用到控制系统中也为产品的演示与教学提供了新的途径[6]。
1 系统总体设计
本设计中,单片机系统作为下位机进行数据采集和控制执行,而Matlab GUI作为上位机主要完成PID调控、命令的发送、数据的存储、转速波形显示等工作。采用51单片机作为主控制器,通过控制D/A模块产生模拟电压来驱动PWM模块产生相应占空比PWM信号,从而实现对直流电机转速的控制。单片机的外围器件还包括电机驱动模块、电平转换模块、LCD、键盘等。系统总体框图如图1所示。
该系统采用 STC89C52 单片机为控制核心,控制DA芯片TLC7528能够产生0~5 V的模拟电压。该模拟电压驱动PWM芯片STC12C5608产生高精度占空比可调的PWM信号。PWM信号经过驱动芯片BTS7960的功率放大形成了对直流电机的驱动电压。依靠光电编码器完成对电机转速的获取,上位机接收单片机发送的转速信息,一方面根据PID参数,对电机的转速进行进一步的调整更正;另一方面,在GUI界面绘制出电机的转速波形。通过GUI界面,可以方便地改变PID参数,调整系统的动态特性,也可以将转速信息保存下来以备后续分析。该系统采用12 V的电压为驱动单独供电,保证了系统的驱动能力供给充足,提高了系统的稳定性和可靠性。键盘主要用来复位单片机系统和选择串口通信的波特率,LCD则为波特率的选择和当前转速的显示提供良好的交互界面。
2 系统硬件模块介绍
2.1 DA转换模块设计
DA芯片采用双路、8位数字/模拟转换器TLC7528,8位的分辨率可以为系统提供较高的转换精度。数模转换电路如图2所示。
图中,由单片机输出的8位数字量经由DA_0到DA_7输入芯片。DA_CS为控制引脚,控制TLC7528进行转换或者保持模拟量输出。模拟电压经由DA_OUT输出,用于控制PWM模块产生PWM信号。
2.2 PWM模块设计
为了提高PWM信号分辨力,保证系统控制精度,该系统采用单独的PWM模块输出PWM信号。STC12C5608是增强型的8051CPU,指令代码完全兼容传统8051,但速度比传统8051快8~12倍。针对电机控制、强干扰场合,其内部集成了4路PWM,8路高速10位A/D转换,编程功能使其成为专用的PWM芯片,其高精度A/D转换功能用来处理TLC7528产生的模拟信号,从而实现用模拟电压来控制PWM信号占空比的功能。其构成电路如图3所示。
图3中,STC12C5608芯片从AD0引脚接收TLC7528产生的模拟电压,芯片根据其内部对应的程序在PWM0引脚输出相应占空比的PWM信号。
2.3 驱动模块设计
直流电机的驱动芯片采用BTS7960,它是应用于电机驱动的大电流半桥高集成芯片,通态电阻典型值为16 MΩ,驱动电流可达43 A,能够为系统提供充足的驱动能力。由于BTS7960的芯片内部只有一个半桥,故该模块采用2片对电机进行驱动。电路如图4所示。
图4中,IN1与IN2是PWM信号输入端,ERO1和ERO2是电流检测输出引脚。PWM信号经过功率放大后在J2两端输出,为直流电机提供驱动电压。
3 GUI程序设计
图形用户界面是指包括文本框、标签、按钮、单选按钮、复选框、图片、菜单、对话框等组件的人机交互界面。在该界面中,通过单击、双击、拖动鼠标和简单的文字输入就可以轻松地操作计算机,完成所有任务。它既能嵌入已有的仿真程序,又能把仿真后的图形化结果以人机交互的动态方式直观呈现,使用者不需要知道代码的具体内容,只要了解操作步骤即可很方便地操作界面。对于熟悉Matlab而不想编写大量VC代码的科研人员来讲,Matlab GUI无疑是一个最佳选择[7]。
图5所示为该系统的GUI界面,大概包含以下几个区域:端口设置区、DA转换区、目的转速设置区、开闭环控制区、转速波形区以及理论驱动电压波形区。端口设置区主要完成对端口的设置,如端口号的选择、波特率的选择以及Matlab串口中断类型选择等(本实验中,端口号是COM3,波特率是19 200,中断类型默认设置为接收到特定字符‘Z’后触发)。DA转换区可直接控制D/A模块输出模拟电压,从而改变PWM占空比控制转速,以供调试和测试之用。目的转速设置区对期望转速进行设置,开闭环控制区则可以根据当前的控制策略选择开环控制或者闭环控制,在闭环控制时,可以设置不同的PID参数改变系统的响应特性。转速波形区主要完成对实测转速波形的显示,能够直观地观察到电机转速的响应波形。理论驱动电压波形区用来显示理论驱动电压的波形,通过该波形可以基本了解驱动电压的变化趋势,以便与转速波形形成对比。
3.1 Matlab 串口设置流程
(1)用serial函数创建一个串口对象
obj = serial('port')
obj=serial('port','PropertyName',PropertyValue,...)
(2)用fopen函数打开串口对象
fileID = fopen(filename)
fopen()函数括号中为串口对象,如果无法打开,返回-1。
(3)用fread函数读取串口数据
A=fread(fileID)
fread函数括号中为串口对象,返回读取到的数据。
(4)用fclose函数、free函数、delete函数和clear函数清除串口对象并释放内存空间。如:
fclose(s);%关闭串口对象s
free(s);%释放s占用的内存空间
delete(s);%删除串口对象s
clear(s);%删除工作空间变量,释放内存
3.2 串口中断设置
3.2.1 选择中断模式
(1)串口缓存区达到指定字节数时触发中断,如:
s.BytesAvailableFcnMode='byte';%中断类型
s.BytesAvailableFcnCount=31;%指定中断字节数
s.BytesAvailableFcn={@serial_interrupt,handles};
%指定中断函数为serial_interrupt
(2)接收到特定字符时触发中断,如:
s.BytesAvailableFcnMode='terminator';%中断类型
s.Terminator=′Z′;%当接收到字符′Z′时触发中断
s.BytesAvailableFcn={@serial_interrupt,handles};
%指定中断函数为serial_interrupt
3.2.2 在.m文件中添加中断函数
function serial_interrupt(hObject,event,handles)
%定义中断函数
3.3 波形绘制与串口数据存储
3.3.1 波形绘制(电机转速波形)
转速的波形绘制主要在串口中断函数中完成,部分代码如下:
s_data=fread(s);%串口数据读取
display_length=600;%定义要绘制的点数
time=linspace(0,60,display_length);%定义时间坐标
count=count+1;%计数变量加1用以绘制下一个点
speed=(s_data(27)-48)*1000+(s_data(28)-48)*100+
(s_data(29)-48)*10+(s_data(30)-48);
%提取串口中的电机转速数据并转换成整型
rotspeed=[rotspeed,speed];%保存数据用于绘图
plot(handles.axes_speed,time(1:count),rotspeed(1:count));
%绘图
set(handles.axes_speed,'XLim',[time(1),time(end)]);
if count==600 %画满600点后重新开始画图
count=0;
rotspeed=speed;
end
3.3.2 串口数据存储
本程序默认把数据存储到s_text.txt中。部分代码如下:
fid=fopen(get(handles.edit_save,'String'),'at');
%以添加文本方式打开文件
s_text=fread(s);%读串口数据
fprintf(fid,'%s\n',s_text);%向文件写入数据并换行
3.4 闭环控制算法
PID控制是在经典控制理论中技术最成熟、研究最广泛和应用最多的一种控制方式。图6所示为整理后的闭环相应曲线,其中P参数为0.5,I参数为0.05,D参数为0,目的转速为3 000 r/min。
部分程序如下:
current_speed=data.param;%得到当前的转速
spect_speed=data.target;%得到目标转速
error=spect_speed-current_speed; %求得误差信号
sum=sum+error;%误差信号累加
P=str2double(get(handles.edit_p,'String'));
%从GUI界面得到P参数
I=str2double(get(handles.edit_i,'String'));
%从GUI界面得到I参数
D=str2double(get(handles.edit_d,'String'));
%从GUI界面得到D参数
result=P*error+I*sum+D*(error-error_1);%驱动信号
基于Matlab GUI开发了一种具有友好用户界面的PID直流电机调速系统。通过该界面,用户能够直观地观察到电机转速变化的波形,并且可以对PID参数进行实时调整以观察电机的动态响应特性。同时GUI的数据保存功能能够保存串口发送过来的所有数据以备后续的分析和研究。由于该系统的PWM信号由专门PWM芯片产生,降低了单片机程序的复杂度,提高了系统的可靠性和控制精度。该系统运行稳定,操作简单方便,在自动控制、电机拖动等众多领域具有一定的应用价值。
参考文献
[1] 庹朝永.基于单片机的直流电机PWM调速系统设计与开发[J].煤炭技术,2011,30(6):62-63.
[2] 王晓峰,郝潇.基于单片机实现视域下直流电机PWM控制策略的探讨[J].煤炭技术,2012,31(7):232-233.
[3] 王葳,张永科,刘鹏鹏,等.无刷直流电机模糊PID控制系统研究与仿真[J].计算机仿真,2012,29(4):196-199,254.
[4] 王毅,王平,苏伟达,等.基于数字PID控制的直流电机控制系统的设计[J].福建师范大学学报,2010,26(4):59-62.
[5] 杜世民,杨润萍.基于MATLAB GUI的“信号与系统”教学仿真平台开发[J].实验技术与管理,2012,29(3):87-90.
[6] 金波.基于Matlab的“信号与系统”实验演示系统[J].实验技术与管理,2010,27(12):104-107.
[7] 钟可君,张海林.基于Matlab GUI设计的光学实验仿真[J].实验室研究与探索,2010,29(10):52-52,80.