이 저장소에는 Arduino 용 Truerms C ++ 라이브러리가 포함되어 있습니다. 이 라이브러리를 사용하면 ADC 입력 신호의 평균 값과 RMS (루트 평균 제곱) 또는 유효 값을 계산할 수 있습니다. 이 라이브러리는 또한 전압 및 전류 입력 신호의 실제 전력 및 전력 계수를 계산합니다. 버전 1.3에서 에너지 계량이 프로젝트에 추가되었습니다.
전류의 전압 및 전압 표현은 ADC의 0-5V 호환 전압 범위 내로 측정 된 수량을 확장하기 위해 적절한 입력 회로를 사용하여 Arduino의 ADC로 측정 할 수 있습니다. 제공된 솔루션은 측정 된 수량을 스케일링하기 위해 간단한 방법을 사용합니다. 사용자는 AC 입력 전압 및 전류의 전체 스케일 피크 대 피크 값 만 정의하면됩니다. 측정 된 수량의 단위가 볼트 및 암페어로 정의되면 계산 된 전력은 와트이고 에너지는 WS (Joules)입니다. 이 라이브러리는 다른 플랫폼에서 쉽게 휴대 할 수 있습니다.
다음 라이브러리 수업이 구현됩니다.
AverageRmsRms2PowerPower2평균은 ADC의 여러 입력 샘플 (일반적으로)의 평균값을 계산합니다. RMS 또는 RMS2는 신호의 루트 평균 제곱 값을 계산하기위한 것이며 전력 또는 Power2는 전압 및 전류 입력의 전력을 계산하기위한 것입니다.
RMS2 및 Power2는 샘플 시간 슬롯에 대한 처리 부담을 확산시켜 인터럽트 서비스 루틴에 사용될 때 더 잘 수행되고 있습니다. 하나의 RMS 획득 실행 (스캔)의 샘플 수는 창 으로 정의됩니다. RMS2 및 Power2는 자동 기준선 복원 옵션이 켜져있을 때 하나의 추가 샘플 시간 슬롯 (창 길이 +1)을 차지합니다.
다음 방법이 있습니다.
begin()start()stop()update()update1()update2()publish() 빠른 시작하려면 도서관과 함께 제공되는 Arduino 스케치 예제를 확인하십시오.
성공적인 구현을 위해 따라야 할 단계입니다.
begin() 로 초기화하십시오. 이 방법은 초기화를위한 것이며 측정 장치의 스케일링, 샘플링 창의 크기, 중고 ADC의 비트 수 (또는 입력 신호) 및 획득 모드 (연속 스캔/단일 스캔)를 설정하려면 입력이 필요합니다.start() 호출하십시오.update() (또는 update1() + update2() Power2 의 일정한 속도로 반복적으로 호출하십시오.publish() 에게 전화하십시오. Power2 class update ()의 경우 update1() 및 update2() 로 나뉩니다. 입력 전압 및 update2() 에서 샘플을 입력 전류 또는 VICA Versa (전압 전류)로부터 처리하려면 샘플을 먼저 처리하려면 update1() 호출되어야합니다. 샘플링 전압 및 전류는 일반적으로 다중 ADC에 대해 순서대로 발생합니다.
클래스 평균 사용 :
void begin(float range, unsigned char window, unsigned char nob, bool mode);
와 함께:
range AC 입력 신호 (피크-피크 값)의 최대 예상 풀 스윙입니다.window 샘플 창의 길이를 샘플 수의 전체 샘플로 표현합니다.nob 는 입력 신호 (ADC 비트 깊이)의 비트 해상도입니다. 사전 정의 된 상수를 사용하십시오 : ADC_8BIT , ADC_10BIT 또는 ADC_12BIT .mode 모드를 연속 스캔 또는 단일 스캔으로 설정합니다. predifined 상수 CNT_SCAN 또는 SGL_SCAN 사용하십시오. void start(void); 이 방법은 연속 스캔 및 단일 스캔 모드에 대한 획득을 시작합니다.
void stop(void); 이 방법은 획득을 중지합니다.
void update(int instVal); 현재 샘플 값을 할당하십시오.
void publish(void); 마지막으로 완료된 획득 실행에서 결과를 게시하십시오. 결과는 다음에 정의 된대로 출력 변수입니다.
공개 정의 변수는 다음과 같습니다.
int instVal 마지막으로 획득 한 샘플의 값
float average - 평균 값 결과
bool acquire - 상태 비트, 스캔이 보류 중일 때 true.
클래스 rms 또는 rms2 의 경우 사용하십시오.
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
와 함께:
range 는 AC-Signal (피크 대 피크 값)의 최대 예상 풀 스윙입니다.window 샘플 창의 길이는 전체 수의 샘플로 표현됩니다.nob 는 입력 신호의 비트 해상도입니다. 일반적으로 이것은 ADC 비트 깊이입니다. 사전 정의 된 상수를 사용하십시오 : ADC_8BIT , ADC_10BIT 또는 ADC_12BIT .blr 자동으로 기준선 복원 기능을 켜거나 끄는 것을 설정합니다. predifined 상수 BLR_ON 또는 BLR_OFF 사용하십시오.mode 모드를 연속 스캔 또는 단일 스캔으로 설정합니다. predifined 상수 CNT_SCAN 또는 SGL_SCAN 사용하십시오. void start(void); 이 방법은 연속 스캔 및 단일 스캔 모드에 대한 획득을 시작합니다.
void stop(void); 이 방법은 획득을 중지합니다.
void update(int instVal); 현재 샘플 값을 할당하십시오.
void publish(void); 마지막으로 완료된 획득 실행에서 결과를 게시하십시오. 결과는 다음에 정의 된대로 출력 변수입니다.
공개 정의 변수는 다음과 같습니다.
int instVal 마지막으로 획득 한 샘플의 값은 Blr_on 일 때 기준으로 복원되었습니다.
float rmsVal rms 값 결과
int dcBias ADC 유닛의 DCBIAS 값. blr_on 일 때만 관련이 있습니다
bool acquire - 상태 비트, 스캔이 보류중인 경우 True
클래스 전력 사용 :
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
와 함께:
range1, range2 전압 및 전류의 AC-Signals (피크 대 피크 값)의 최대 예상 전체 스윙입니다.window 샘플 창의 길이는 전체 수의 샘플로 표현됩니다.nob 는 입력 신호의 비트 해상도입니다. 일반적으로 이것은 ADC 비트 깊이입니다. 예정된 상수를 사용하여 ADC_8BIT , ADC_10BIT 또는 ADC_12BIT 사용하십시오.blr 자동으로 기준선 복원 기능을 켜거나 끄는 것을 설정합니다. predifined 상수 BLR_ON 또는 BLR_OFF 사용하십시오.mode 모드를 연속 스캔 또는 단일 스캔으로 설정합니다. predifined 상수 CNT_SCAN 또는 SGL_SCAN 사용하십시오. void start(void); 이 방법은 연속 스캔 및 단일 스캔 모드에 대한 획득을 시작합니다.
void stop(void); 이 방법은 획득을 중지합니다.
void update(int instVal1, int instVal2); 현재 샘플 값 (예 : 전압 및 전류)을 한 번에 할당하십시오.
void publish(void); 마지막으로 완료된 획득 실행에서 결과를 게시하십시오. 결과는 다음에 정의 된대로 출력 변수입니다.
공개 정의 변수는 다음과 같습니다.
int instVal1 마지막으로 획득 한 샘플 (전압)의 값은 blr_on 일 때 기준선으로 복원되었습니다.
int instVal2 마지막으로 획득 한 샘플 (현재)의 값은 Blr_on 일 때 기준으로 복원되었습니다.
float rmsVal1 -rms value1 (전압)
float rmsVal2 -rms value2 (현재)
int dcBias1 adc -units의 dcbias1 값. blr_on 일 때만 관련이 있습니다
int dcBias2 adc -unit의 dcbias2 값. blr_on 일 때만 관련이 있습니다
float apparentPwr 명백한 힘
float realPwr 진짜 힘
float pf 파워 팩터
float energy - 네토 에너지
bool acquire - 상태 비트, 스캔이 보류중인 경우 True
클래스 Power2 사용 :
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
와 함께:
range1, range2 전압 및 전류의 AC-Signals (피크 대 피크 값)의 최대 예상 전체 스윙입니다.window 샘플 창의 길이는 전체 수의 샘플로 표현됩니다.nob 는 입력 신호의 비트 해상도입니다. 일반적으로 이것은 ADC 비트 깊이입니다. 예정된 상수를 사용하여 ADC_8BIT , ADC_10BIT 또는 ADC_12BIT 사용하십시오.blr 자동으로 기준선 복원 기능을 켜거나 끄는 것을 설정합니다. predifined 상수 BLR_ON 또는 BLR_OFF 사용하십시오.mode 모드를 연속 스캔 또는 단일 스캔으로 설정합니다. predifined 상수 CNT_SCAN 또는 SGL_SCAN 사용하십시오. void start(void); 이 방법은 연속 스캔 및 단일 스캔 모드에 대한 획득을 시작합니다.
void stop(void); 이 방법은 획득을 중지합니다.
void update1(int instVal); 예를 들어 전압에 대해 현재 샘플 값을 할당하십시오.
void update2(int instVal); 예를 들어 현재 샘플 값을 할당하십시오. 샘플링 루프에서 update1() 및 update2() 대체로 호출하십시오.
void publish(void); 마지막으로 완료된 획득 실행에서 결과를 게시하십시오. 결과는 다음에 정의 된대로 출력 변수에서 사용할 수 있습니다.
공개 정의 변수는 다음과 같습니다.
int instVal1 마지막으로 획득 한 샘플 (전압)의 값은 blr_on 일 때 기준선으로 복원되었습니다.
int instVal2 마지막으로 획득 한 샘플 (현재)의 값은 Blr_on 일 때 기준으로 복원되었습니다.
float rmsVal1 -rms value1 (전압)
float rmsVal2 -rms value2 (현재)
int dcBias1 adc -units의 dcbias1 값. blr_on 일 때만 관련이 있습니다
int dcBias2 adc -unit의 dcbias2 값. blr_on 일 때만 관련이 있습니다
float apparentPwr , 명백한 힘
float realPwr 진짜 힘
float pf 파워 팩터
float energy - 네토 에너지
bool acquire - 상태 비트, 스캔이 보류중인 경우 True
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
인수는 다음을 의미합니다.
전체 ADC 범위 (0 ~ 5Volts)는 700V의 신호 피크-피크 값을 나타냅니다. 이는 사인파에 대해 350V 또는 247.5VRM의 신호 진폭과 같습니다.
RMS 윈도우는 40 개의 샘플이며, 이는 샘플링 속도가 1000 샘플/Sec에서 선택 될 때 2 개의 50Hz 사이클을 포함한다는 것을 의미합니다.
ADC 비트 해상도는 10 비트 (Arduino Uno)입니다.
BLR_ON은 기준 복원이 켜져 있음을 의미합니다. ADC와의 AC-Signal을 캡처하려면 ADC 입력 회로와 함께 DC- 오프셋 전압을 추가하여 신호의 0 값을 ADC 범위의 중간 점으로 이동해야합니다. 이 오프셋은 획득 한 ADC 값에서 일정한 값을 빼서 소프트웨어에서 나중에 수정해야합니다. 이 수정은 BLR_ON으로 자동으로 수행 할 수 있으며 교정이 필요하지 않습니다. 그림 1에서 파란색 선은 전압 스윙이 5V이고 2.5V에서 바이어스 된 최대 스케일링 입력 신호를 나타냅니다. 녹색 라인은 진폭이 1V이며 1V/SQRT (2) = 0.71VRM을 측정하는 입력 신호를 보여줍니다.

옵션 CNT_SCAN을 사용하면 획득이 연속 모드로 설정됩니다. 마지막 스캔을 완료 한 후 획득이 자동으로 다시 시작됩니다.
gridVolt.update(adcVal); 기본 루프 또는 인터럽트 서비스 루틴 (ISR)에서. 루프가 일정한 속도로 반복되는지 확인하십시오.
gridVolt.publish() 로 결과를 얻고 rms 값을 얻으십시오 : float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino 이 예제는 ADC로 측정 된 신호의 평균 값을 계산하는 방법을 보여줍니다.
Measure_rms.ino 이 예에서는 ADC 입력 전압의 RMS 값이 결정됩니다.
AC_powermeter.ino 이 예제는 완전한 AC- 전원 측정 응용 프로그램을 보여줍니다. 두 개의 ADC 채널에서 입력으로 전류의 전압 및 전압 표현이 모두 필요합니다. 전압 및 전류의 RMS 값, 명백한 전력, 실제 전력 및 전력 계수를 계산합니다.
AC_powermeter_advanced.ino 이 예제는 또한 완전한 AC- 전원 측정 응용 프로그램을 보여줍니다. 더 나은 안정적인 판독 값을 얻기 위해 인터럽트 기준으로 실행됩니다. 전압과 전류는 모두 3kHz에서 샘플링됩니다. Arduino LED가 조명되면 ADC 클립 (너무 높은 입력 피크 전압) 또는 DC가 범위를 벗어납니다.
Energy_metering.ino WH의 전압, 전류, 실제 전력 및 순 에너지를 보여줍니다.
Arduino ADC와 AC 고전압을 인터페이스하는 가장 간단한 방법은 전압 변환기 (예 : Lem USA Inc) 의 LV 25-P 전압 변환기를 사용하는 것입니다.이 트랜스 듀서는 단일 패키지의 갈바닉 분리, 스케일링 및 레벨 이동을 제공합니다. 전류 감지의 경우 LEM은 전압 변환기와 동일한 장점을 갖는 LEM_LA55-P를 제조합니다.
개별 구성 요소에서 입력 스케일링 회로를 구축하는 것을 선호하는 경우, Texas Instruments의 전압 소스 인버터 참조 설계에 속하는 응용 프로그램 노트 Tiduay6c.pdf에 자세한 설계 설명이 제시되어 있습니다. 경고에 주목하십시오! 제안 된 회로는 Arduino의 0-5V 범위에 쉽게 적응할 수 있습니다.
항상 안전을 위해 분리 변압기를 사용하십시오!
3 상 전력 측정.
대체 Arduino-ide Sloeber를 사용 하여이 라이브러리 개발에 많은 시간이 절약되었습니다. Sloeber는 Eclipse를위한 훌륭한 Arduino 플러그인입니다. Jantje와 그의 기고자들에게 감사합니다!