1. 개발 이슈 ( issue )
(1) 오프셋(Offset) 전압
- 오차율 0.1%의 0603 저항기와 탄탈 커패시터를 활용하여 오프셋 전압 (1.65V) 오차를 최소화 하려 노력해 보았지만, 실제 테스트 펌웨어 작업 후 약 20mV 정도의 오차를 보였다.
- 즉, 이상적으로는 오프셋 전압이1650mV가 유지되어야 한다. 그러나 ADS1115 ADC를 통하여 측정해본 결과는 1640~1665mV로 미세하게 오프셋 전압이 유지되지 못하는 현상이 있었다.
- 원인은 실제로 인입되는 노이즈이거나 3.3V LDO에서 출력되는 전류에 따라 전압이 미세하게 바뀌는 특성 때문일 것이라고 추정된다.
- 해결하기 위해서는 오프셋 전압을 오차율이 최대한 적은 1.65V LDO를 활용해보는 것인데, 찾아본 결과 이 마저도 0.5%의 오차율을 가지기 때문에 그닥 좋을 것 같진 않다. (PCB 조립 제작 시 원가 비용도 상승한다.)
- 그래서 나름대로 결과에 만족하면서 앞으로도 0.1%의 오차율을 가진 저항기와 탄탈커패시터를 활용해볼 생각이다.
(2) Burden 저항기 (션트저항기)
- 56옴을 활용하여 최대 50A의 RMS 전류를 측정할 것이라고 계산하여 설계하였지만 Root Mean Square (제곱평균제곱근) 방식이라는 것을 간과하였다.
- 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. 펌웨어 적용 결과
- 잠시 발생하는 노이즈와 같은 현상을 막기 위한 DC 필터링 알고리즘과 Peak to Peak 의 값을 샘플링하여 mA로 환산하는 알고리즘의 결과는 매우 만족스러웠다.
- 더 많은 테스트가 필요하겠지만 작년부터 연구한 성과가 나온 것 같아 매우 만족스럽다.
▼ 테스트 영상 ▼
https://youtube.com/shorts/vtF6lVrAbss?feature=share
'임베디드 시스템 프로젝트' 카테고리의 다른 글
임베디드 (ESP32) 보드 개발 이슈 사항 (1) | 2025.01.27 |
---|---|
PNP BJT 스위칭 출력 이슈 (0) | 2024.09.05 |
전류 CT 센서 인터페이스 모듈 - 테스트 구현 (0) | 2024.08.12 |
전류 CT 센서 인터페이스 모듈 - 설계 및 주문 완료 (0) | 2024.07.27 |
ESP32 데이터수집장치 보드 제작 (0) | 2024.07.10 |