기어 트레인 결함 검출을 위한 모터 전류 신호 분석
이 예제에서는 취미용 서보를 구동하는 전류 신호에 모터 전류 신호 분석(MCSA) 방법을 적용하여 기어 트레인에서 결함을 식별하는 방법을 보여줍니다. MCSA는 토크 또는 속도의 변동을 유발하는 결함을 진단하는 데 유용한 방법으로, 모터 결함 분석에 적합한 것으로 검증된 바 있습니다. 기존의 진동 계측기를 사용한 기어 결함 검출은 가속도계나 기타 진동 센서를 사용해 계측할 때 기어 트레인에 쉽게 접근할 수 없는 경우(원자력 발전소에서의 내부 작업 등) 특히 까다로울 수 있습니다. 이 예제에서는 전류 시그니처 분석을 통해 스펙트럼 메트릭을 추출하여 취미용 서보 모터의 구동 기어에서 결함을 검출하는 방법을 보여줍니다. 전류 신호에서 스펙트럼 메트릭을 얻는 단순화된 워크플로는 다음과 같습니다.
공칭 rpm을 계산하여 관심 주파수를 감지합니다.
결함 신호가 존재할 수 있는 주파수 대역을 생성합니다.
파워 스펙트럼 밀도(PSD) 데이터를 추출합니다.
관심 주파수 대역에서 스펙트럼 메트릭을 계산합니다.
하드웨어 개요
이 예제에서, 전류 데이터는 연속 회전을 위해 개조된 표준 Futaba S3003 취미용 서보에서 수집되었습니다. 서보는 내부 DC 모터의 높은 속도를 출력 스플라인에서의 높은 토크로 변환합니다. 이를 위해 서보는 DC 모터, 나일론 또는 금속 구동 기어 세트, 그리고 제어 회로로 구성됩니다. DC 모터로 흐르는 전류 신호를 직접 모니터링하기 위해 이 제어 회로를 제거했습니다. 서보 출력 스플라인의 회전속도계 신호는 적외선 포토인터럽터와 8개 구멍이 있는 35mm 직경의 표준 취미용 서보 휠을 사용하여 수집되었습니다. 휠의 8개 구멍은 균일한 간격으로 배치되었고, IR 포토인터럽터는 서보 휠 혼의 1회전당 정확히 8번의 펄스가 발생하도록 배치되었습니다. 서보와 포토인터럽터는 3차원 프린터로 직접 제작한 마운트로 고정되었습니다.
DC 모터는 5V 정전압으로 구동되었고, 4쌍의 기어는 속도를 278:1로 줄였고, 스플라인에서의 축 속도는 약 50rpm이었습니다. 전류 소비량은 0.5옴 저항기에서의 전압 하강을 측정하여 옴의 법칙으로 계산되었습니다. 전류 측정값의 변화가 너무 작아서 검출하기 어려웠기 때문에 단일 전원 센서 인터페이스 증폭기를 사용하여 전류 신호를 증폭했습니다. 그런 다음 증폭된 전류 신호를 안티에일리어싱 5차 타원 저역통과 필터로 필터링하여 평활화하고 잡음을 제거한 다음 아날로그-디지털 변환기(ADC)를 통해 Arduino Uno로 전송했습니다.
순서도에서 볼 수 있듯이, 전류 신호는 먼저 증폭기를 사용하여 증폭된 후에 안티에일리어싱 저역통과 필터를 사용하여 필터링되었습니다. Arduino Uno는 ADC를 통해 1.5kHz로 전류 신호를 샘플링한 다음 115200의 전송 속도로 회전속도계 펄스와 함께 직렬 데이터로 컴퓨터에 스트리밍했습니다. MATLAB 스크립트가 Arduino Uno에서 직렬 데이터를 가져와서 쉼표로 구분된 값(CSV) 파일에 썼습니다. 그런 다음 MATLAB을 사용하여 CSV 파일을 읽어 들이고 처리하여 스펙트럼 메트릭을 추출했습니다.
서보 기어 트레인
Futaba S3003 서보는 위 그림에 나와 있듯이 4쌍의 나일론 기어로 구성되어 있습니다. DC 모터 축의 피니언 P1은 단기어(stepped gear) G1과 맞물립니다. 피니언 P2는 단기어 G1의 성형된 부분으로, 단기어 G2와 맞물립니다. 기어 G2의 성형된 부분인 피니언 P3은 단기어 G3과 맞물립니다. G3의 성형된 부분인 피니언 P4는 출력 스플라인에 연결된 마지막 기어 G4와 맞물립니다. 단기어 세트 G1과 P2, G2와 P3, G3과 P4는 자유 회전 기어 즉, 각각의 축에 연결되지 않은 기어입니다. 구동 기어 세트는 모터를 5V로 구동했을 때 모터 속도 13901rpm이 출력 스플라인에서 약 50rpm으로 떨어지는 278:1만큼의 속도 감소를 제공합니다. 다음 표에는 톱니 개수와 출력 속도, 기어 맞물림 주파수, 각 기어 맞물림에서의 누적 기어 감속에 대한 이론적인 값이 나와 있습니다.
단기어 G2와 G3에서 결함이 발생하기 전에 총 10개의 정상 데이터 세트가 수집되었습니다. 기어는 나일론으로 성형되었으므로, 취미용 칼을 사용하여 톱니 공간에서 홈을 파 두 기어에 시뮬레이션용 균열을 만들었습니다. 톱니 공간이란 두 개의 인접한 톱니 사이의 간격으로, 평톱니의 피치 원을 따라 측정됩니다. 홈의 깊이는 기어 반지름의 약 70%였습니다. 기어 G2와 G3에 결함이 발생한 후에 총 10개의 결함 데이터 세트가 기록되었습니다.
데이터 시각화하기
mcsaData.mat
파일은 각 타임테이블이 하나의 데이터 세트에 대응하는 타임테이블로 구성된 10×2 테이블 servoData
를 포함합니다. servoData
의 첫 번째 열은 정상 데이터로 구성된 10개의 타임테이블을 포함하고, 두 번째 열은 결함 데이터로 구성된 10개의 타임테이블을 포함합니다. 각 데이터 세트는 1500Hz로 샘플링된 약 11초 분량의 데이터를 포함합니다.
데이터를 불러옵니다.
load('mcsaData.mat','servoData') servoData
servoData=10×2 table
healthyData faultyData
___________________ ___________________
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
{16384x2 timetable} {16384x2 timetable}
head(servoData.healthyData{1,1})
Time Pulse Signal ______________ _____ ______ 0 sec 0 66.523 0.00066667 sec 0 62.798 0.0013333 sec 0 63.596 0.002 sec 0 64.128 0.0026667 sec 0 60.669 0.0033333 sec 0 62.798 0.004 sec 0 65.459 0.0046667 sec 0 56.678
servoData
의 각 타임테이블은 첫 번째 열에는 회전속도계 신호가 있고 두 번째 열에는 전류 신호가 있는 하나의 데이터 세트를 포함합니다.
이 예제에서는 정상 데이터 한 세트와 결함 데이터 한 세트를 사용하여 전류 신호와 회전속도계 펄스를 시각화합니다.
healthyData = servoData.healthyData{1,1}; faultyData = servoData.faultyData{1,1}; healthyCurrent = healthyData.Signal; faultyCurrent = faultyData.Signal; healthyTacho = healthyData.Pulse; faultyTacho = faultyData.Pulse; tHealthy = healthyData.Time; tFaulty = faultyData.Time; figure ax1 = subplot(221); plot(tHealthy,healthyCurrent) title('Current Signal - Healthy Gears') ylabel('Current (mA)') ax2 = subplot(222); plot(tFaulty,faultyCurrent) title('Current Signal - Faulty Gears') ylabel('Current (mA)') ax3 = subplot(223); plot(tHealthy,healthyTacho) title('Tachometer Pulse - Healthy Gears') ylabel('Pulses, 8/rev') ax4 = subplot(224); plot(tFaulty,faultyTacho) title('Tachometer Pulse - Faulty Gears') ylabel('Pulses, 8/rev') linkaxes([ax1,ax2,ax3,ax4],'x'); ax1.XLim = seconds([0 2]);
서보의 출력 스플라인은 1회전당 8번의 펄스를 갖는데, 이는 서보 휠에 있는 8개 구멍에 대응됩니다.
공칭 Rpm 계산
공칭 속도를 계산하여 기어 시스템의 관심 주파수를 감지하고 이를 파워 스펙트럼의 주파수에 올바르게 매칭합니다. 샘플링 주파수 값 1500Hz를 사용하고, tachorpm
을 사용하여 회전속도계 신호를 시각화하고 공칭 rpm을 계산합니다.
fs = 1500;
figure
tachorpm(healthyTacho,fs,'PulsesPerRev',8)
figure
tachorpm(faultyTacho,fs,'PulsesPerRev',8)
rpmHealthy = mean(tachorpm(healthyTacho,fs,'PulsesPerRev',8))
rpmHealthy = 49.8550
rpmFaulty = mean(tachorpm(faultyTacho,fs,'PulsesPerRev',8))
rpmFaulty = 49.5267
출력 축 속도에서 정상 데이터 세트와 결함 데이터 세트 간의 차이가 매우 작은 것을 볼 수 있습니다. 실제 공칭 rpm 값은 이론적인 값 50rpm에도 매우 가깝습니다. 따라서 정상 신호 분석과 결함 신호 분석 양쪽에서 동일한 값 49.9rpm을 사용하는 것을 고려해 보십시오.
주파수 대역 생성
주파수 대역을 생성하는 것은 스펙트럼 메트릭의 계산을 위한 중요한 사전 작업입니다. 기어 트레인의 구동 기어의 톱니 개수와 공칭 rpm을 사용하여 먼저 관심 주파수를 계산합니다. 관심 주파수란 그 값이 아래 표에 나와 있는 이론적인 값에 가까운 실제 출력 속도 값(단위: 헤르츠)입니다.
G4 = 41; G3 = 35; G2 = 50; G1 = 62; P4 = 16; P3 = 10; P2 = 10; P1 = 10; rpm = rpmHealthy; FS5 = mean(rpm)/60; FS4 = G4/P4*FS5; FS3 = G3/P3*FS4; FS2 = G2/P2*FS3; FS1 = G1/P1*FS2; FS = [FS1,FS2,FS3,FS4,FS5]
FS = 1×5
231.0207 37.2614 7.4523 2.1292 0.8309
다음으로, faultBands
를 사용하여 모든 출력 속도에 대해 주파수 대역을 생성합니다. 여기에는 다음 주파수가 포함됩니다.
FS1 - 231Hz, 처음 두 개의 고조파, FS2의 0:1 측파대
FS2 - 37.3Hz, 처음 두 개의 고조파, FS3의 0:1 측파대
FS3 - 7.5Hz, 처음 두 개의 고조파
FS4 - 2.1Hz, 처음 두 개의 고조파
[FB1,info1] = faultBands(FS1,1:2,FS2,0:1); [FB2,info2] = faultBands(FS2,1:2,FS3,0:1); [FB3,info3] = faultBands(FS3,1:2); [FB4,info4] = faultBands(FS4,1:2); FB = [FB1;FB2;FB3;FB4]
FB = 16×2
187.9838 199.5348
225.2452 236.7962
262.5066 274.0577
419.0045 430.5556
456.2659 467.8170
493.5273 505.0784
28.8776 30.7407
36.3299 38.1929
43.7822 45.6452
66.1390 68.0021
⋮
출력값 FB
는 관심 주파수에 해당하는 주파수 범위로 구성된 16×2 배열입니다.
파워 스펙트럼 밀도(PSD) 데이터 추출
정상 데이터와 결함 데이터의 파워 스펙트럼을 계산하고 시각화합니다. 구조체 info
의 정보를 사용하여 스펙트럼 플롯 위에 관심 주파수를 플로팅합니다.
figure pspectrum(healthyCurrent,fs,'FrequencyResolution',0.5) hold on pspectrum(faultyCurrent,fs,'FrequencyResolution',0.5) hold on info1.Labels = regexprep(info1.Labels,'F0','FS1'); info1.Labels = regexprep(info1.Labels,'F1','FS2'); helperPlotXLines(info1,[0.5 0.5 0.5]) info2.Labels = regexprep(info2.Labels,'F0','FS2'); info2.Labels = regexprep(info2.Labels,'F1','FS3'); helperPlotXLines(info2,[0.5 0.5 0.5]) info3.Labels = regexprep(info3.Labels,'F0','FS3'); helperPlotXLines(info3,[0.5 0.5 0.5]) info4.Labels = regexprep(info4.Labels,'F0','FS4'); helperPlotXLines(info4,[0.5 0.5 0.5]) legend('Healthy Data','Faulty Data','Location','South') hold off
파란색 플롯은 정상 스펙트럼을 나타내고, 빨간색 플롯은 결함 데이터의 스펙트럼을 나타냅니다. 플롯에서 결함 주파수의 진폭이 증가하는 것을 볼 수 있습니다.
231Hz에 1FS1, 462Hz에 두 번째 고조파 2FS1, 그리고 각각의 측파대
플롯을 확대하면 다음과 같은 나머지 주파수의 진폭 증가를 관찰할 수 있습니다.
37.2Hz에 1FS2, 그리고 그 측파대
7.5Hz에 1FS3, 15Hz에 두 번째 고조파 2FS3
2.1Hz에 1FS4, 4.2Hz에 두 번째 고조파 2FS4
pspectrum
을 사용하여 정상 신호와 결함 신호의 PSD와 주파수 그리드 데이터를 계산하고 저장합니다.
[psdHealthy,fHealthy] = pspectrum(healthyCurrent,fs,'FrequencyResolution',0.5); [psdFaulty,fFaulty] = pspectrum(faultyCurrent,fs,'FrequencyResolution',0.5);
스펙트럼 메트릭 계산
주파수 대역과 PSD 데이터를 사용하고, faultBandMetrics
를 사용하여 정상 데이터와 결함 데이터의 스펙트럼 메트릭을 계산합니다.
spectralMetrics = faultBandMetrics({[psdHealthy,fHealthy],[psdFaulty,fFaulty]},FB)
spectralMetrics=2×49 table
PeakAmplitude1 PeakFrequency1 BandPower1 PeakAmplitude2 PeakFrequency2 BandPower2 PeakAmplitude3 PeakFrequency3 BandPower3 PeakAmplitude4 PeakFrequency4 BandPower4 PeakAmplitude5 PeakFrequency5 BandPower5 PeakAmplitude6 PeakFrequency6 BandPower6 PeakAmplitude7 PeakFrequency7 BandPower7 PeakAmplitude8 PeakFrequency8 BandPower8 PeakAmplitude9 PeakFrequency9 BandPower9 PeakAmplitude10 PeakFrequency10 BandPower10 PeakAmplitude11 PeakFrequency11 BandPower11 PeakAmplitude12 PeakFrequency12 BandPower12 PeakAmplitude13 PeakFrequency13 BandPower13 PeakAmplitude14 PeakFrequency14 BandPower14 PeakAmplitude15 PeakFrequency15 BandPower15 PeakAmplitude16 PeakFrequency16 BandPower16 TotalBandPower
______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ ______________ ______________ __________ _______________ _______________ ___________ _______________ _______________ ___________ _______________ _______________ ___________ _______________ _______________ ___________ _______________ _______________ ___________ _______________ _______________ ___________ _______________ _______________ ___________ ______________
0.0020712 193.75 0.010881 0.50813 231.06 0.46652 0.0019579 272.5 0.011841 0.0020486 424.06 0.011225 0.54982 462 0.89544 0.0024293 493.69 0.0091045 0.002966 29.812 0.0035485 0.015582 37.25 0.011132 0.0028865 44.688 0.0041317 0.011896 67.062 0.0072753 0.059126 74.5 0.033568 0.013218 82 0.0079886 5.7904 7.4375 2.3115 0.068452 14.938 0.027653 0.79006 2.125 0.14382 0.09849 4.25 0.01806 3.9737
0.009804 192.44 0.017916 3.6921 229.44 2.9975 0.0035204 266.44 0.015639 0.0057056 421.75 0.019293 1.2974 459.69 3.2185 0.0053261 495.88 0.016296 0.0031674 28.938 0.0044271 0.023983 37 0.014447 0.0136 44.438 0.0089119 0.011419 66.625 0.0077035 0.0684 74 0.037016 0.012244 81.438 0.0075805 7.7931 7.375 3.0193 0.15692 14.812 0.058255 2.4211 2.125 0.4407 0.55167 4.25 0.10029 9.9838
출력값은 FB
에 있는 주파수 범위에 대한 메트릭으로 구성된 2×49 테이블입니다. 첫 번째 행은 정상 데이터의 메트릭을 포함하고, 두 번째 행은 결함 데이터의 메트릭을 포함합니다. 다음 메트릭의 경우 정상 데이터에 비해 결함 데이터에서 훨씬 높은 값을 갖는 것을 볼 수 있습니다.
PeakAmplitude2
- 주파수 231Hz에서 3.1842 단위만큼의 차이TotalBandPower
- 6.01 단위만큼의 차이
따라서 이 두 메트릭을 사용하여 산점도 플롯을 만들어 결함 데이터 세트와 정상 데이터 세트를 각각 그룹화합니다.
산점도 플롯 생성
테이블 servoData
에 있는 20개의 데이터 세트 모두에 대해 두 개의 스펙트럼 메트릭 PeakAmplitude2
와 TotalBandPower
를 사용하여 정상 데이터와 결함 데이터를 분류하는 산점도 플롯을 만듭니다.
plotData = zeros(10,4); for n = 1:max(size(servoData)) hC = servoData.healthyData{n,1}.Signal; fC = servoData.faultyData{n,1}.Signal; [psdH,freqH] = pspectrum(hC,fs,'FrequencyResolution',0.5); [psdF,freqF] = pspectrum(fC,fs,'FrequencyResolution',0.5); sMetrics = faultBandMetrics({[psdH,freqH],[psdF,freqF]},FB); plotData(n,:) = [sMetrics{:,4}',sMetrics{:,49}']; end figure scatter(plotData(:,1),plotData(:,3),[],'blue') hold on; scatter(plotData(:,2),plotData(:,4),[],'red') legend('Healthy Data','Faulty Data','Location','best') xlabel('Peak Amplitude 2') ylabel('Total Band Power') hold off
정상 데이터 세트와 결함 데이터 세트가 산점도 플롯의 서로 다른 영역에 그룹화된 것을 볼 수 있습니다.
따라서 서보 모터의 전류 시그니처를 분석하여 결함 데이터와 정상 데이터를 분류할 수 있습니다.
분류에 사용할 수 있는 모든 스펙트럼 메트릭을 사용하려면 분류 학습기를 사용하십시오.
헬퍼 함수
헬퍼 함수 helper
PlotXLines
는 구조체 info
의 정보를 사용하여 파워 스펙트럼 플롯 위에 주파수 대역 중앙 선을 플로팅합니다.
function helperPlotXLines(I,c) for k = 1:length(I.Centers) xline(I.Centers(k),'Label',I.Labels(k),'LineStyle','-.','Color',c); end end
참고 문헌
[1] Moster, P.C. "Gear Fault Detection and Classification Using Learning Machines." Sound & vibration. 38. 22-27. 2004