Lendo uma tensão variável no Arduino

8

Usando um Arduino Nano e um transformador de corrente (CT), estou tentando detectar a corrente fluindo através de uma linha de 120 V 60 Hz.

O circuito

Saídas CT de 0-1 Vacordo com suas especificações. Esta saída é enviesada AREF/2= 2,5 V.

Digite a descrição da imagem aqui

analogRead Valores

O eixo x representa o número do índice da amostra ADC, enquanto o eixo y representa o valor ADC (0-1024). A taxa de amostragem é de cerca de 9 kHz. A diferença pico a pico é de cerca de 1026 amostras.

Digite a descrição da imagem aqui

Essa forma de onda é o que você esperaria do CT? Por que existem regiões onde os valores são fixos, em vez de variar continuamente?

Além disso, se observarmos a parte da curva do gráfico, por que o Arduino está lendo os valores acima 512e abaixo 512alternadamente? Ele lê um valor acima 512, depois um valor abaixo 512, depois um valor acima 512e assim por diante.

O tempo gasto para um analogReadfoi medido em 110 microssegundos para minha configuração e existem 1026 amostras entre os picos da forma de onda. Isso significa que haverá cerca de 9 picos em 1 segundo, embora eu esperasse 60 picos, pois estamos sentindo uma linha de 60 Hz. O que você faz disso? Existe um capacitor, C1no circuito, isso tem alguma coisa a ver com isso?

Esses valores analogRead são adequados para o cálculo da tensão RMS e, portanto, a corrente RMS que passa pelo fio sendo detectada? O objetivo final disso é calcular o uso de energia após determinar a corrente RMS que flui através do fio.

Esboço usado para obter valores para plotagem

void setup() {
    Serial.begin(9600);
}

void loop() {
   double sensorValue = analogRead(1);
   Serial.println(sensorValue)
}

analogReadPontos de dados reais nas regiões de relevo

487
534
487
535
488
537
484
536
487
538
486
536
484
540
484
539
485
540
483
540
484
541
481
539
481
540
484
540
480
543
484
539
481
540
484
541
486
542
485
538
485
538
488
535
489
534
491
530
491
529
493
531
492
526
498
526
499
524
499
520
503
518
502
518
507

Gráfico de valores de leitura analógica

Os valores analogRead agora são armazenados em um buffer antes de serem transmitidos pelo Serial. Atualmente, existem 55 pontos de dados da ADC que compõem um período. Considerando que o tempo de leitura analógico é de 110 µs, cada ciclo leva 6,05 ms, fornecendo uma frequência de 165 Hz! O que pode ter dado errado?

Digite a descrição da imagem aqui

void loop() {
    double sensorValue = analogRead(1);
    char buf[32];

    dtostrf(sensorValue, 8, 2, buf);
    value = buf;

    if (stop == 0) {
        if (i < 10000) {
            message += ',';
            message += value;
            i++;
        }
        else {
            stop = 1;
            Serial.println(message);
        }
    }
}
Nyxynyx
fonte
Você pode postar o código? Isso não parece certo. Quando você diz "Supondo que 100ms passem", por que assumimos isso?
Cybergibbons 22/03
@ Cyybibbons Publicou o código usado para gerar valores para o gráfico. Desculpe, acabei de medir o tempo gasto em um analogRead()e constatamos que são 110 microssegundos. Atualizado a pergunta.
Nyxynyx
Qual é a carga que você está usando para a rede elétrica. Idealmente, você quer algo bastante estável como uma lâmpada incandescente. Se você tem algo complexo, como uma fonte de alimentação de modo de laptop, que pode ter uma carga variável, você pode esperar um resultado complexo.
Salix alba
11
A maior parte do tempo no loop será gasta enviando serial a 9600bps. Você irá mudar apenas 960 char / s, ou seja, cada leitura demora 4ms.
22414 Cybergibbons
@Salixalba A carga é um computador de mesa com uma fonte de alimentação comutada. Vou tentar medir uma carga diferente, como um aquecedor.
Nyxynyx

Respostas:

5

Com relação às suas medidas, eu desconsideraria completamente o primeiro conjunto com Serial.println () no loop. Eu esperava que o momento disso não fosse confiável.

Seu segundo conjunto de dados capturados em um buffer parece correto, mas a estimativa / frequência da frequência pode estar incorreta. Eu inverteria uma saída digital a cada iteração de loop. Você pode medir a frequência disso com um multímetro e a taxa de amostragem do ADC seria o dobro desse valor.

Para uma fonte de alimentação de PC ou laptop, é uma forma de onda atual bastante comum.

Sem a correção efetiva do fator de potência, o sinal atual mostrado abaixo seria bastante típico (fonte: http://www.nlvocables.com/blog/?p=300 )

http://www.nlvocables.com/blog/?p=300

Você precisará calcular os valores RMS e seria prudente filtrar o sinal.

Aqui está um manual que eu escrevi sobre como criar e codificar um Monitor de eletricidade com base no Arduino Yun com suporte à nuvem / Temboo e Google Drive. Deve ser de alguma ajuda para você.

akellyirl
fonte
Obrigado! O CT que você usou gera -1V a 1V. Para usar o ADC de 10 bits, você amplificará a saída SCT em 2,5 usando um opamp? Ou definir o seu AREF a 2V e viés o sinal CT por 1V
Nyxynyx
Não, eu não amplifiquei ou mudei o Aref.
akellyirl
Como você conseguiu esse gráfico? Com qual software?
precisa saber é o seguinte
0

se você estiver medindo uma carga resistiva, eu diria que o resistor de carga que você escolheu está errado, existem alguns TCs baratos no ebay (SCT-013-xxx) que possuem versões com e sem os resistores de carga, e funcionam bem pelo preço mas você deve ler a folha de dados. o SCT-013-000 requer que um resistor 20R saia 1V com uma carga de 100A; se esse resistor estiver errado, você poderá obter uma forma de onda severamente distorcida ao medir correntes mais altas (semelhantes às que você forneceu), você esperaria que o sinal distorcer mais quanto menor o valor do resistor de carga, mas esse não é o caso dos TCs.

Ian
fonte