본문 바로가기
임베디드 프로젝트

전류 CT 센서 인터페이스 모듈 - RMS 취득 펌웨어

by MachineJW 2024. 8. 21.

1. 개발 이슈 ( issue )

(1) 오프셋(Offset) 전압

3.3V를 저항분배법칙을 활용하여 1.65V의 오프셋 전압을 활용

  • 오차율 0.1%의 0603 저항기와 탄탈 커패시터를 활용하여 오프셋 전압 (1.65V) 오차를 최소화 하려 노력해 보았지만, 실제 테스트 펌웨어 작업 후 약 20mV 정도의 오차를 보였다. 

이상적으로는 1650mV가 유지되어야 하지만 완전하게 유지되지 못함

  • 즉, 이상적으로는 오프셋 전압이1650mV가 유지되어야 한다. 그러나 ADS1115 ADC를 통하여 측정해본 결과는 1640~1665mV로 미세하게 오프셋 전압이 유지되지 못하는 현상이 있었다.
  • 원인은 실제로 인입되는 노이즈이거나 3.3V LDO에서 출력되는 전류에 따라 전압이 미세하게 바뀌는 특성 때문일 것이라고 추정된다. 
  • 해결하기 위해서는 오프셋 전압을 오차율이 최대한 적은 1.65V LDO를 활용해보는 것인데, 찾아본 결과 이 마저도 0.5%의 오차율을 가지기 때문에 그닥 좋을 것 같진 않다. (PCB 조립 제작 시 원가 비용도 상승한다.)
  • 그래서 나름대로 결과에 만족하면서 앞으로도 0.1%의 오차율을 가진 저항기와 탄탈커패시터를 활용해볼 생각이다.

(2) Burden 저항기 (션트저항기) 

  • 56옴을 활용하여 최대 50A의 RMS 전류를 측정할 것이라고 계산하여 설계하였지만 Root Mean Square (제곱평균제곱근) 방식이라는 것을 간과하였다.

정현파의 RMS를 설명하는 그림

  •  2000:1 권선비의 CT센서일 경우를 가정하여 50A rms의 전류 신호는 25mA rms 전류 신호가 발생한다.
  • 56옴의 션트저항기에는 3.2V의 rms 전압이 발생하고, 실제 피크(Peak)는 1.414배인 약 4.5V의 전압이 발생하게 된다.
사인파 RMS 규칙
(AC 교류 전기 신호 규칙)
RMS 값은 양의 피크 값의 0.707배
RMS 값은 음의 피크 값의 -0.707배
양의 피크 값은 RMS 값의 1.414배
음의 피크 값은 RMS 값의 -1.414배
RMS 값은 대략 피크-피크 값의 0.354배
피크-피크 값은 RMS 값의 2.828배
  • 위의 계산 식으로 다시 생각해 보았을 때, 56옴의 션트저항기는 최대 50A rms 전류를 측정할 수 있는 것이 아니라 최대 약 41A rms 전류를 측정할 수 있다.
  • 계산식과 최대 전류 계산을 도와주는 도구는 아래에서 참조해보자.
  • I_RMS = (((system_voltage / 2.0) / burden_resistor) * Turns) * 0.707
  • https://tyler.anairo.com/projects/open-energy-monitor-calculator
 

OpenEnergyMonitor Current Sensor Calculator

 

tyler.anairo.com

2. RMS 전류 (mA) 데이터 취득 펌웨어

double getIrms(unsigned int samplingCnt) {

  bool acFlag = false;
  double adcValue = 0.0;

  double peak_p = 0.0;  // 양의 peak 전압
  double peak_n = 0.0;  // 음의 peak 전압

  // 1. AC Signal을 감지한다. (DC 신호 필터링)
  for (int i = 0; i < 10; i++) {
    // 10회 샘플링하여 Peak to Peak를 비교, 임계값 (0.25mV) 보다 크면 AC 신호로 감지
    adcValue = (ads1115.readADC_SingleEnded(0) * 0.125) - OFFSET_VOLTAGE;
    if ((adcValue >= 0.0) && (adcValue > peak_p)) peak_p = adcValue;
    else if ((adcValue <= 0.0) && (adcValue < peak_n)) peak_n = adcValue;
  }

  if (peak_p - peak_n >= 0.30) acFlag = true;
  else {
    acFlag = false;
    return 0.0;
  }

  // 2. AC 신호가 감지 되었다면 RMS (mV) 값을 구한다.
  if (acFlag) {
    peak_p = 0.0;
    peak_n = 0.0;

    unsigned int p_cnt = 0;
    unsigned int n_cnt = 0;

    for (unsigned int n = 0; n < samplingCnt; n++) {
      adcValue = (ads1115.readADC_SingleEnded(0) * 0.125) - OFFSET_VOLTAGE;  // mV
      // 양의 피크 및 음의 피크 샘플링
      if (adcValue >= 0.0) {
        peak_p += adcValue;
        p_cnt++;
      } else if (adcValue <= 0.0) {
        peak_n += adcValue;
        n_cnt++;
      }
    }

    // 평균 피크 투 피크 구하기
    peak_p /= double(p_cnt);
    peak_n /= double(n_cnt);

    double rms_mV = (peak_p - peak_n) * 0.354;  // RMS 값은 peak to peak 값의 0.354배

    // 3. RMS (mV)를 RMS (mA)로 환산
    double rms_mA = rms_mV * CT_CAL;  // 실제 RMS 전류 값 mA 환산 (CT_CAL = 적절한 조정값)
    return rms_mA;
  } else return 0.0;
}

3. 펌웨어 적용 결과

아무런 부하가 연결되지 않은 상태
6.1A를 소비하는 부하를 연결하여 측정한 결과
8.25 A 를 소비하는 부하를 연결하여 측정한 결과
스마트플러그와 비교해 보았을때, 나름 정확한 측정값이 나온다.

  • 잠시 발생하는 노이즈와 같은 현상을 막기 위한 DC 필터링 알고리즘Peak to Peak 의 값을 샘플링하여 mA로 환산하는 알고리즘의 결과는 매우 만족스러웠다.
  • 더 많은 테스트가 필요하겠지만 작년부터 연구한 성과가 나온 것 같아 매우 만족스럽다.

▼ 테스트 영상 ▼

https://youtube.com/shorts/vtF6lVrAbss?feature=share

CT 센서 모듈 전류 측정 테스트 영상