1 引言
运动控制系统在国民经济和国防等领域中所起的作用以及应用的范围越来越大,运动控制技术正在不断的深入到各个领域并迅速发展,其应用范围已经涵盖了几乎所有的工业领域。例如在生产过程中对机器人手的位置控制;造纸厂中纸张滚卷的恒张力控制;导弹制导系统控制导弹准确击中目标等。
为了保证及时发现运动控制系统中可能发生的各种故障,应在系统中加入故障检测子系统。电机驱动运动控制系统中的大部分机械故障和电气故障都会引起电机电流的异常变化,非线性能量算法能够从电流信号中提取出系统故障信息,从而及时检测出系统中可能产生的各种故障。
本文首先以三星公司的S3C44B0X微处理器为核心芯片,设计电流信号采集电路,然后介绍了非线性能量故障诊断算法。最后以X-Y运动平台为实验对象,验证该算法的有效性。
2 信号采集电路设计
S3C44B0X具有8通道的10位模数转换器(ADC),它是一个逐次逼近型的ADC,内部结构中包括模拟输入多路复用器,自动调零比较器,时钟产生器,10位逐次逼近寄存器和输出寄存器。该ADC还提供可编程选择的睡眠模式,以节省功耗。使用S3C44B0X的ADC时应当注意,在ADC退出休眠模式后,为使ADC参考电压稳定,在第一次A/D转换之前需等待10ms。通道切换时,应该保证至少15μs的时间间隔。
S3C44B0X的ADC输入电压范围为:0“2.5V,而被测电机电流信号的变化范围是:-5V”+5V。因此首先应将双极性的输入信号转化到0“2.5V范围内。如果采样频率高于100Hz,还应在信号输入通道加上采样保持器。
图 1: 模拟信号调理电路
图1中利用μA741通用型运算放大器构成升压电路,选用LF398作为采样保持器。可知图中各节点电位的关系可用(1)式表达,从而将-5V”+5V变化范围的被测信号转化到0“2.5V。
3 故障检测算法
为了及时检测出系统中产生的故障,需要对电机电流信号进行实时处理,从中提取出故障信息。文献[3,4]给出了一种非线性能量算法NEO (Nonlinear Energy Operation),可以用来检测出信号的异常变化。对于给定的信号序列x(n),非线性能量算法定义如下:
文献在NEO中引入时域窗口的概念,在此基础上提出了光滑非线性能量算法SNEO(SmoothedNonlinear Energy Operation)。该算法可用下式描述:
其中 ⊗为卷积运算符,ω为时间窗口(time window)。式中的ω(k)可以按照下式选取:
为了达到理想的检测效果,也可以采用多步SNEO:
其中:
通过选择适当的时间延迟m,可以有效减少采样噪声的影响。
4 信号采集和分析
为了快速准确的检测出系统发生的故障,需要设置适当的滤波器参数(比如多步SNEO算法中的b和m),这就要首先对被检测信号进行分析处理。ARM芯片虽然能够实时处理大量的数据,但是缺乏上位机(如工控机)专用软件具有的强大数据分析处理功能。这里选用科学研究中经常用到的MATLAB软件对ARM系统采集到的数据进行离线分析处理,得到所需的滤波器参数。
为了方便将ARM采集到的数据导入到MATLAB中,首先编写了MATLAB和ARM系统的串行通信程序。要确定MATLAB环境已安装了仪器控制工具箱(Instrument Control Toolbox)。在MATLAB中,可以通过创建串口对象,来实现MATLAB与串口设备的通信。
创建串口对象可使用如下的语句:
bj = serial(‘port’, ‘PropertyName’, Property Value ,。..)
其中obj为创建的串口对象;port为串口对象所对应的串行口,如COM1;PropertyName和PropertyValue分别为串口属性名称和相应的取值,两者需成对出现。创建串口对象之后,在进行串口的读写操作之前,还需调fopen函数来建立串口对象同串口设备的实际连接。
可以使用fprintf和fwrite函数向串口设备发送数据,其中fprintf用于向串口设备发送文本信息,fwrite用于向设备发送二进制数据。MATLAB提供了很多函数,利用这些函数可以方便灵活的读取串口设备发送的信息;其中最常用的两个读串口函数为fread和fscanf,fread用于从串口设备读取二进制信息,fscanf用于读取设备发送的文本信息。
如果不再使用串口,应将串口对象同设备断开,然后将其从内存和MATLAB工作空间中删除。可以使用fclose,delete,chear来完成这一系列操作。
下面给出的MATLAB脚本文件用于接收ARM系统采集到的5000个双字节数据,并将这些数据存储到100×50的矩阵data中。这样就可以方便的利用MATLAB强大的数据分析处理功能,从得到的数据中总结出有用的信息。
s = serial(‘COM1’,‘BaudRate’,115200,‘Terminator’, {‘’,‘’});
data = zeros(100,50);
fopen(s);
for i = 1:50
fwrite(s,0x1,‘char’);
tmp = fread(s,100,‘int16’);
data(:,i) = tmp;
for j = 1:1000
j=j;
end
end
fclose(s);delete(s);clear s;
ARM系统的串口发送程序如下。在ARM的串口接收中断服务程序中将URXD0Flag赋值为1,这样每当ARM接受到MATLAB发送过来的SOH (Start of Header)字符,即0x1,便会向MATLAB发送100个双字节数据。sl和sh分别存放数据的底八位和高八位。
while(1) {
if(URXD0Flag) {
for(j = 1; j <= 100;j++) {
sl = signal[ i] & 0xff;
sh = (signal[i++] & 0xff00)>>8;
Uart_SendByte(sl);
Uart_SendByte(sh);
}
URXD0Flag = 0;
}
if(i >= 5000)
break;
}
5 算法验证
这里以X-Y运动平台为实验对象,设计了系统故障实时检测实验,验证故障检测算法的有效性。首先通过实验得到X-Y平台正常工作时电机的电流信号TN,然后在平台运动过程中给平台施加一个额外的阻力(模拟故障发生的情况),得到电机输出电流信号为TF。通过对这两种情况下的电流偏差信号TE(TE=TN-TF)进行分析,可以从中提取出故障信号。
S3C44B0X通过ADC采集到的TN,TF信号,以及TE随时间的变化曲线分别如图2和图3所示。
图 2: TN,TF 变化曲线图 3: TE 随时间变化曲线
从图3可以看出,TE信号中存在较多的干扰信息,为了准确无误的检测出其中的故障信号,就应采用某种滤波算法对TE进行处理,从而将故障信号提取出来。图4和图5分别是采用NEO和多步SNEO(m=50,b=50)两种方法对TE进行处理,得到的信号曲线。
图 4: 利用NEO 对TE 进行处理的结果曲线图 5: 利用多步SNEO 对TE 进行处理的结果曲线
比较图4和图5可以看出,多步SNEO能够更好的消除干扰噪声的影响,将故障信息成功地提取出来。但是利用SNEO会引入一定的延时,从而造成故障被检测出时间的滞后。从式(5)和式(6)可知,当m=50,b=50,采样频率为500Hz时,滞后时间为:
6 结论
本文利用非线性能量算法对电机电流偏差信号进行分析,能够及时发现运动控制系统中发生的各种扭矩相关故障,从而提高系统故障检测环节的准确性和及时性。可以在此基础上设计系统容错环节,使系统的安全性和可靠性得到更好的保证。