Este repositório contém a biblioteca Truerms C ++ para Arduino. Com esta biblioteca, é possível calcular o valor médio e o RMS (quadrado médio da raiz) ou o valor efetivo do sinal de entrada ADC. Esta biblioteca também calcula a potência real , aparente e o fator de potência de ambos, tensão e sinais de entrada de corrente. Na versão 1.3, a medição de energia foi adicionada ao projeto.
A tensão e a representação de tensão de uma corrente podem ser medidas com o ADC do Arduino usando circuitos de entrada apropriados para escalar as quantidades medidas até a faixa de tensão compatível com 0-5V do ADC. A solução fornecida usa um método simples para escalar as quantidades medidas. O usuário deve definir apenas o valor de pico a pico em escala completa da tensão e corrente de entrada CA. Quando as unidades das quantidades medidas são definidas em volts e amperes, a potência calculada está em watt e a energia em WS (Joules). Esta biblioteca é fácil portátil para outras plataformas.
As seguintes classes da biblioteca são implementadas:
AverageRmsRms2PowerPower2A média calcula o valor médio de várias amostras de entrada (geralmente) do ADC. RMS ou RMS2 destinam-se a calcular o valor da raiz média quadrada de um sinal e Power ou Power2 destina-se a calcular a potência a partir de tensão e entrada de corrente.
O RMS2 e o Power2 estão com melhor desempenho quando usados em uma rotina de serviço de interrupção, espalhando a carga de processamento sobre os slots de tempo da amostra. O número de amostras para uma execução de aquisição RMS (Scan) é definida como janela . RMS2 e Power2 ocupam um slot de tempo extra de amostra (comprimento da janela +1) quando a opção de restauração automática da linha de base estiver ligada (BLR_ON).
Os seguintes métodos existem:
begin()start()stop()update()update1()update2()publish() Para um início rápido, verifique o exemplo de esboços de Arduino que acompanham a biblioteca.
Estas são as etapas a seguir para uma implementação bem -sucedida:
begin() . Este método é para inicializar e precisa de entrada para definir a escala das unidades de medição, o tamanho da janela de amostragem, o número de bits do ADC usado (ou sinal de entrada) e o modo de aquisição (varredura contínua/varredura única).start() para iniciar a aquisição.update() (ou update1() + update2() para Power2 ) repetidamente a uma taxa constante.publish() para obter os resultados. Para a classe Power2 Update () é dividido em update1() e update2() . update1() deve ser chamado primeiro para processar a amostra a partir da tensão de entrada e update2() para processar a amostra da corrente de entrada ou VICA versa (tensão-corrente). A tensão de amostragem e a corrente geralmente ocorre em sequência para um ADC multiplexado.
Para o uso médio da classe:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
Com:
range é o máximo máximo esperado do sinal de entrada CA (valor de pico a pico).window o comprimento da janela da amostra, expressa em um número inteiro de amostras.nob é a resolução de bits do sinal de entrada (profundidade do bit ADC). Use as constantes predefinidas: ADC_8BIT , ADC_10BIT ou ADC_12BIT .mode define o modo para varredura contínua ou varredura única. Use as constantes predifinadas CNT_SCAN ou SGL_SCAN . void start(void); Este método inicia a aquisição para varredura contínua e modo de varredura única.
void stop(void); Este método interrompe a aquisição.
void update(int instVal); Atribua o valor da amostra atual.
void publish(void); Publique os resultados da última execução de aquisição concluída. Os resultados estão nas variáveis de saída, conforme definido a seguir.
As variáveis definidas pelo público são:
int instVal - o valor da última amostra adquirida
float average - o resultado médio do valor
bool acquire - bit de status, verdadeiro quando a digitalização está pendente.
Para o uso da classe RMS ou RMS2 :
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
Com:
range é o máximo de swing máximo esperado do sinal AC (valor de pico a pico).window O comprimento da janela de amostra expresso em um número inteiro de amostras.nob é a resolução de bits do sinal de entrada, geralmente essa é a profundidade do bit ADC. Use as constantes predefinidas: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr define a função de restauração automaticamente de linha de base ligada ou desativada. Use as constantes predifinadas BLR_ON ou BLR_OFF .mode define o modo para varredura contínua ou varredura única. Use as constantes predifinadas CNT_SCAN ou SGL_SCAN . void start(void); Este método inicia a aquisição para varredura contínua e modo de varredura única.
void stop(void); Este método interrompe a aquisição.
void update(int instVal); Atribua o valor da amostra atual.
void publish(void); Publique os resultados da última execução de aquisição concluída. Os resultados estão nas variáveis de saída, conforme definido a seguir.
As variáveis definidas pelo público são:
int instVal - o valor da última amostra adquirida, restaurada na linha de base quando blr_on
float rmsVal - o resultado do valor RMS
int dcBias - o valor do dcbias nas unidades ADC. Apenas relevante quando blr_on
bool acquire - bit de status, verdadeiro se a varredura estiver pendente
Para o uso de energia da classe:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Com:
range1, range2 é o máximo de movimento total esperado dos sinalizadores AC (valor de pico a pico) da tensão e corrente.window O comprimento da janela de amostra expresso em um número inteiro de amostras.nob é a resolução de bits do sinal de entrada, geralmente essa é a profundidade do bit ADC. Use as constantes predifinadas: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr define a função de restauração automaticamente de linha de base ligada ou desativada. Use as constantes predifinadas BLR_ON ou BLR_OFF .mode define o modo para varredura contínua ou varredura única. Use as constantes predifinadas CNT_SCAN ou SGL_SCAN . void start(void); Este método inicia a aquisição para varredura contínua e modo de varredura única.
void stop(void); Este método interrompe a aquisição.
void update(int instVal1, int instVal2); Atribua os valores atuais da amostra (por exemplo, tensão e corrente) de uma só vez.
void publish(void); Publique os resultados da última execução de aquisição concluída. Os resultados estão nas variáveis de saída, conforme definido a seguir.
As variáveis definidas pelo público são:
int instVal1 - O valor da última amostra adquirida (tensão), restaurada na linha de base quando Blr_on
int instVal2 - O valor da última amostra adquirida (corrente), restaurada na linha de base quando Blr_on
float rmsVal1 - RMS Value1 (tensão)
float rmsVal2 - rms value2 (corrente)
int dcBias1 - o valor DCBIAS1 nas unidades ADC. Apenas relevante quando blr_on
int dcBias2 - o valor dcbias2 nas unidades ADC. Apenas relevante quando blr_on
float apparentPwr - o poder aparente
float realPwr - Poder real
float pf - Fator de potência
float energy - energia netto
bool acquire - bit de status, verdadeiro se a varredura estiver pendente
Para o uso da classe Power2 :
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Com:
range1, range2 é o máximo de movimento total esperado dos sinalizadores AC (valor de pico a pico) da tensão e corrente.window O comprimento da janela de amostra expresso em um número inteiro de amostras.nob é a resolução de bits do sinal de entrada, geralmente essa é a profundidade do bit ADC. Use as constantes predifinadas: ADC_8BIT , ADC_10BIT ou ADC_12BIT .blr define a função de restauração automaticamente de linha de base ligada ou desativada. Use as constantes predifinadas BLR_ON ou BLR_OFF .mode define o modo para varredura contínua ou varredura única. Use as constantes predifinadas CNT_SCAN ou SGL_SCAN . void start(void); Este método inicia a aquisição para varredura contínua e modo de varredura única.
void stop(void); Este método interrompe a aquisição.
void update1(int instVal); Atribua o valor atual da amostra, por exemplo, para a tensão.
void update2(int instVal); Atribua o valor atual da amostra, por exemplo, para a corrente. Ligue update1() e update2() alternadamente no loop de amostragem.
void publish(void); Publique os resultados da última execução de aquisição concluída. Os resultados estão disponíveis nas variáveis de saída, conforme definido a seguir.
As variáveis definidas pelo público são:
int instVal1 - O valor da última amostra adquirida (tensão), restaurada na linha de base quando Blr_on
int instVal2 - O valor da última amostra adquirida (corrente), restaurada na linha de base quando Blr_on
float rmsVal1 - RMS Value1 (tensão)
float rmsVal2 - rms value2 (corrente)
int dcBias1 - o valor DCBIAS1 nas unidades ADC. Apenas relevante quando blr_on
int dcBias2 - o valor dcbias2 nas unidades ADC. Apenas relevante quando blr_on
float apparentPwr , o poder aparente
float realPwr - Poder real
float pf - Fator de potência
float energy - energia netto
bool acquire - bit de status, verdadeiro se a varredura estiver pendente
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Os argumentos significam:
A faixa completa do ADC (0 a 5Volts) representa um valor de pico a pico de sinal de 700V. Isso é igual a uma amplitude de sinal de 350V ou 247.5Vrms para uma onda senoidal.
A janela RMS é de 40 amostras, o que significa que a janela cobre dois ciclos de 50Hz, quando a taxa de amostragem foi escolhida em 1000 amostras/s.
A resolução do bit ADC é de 10 bits (Arduino UNO).
BLR_ON significa que a restauração da linha de base está ligada. Para capturar um sinal de AC com o ADC, o valor zero do sinal deve ser deslocado para o ponto médio da faixa ADC adicionando uma tensão de deslocamento CC com o circuito de entrada ADC. Esse deslocamento deve ser corrigido posteriormente no software subtraindo um valor constante do valor adc adquirido. Essa correção pode ser feita automaticamente com BLR_ON e a calibração não é necessária. Na Figura 1, a linha azul indica o sinal de entrada em escala máxima com um balanço de 5V de tensão e tendencioso em 2,5V. A linha verde mostra um sinal de entrada com uma amplitude de 1V e mede 1v/sqrt (2) = 0,71VRMS.

Com a opção CNT_SCAN, a aquisição é definida no modo contínuo. A aquisição reiniciará automaticamente após a conclusão da última varredura.
Ligue para gridVolt.update(adcVal); do loop principal ou de uma rotina de serviço de interrupção (ISR). Certifique -se de que o loop se rependa a uma taxa constante.
Obtenha os resultados com gridVolt.publish() e obtenha o valor 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 - Este exemplo mostra como calcular o valor médio de um sinal medido com o ADC.
Measure_rms.ino - Neste exemplo, o valor RMS da tensão de entrada ADC é determinado.
AC_powermeter.ino - Este exemplo demonstra uma aplicação completa de medição de potência AC. Precisa de ambos, tensão e representação de tensão da corrente como entrada em dois canais ADC. Ele calcula os valores de RMS da tensão e corrente, o poder aparente, a potência real e o fator de potência.
AC_powermeter_advanced.ino - Este exemplo também demonstra uma aplicação completa de medição de potência AC. Ele é executado de forma interrompida para obter melhores leituras estáveis. A tensão e a corrente são amostradas a 3kHz. Quando o LED do Arduino é aceso, os clipes ADC (tensão de pico de entrada muito alta) ou o DC o influenciam fora do alcance.
Energy_metering.ino mostra a tensão, corrente, energia real e energia líquida em WH.
A maneira mais simples de interface as altas tensões CA com o Arduino ADC é usando um transdutor de tensão, por exemplo, o transdutor de tensão de 25-P do LV da LEM USA Inc. Este transdutor fornece isolamento galvânico, escala e mudança de nível em um único pacote. Para detecção de corrente, o LEM também fabrica o LEM_LA55-P , com as mesmas vantagens que o transdutor de tensão.
Se se preferir criar circuitos de escala de entrada a partir de componentes discretos, uma descrição detalhada do design será fornecida na nota do aplicativo tiduay6c.pdf que pertence ao design de referência do inversor da fonte de tensão da Texas Instruments Incorporated. Observe os avisos! Os circuitos propostos podem ser facilmente adaptados à faixa de 0-5V para o Arduino.
Em todos os momentos, use um transformador de isolamento para segurança!
Medição de potência com três fases.
Muito tempo foi salvo no desenvolvimento dessa biblioteca usando o Sloeber alternativo Arduino-Ide. Sloeber é um plugin Arduino maravilhoso para o Eclipse. Obrigado a Jantje e seus colaboradores!