Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

기어 트레인 결함 검출을 위한 모터 전류 신호 분석

이 예제에서는 취미용 서보를 구동하는 전류 신호에 모터 전류 신호 분석(MCSA) 방법을 적용하여 기어 트레인에서 결함을 식별하는 방법을 보여줍니다. MCSA는 토크 또는 속도의 변동을 유발하는 결함을 진단하는 데 유용한 방법으로, 모터 결함 분석에 적합한 것으로 검증된 바 있습니다. 기존의 진동 계측기를 사용한 기어 결함 검출은 가속도계나 기타 진동 센서를 사용해 계측할 때 기어 트레인에 쉽게 접근할 수 없는 경우(원자력 발전소에서의 내부 작업 등) 특히 까다로울 수 있습니다. 이 예제에서는 전류 시그니처 분석을 통해 스펙트럼 메트릭을 추출하여 취미용 서보 모터의 구동 기어에서 결함을 검출하는 방법을 보여줍니다. 전류 신호에서 스펙트럼 메트릭을 얻는 단순화된 워크플로는 다음과 같습니다.

  1. 공칭 rpm을 계산하여 관심 주파수를 감지합니다.

  2. 결함 신호가 존재할 수 있는 주파수 대역을 생성합니다.

  3. 파워 스펙트럼 밀도(PSD) 데이터를 추출합니다.

  4. 관심 주파수 대역에서 스펙트럼 메트릭을 계산합니다.

하드웨어 개요

이 예제에서, 전류 데이터는 연속 회전을 위해 개조된 표준 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]);

Figure contains 4 axes objects. Axes object 1 with title Current Signal - Healthy Gears, ylabel Current (mA) contains an object of type line. Axes object 2 with title Current Signal - Faulty Gears, ylabel Current (mA) contains an object of type line. Axes object 3 with title Tachometer Pulse - Healthy Gears, ylabel Pulses, 8/rev contains an object of type line. Axes object 4 with title Tachometer Pulse - Faulty Gears, ylabel Pulses, 8/rev contains an object of type line.

서보의 출력 스플라인은 1회전당 8번의 펄스를 갖는데, 이는 서보 휠에 있는 8개 구멍에 대응됩니다.

공칭 Rpm 계산

공칭 속도를 계산하여 기어 시스템의 관심 주파수를 감지하고 이를 파워 스펙트럼의 주파수에 올바르게 매칭합니다. 샘플링 주파수 값 1500Hz를 사용하고, tachorpm을 사용하여 회전속도계 신호를 시각화하고 공칭 rpm을 계산합니다.

fs = 1500;
figure
tachorpm(healthyTacho,fs,'PulsesPerRev',8)

Figure contains 2 axes objects. Axes object 1 with title Tachometer Signal, xlabel Time (secs), ylabel Volts contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Detected pulses, State levels. Axes object 2 with title RPM Signal, ylabel RPMs contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent RPM signal, RPM at pulses.

figure
tachorpm(faultyTacho,fs,'PulsesPerRev',8)

Figure contains 2 axes objects. Axes object 1 with title Tachometer Signal, xlabel Time (secs), ylabel Volts contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Detected pulses, State levels. Axes object 2 with title RPM Signal, ylabel RPMs contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent RPM signal, RPM at pulses.

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

Figure contains an axes object. The axes object with title Fres = 500 mHz, xlabel Frequency (Hz), ylabel Power Spectrum (dB) contains 18 objects of type line, constantline. These objects represent Healthy Data, Faulty Data.

파란색 플롯은 정상 스펙트럼을 나타내고, 빨간색 플롯은 결함 데이터의 스펙트럼을 나타냅니다. 플롯에서 결함 주파수의 진폭이 증가하는 것을 볼 수 있습니다.

  • 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개의 데이터 세트 모두에 대해 두 개의 스펙트럼 메트릭 PeakAmplitude2TotalBandPower를 사용하여 정상 데이터와 결함 데이터를 분류하는 산점도 플롯을 만듭니다.

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

Figure contains an axes object. The axes object with xlabel Peak Amplitude 2, ylabel Total Band Power contains 2 objects of type scatter. These objects represent Healthy Data, Faulty Data.

정상 데이터 세트와 결함 데이터 세트가 산점도 플롯의 서로 다른 영역에 그룹화된 것을 볼 수 있습니다.

따라서 서보 모터의 전류 시그니처를 분석하여 결함 데이터와 정상 데이터를 분류할 수 있습니다.

분류에 사용할 수 있는 모든 스펙트럼 메트릭을 사용하려면 분류 학습기를 사용하십시오.

헬퍼 함수

헬퍼 함수 helperPlotXLines는 구조체 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

참고 항목

| | |