商 林 钟 雷
(武汉交通职业学院,湖北 武汉 430065)
在2018 年全国电子设计竞赛备赛过程中,教练组选择了2015 年全国大学生电子设计竞赛高职组控制类题——风板控制装置为控制类训练题,目的在于让参赛选手了解控制类题目的特点,训练队员如何使用定时器、PWM、液晶显示模块,如何对PID 算法中的参数进行整定等。参赛队员查找相关资料,其内容多为如何用PID 算法去控制风板的系统设计方案,包括PID 原理、硬件的选择、算法的流程等[1-3],但很难找到介绍控制风板稳定的方法。在训练过程中,系统设计方案、PID基本算法参赛队员都能理解,但在实际调试过程中主要问题表现在:(1)PID 的三个参数整定困难,调试时效果不好,花了大量时间,达不到预期目的;(2)干扰过大,不能满足控制角度误差不大于5 度的要求。为了解决上述问题,教练组使用了归一参数整定法来选择PID 的参数,使用防脉冲干扰平均滤波法来消除噪声干扰,从而达到控制角度误差不大于5 度的要求。文中选择风板保持90度角为实验任务,要求正负误差不超过5度,自制系统如图1 所示。系统包括STC15W 单片机、数字电位器、按键、L298N 电机控制器、2 个风机、12864LCD 屏、UART_Oscilloscope 等,系统结构如图2 所示[4]。该系统首先通过数字电位器采集风板当前的角度,STC15W 单片机采集供电电压,经过滤波消除干扰,再通过PID 算法去调整风机的转速,从而控制风板保持在设定的角度。
图1 自制风板模型
图2 系统框图
对于风板稳定运行的条件,文献介绍甚少,教练组从研究风板稳定运行的影响因素、PID 算法的改进、软件滤波等方面着手,最后实现了风板稳定停留在设定的角度,误差控制在要求范围内。
根据香农采样定理,系统采样频率的下限为fs=2fmax,此时系统可真实地恢复到原来的连续信号。从风板控制系统的随动和风机抗干扰的性能来看,风板系统要求采样周期短些,训练中,队员使用UART_Oscilloscope 软件测量角度传感器波动的频率,软件显示角度传感器波动频率为10HZ左右,根据香农采样定理,可以选择50ms 的定时器T0为基准采样定时器。
采样周期也不能过短,过短的采样周期导致风机的转速由于采样干扰导致的误差使风机转速频繁调节变动,也不利于系统的稳定。
对于角度的测量,角度传感器选用了数字电位器,最大电压为5V,通过测量角度和实际电压之间的关系,经过大量数据验证,角度和电压的关系为:angle=-85.51*AD_data+309.9,其中angle为风板的角度,AD_data 为当前角度时数字电位器A/D值。
对于风机的控制,为了便于控制风板,如果风板角度小于90 度,选择右边风机为定速,它的PWM 值为100 到150 之间;如果风板角度大于90度,选择左边风机为定速,PWM 值为100 到150 之间。这是控制风板稳定方法之一,该方法避免了两个风机一起调速,有利于风板的稳定。
由于供电电压不稳定,即数字电位器的参考电压发生了改变,A/D采样后的AD_data值虽然准确,但通过公式angle=-85.51*AD_data+309.9 转换后,并不是真实的角度。供电电压增大,换算出的angle也增大;供电电压减小,换算出的angle也减小。为了解决电源电压不稳带来的测量误差,训练时另外开了一个通道,采集数字电位器供电电压,即通道5 采集数字电位器电源电压A/D 值,通道7 采集数字电位器输出A/D 值。关键代码如下所示:
AD_temp1=ADC_Read(5);
AD_temp2 = ADC_Read(7)。根据STC15W单片机I/O 口的A/D 采集原理,可计算出AD_data=AD_temp2*2.5/AD_temp1,通过采集数字电位器电源电压A/D 值,并为分母,作为参考电压,理论上消除了电源电压不稳导致换算出的角度误差,经过换算角度为:angle=-85.51*AD_data+309.9,并放在get_AD()采集函数中。该方法克服了过去由于数字电位器的电压不稳定导致的测量误差,是控制风板稳定方法之二。
文中省去了PID 的结构体、PID 的初始化、A/D 采集等定义,归一参数整定法——自校正PID控制器算法如图3所示。
图3 归一参数整定法
int pwm;
float PID_realize(float speed)
{
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;/
/归一参数整定法——自校正PID 控制器
pid.incrementSpeed=pid.Kp* (2.45*pid.err +3.5*pid.err_next+1.25*pid.err_last);
pid.ActualSpeed+=pid.incrementSpeed;
pid.err_last=pid.err_next;
pid.err_next=pid.err;
returnpid.ActualSpeed;
}
由图3 可知,只需确定一个参数pid.Kp 就能计算出增量PID 算法的增量值,减少了调试工作量。实际效果如图4 所示,设定值为200,pid.Kp=0.095,经过20 次的运算,能收敛到200.436386,误差为0.2181%。其他参数不变,调整pid.Kp 值能控制收敛速度和误差,达到任务要求的精度[5-6]。
图4 归一参数整定法仿真结果
在数据采集中存在着多种干扰,滤除干扰的方法有很多,既有软件滤波器,也有模拟滤波器。针对采集数字电位器输出电压过程中出现的随机干扰,采用了防脉冲干扰平均滤波法消除干扰,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样偏差。该滤波方法是连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。虽然防脉冲干扰平均滤波法把N 次采样值按大小排列,要消耗单片机的内存,排序时也比较费时,但训练时,队员选择的是STC15W 系列单片机,它有24MHZ 的晶振,24K 的SRAM。使用中N 值为7,对N 次采样值排序时,使用插入排序算法,它的空间复杂度为O(1),算法稳定,最坏情况O(n2)的时间复杂度,可以通过修改N 的值来改变算法的复杂度,STC15W 系列单片机能满足该算法的要求[6-7]。算法关键代码如下:
#define N 7
void InsertionSort(int A[],int n);//插入排序
int filter(int value_buf[N],N)
{ int count,sum;
InsertionSort(value_buf[N],N);
for(count=1;count<N-1;count++)
sum+=value[count];
//滤波结果发串口1,使用UART_Oscilloscope软件看波形
SendUART1((int)sum/(N-2));
return(int)(sum/(N-2));
}
filter 函数的返回值,即是防脉冲干扰平均滤波法得到的数字电位器当前角度的采样值,是控制风板稳定方法之三。
主函数中使用了50ms 的定时器,即每隔50ms 采集一次数字电位器角度,采集N 次做一次滤波,滤波的结果做PID 运算,得到新的增量,再通过计算出新的PID 增量去调节PWM 的参数,改变电机的转速,达到角度稳定在设定的角度,并保证5 度的误差,本训练选择风板稳定在90 度[8-9]。关键代码如下所示,流程图如图5所示。
图5 PID运行流程
#define N 7
int PWM=0;
int num1=0,flag=0,filter_AD;
int value_AD[N];//存放采集的值
int filter(intvalue_buf[N],N);
void PWM_SET(int pwmvalue_left,int pwmvalue_right);//风机转速调节
float PID_realize(float speed);//归一参数整定法PID
main()
{ ……省略代码(包含PID的初始化等)
while(1)
{
if(flag==1)
{
filter_AD=filter(value_AD,N);
pid.ActualSpeed = filter_AD;//角度采集滤波后真实值
PWM_SET(PID_realize(90),120);
flag=0;
}
……
}}
void T0()interrupt 1 //定 时 器T0,每 隔50ms采集一次角度
{ ……省略代码
value_AD[num1]= get_AD();//采集当前电压
num1++;
if(num1==N)
{
num1=0;
flag=1;
}
}
测试过程中,采集角度时,使用了防脉冲干扰平均滤波法,消除了干扰,保证了采集角度的稳定,经过滤波后,使用了参数整定法计算了PID 算法的增量,最后去做PWM调速。
队员用手转动风板,放在90 度,再找一硬物支撑固定住风板,减少用手扶住风板时人为晃动引起的干扰,观察液晶屏上显示的角度值,是90度左右,在误差范围内。打开UART_Oscilloscope软件,用USB 转换线连接PC 与开发板,设置UART_Oscilloscope 为串口1 获取数据,可以看到UART_Oscilloscope 软件中的波形平滑度非常高,几乎是条平直的直线。移走硬物,用手移动风板,移动瞬间,UART_Oscilloscope 中的波形跟随变化,不动风板,几乎又是平直的直线,波形看不到过冲和毛刺。用UART_Oscilloscope 软件来测试显示采样的值是不是有干扰,使用软件滤波能不能抗干扰,效果很直观。
设定风板的控制角为90 度,风板停靠在左边,启动程序后,左边风机全速旋转,风板被吹起,往右快速移动,随着风板右移,左边风机的转速变慢,风板慢慢靠近90 度角,并有轻微的摆动,但满足5 度偏差的要求。用手掌轻轻接近离右边风机进风口3 到5 厘米的位置,可以看到风板右移,但左边风机迅速减慢了转速,风板又回到90度左右。
文中采用了防脉冲干扰平均滤波法滤除了采样时的干扰,并用UART_Oscilloscope 软件观察到采样滤波后的波形,把滤波后的数据送到归一参数整定法PID 算法中修改pid.ActualSpeed 值,并设定风板的角度为90 度,观察结果满足角度误差的要求,达到了训练目的。PID 调节器参数整定方法有多种,常见的有:(1)理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数;(2)工程整定方法。它主要依赖工程经验,直接在控制系统的试验中进行,在工程实际中被常常采用,它要求使用者有丰富的工程经验,并要做大量的工程测试;(3)文中使用的是归一参数整定法,根据经验数据,对多变量、相互耦合较强的系数,人为地设定“约束条件”,以减少变量的个数,达到减少整定参数数目,简易、快速调节参数的目的。对比上述三种方式,归一参数整定法有简单、快速的优势。