Índice:

Frequência da fonte de alimentação e medição de tensão usando Arduino: 6 etapas
Frequência da fonte de alimentação e medição de tensão usando Arduino: 6 etapas
Anonim
Freqüência da fonte de alimentação e medição de tensão usando Arduino
Freqüência da fonte de alimentação e medição de tensão usando Arduino

Introdução:

O objetivo deste projeto é medir a frequência e a tensão de alimentação, que está entre 220 a 240 Volts e 50 Hz aqui na Índia. Usei um Arduino para capturar sinal e calcular frequência e voltagem, você pode usar qualquer outro microcontrolador ou placa que tiver. O circuito requer um punhado de componentes e é bastante preciso para todos os fins práticos.

Etapa 1: Componentes necessários

  • Arduino Uno
  • IC LM358
  • Transformador redutor (220V a 12V)
  • Capacitores:

    • 0,1uF
    • 2 x 1uF
  • Resistores:

    • 3 x 1kOhm
    • 2 x 100kOhm
    • 1,5kOhm
    • 3,3kOhm
    • 6,8 kOhm
  • 3 x diodo 1N4148
  • Placa de pão e fio de ligação (opcional)

Etapa 2: Diagrama Esquemático

Diagrama esquemático
Diagrama esquemático
Diagrama esquemático
Diagrama esquemático

No circuito acima, o primário do transformador é conectado à rede de alimentação e o primário é conectado ao nosso circuito de medição

Etapa 3: Compreendendo o circuito

Compreendendo o circuito
Compreendendo o circuito
Compreendendo o circuito
Compreendendo o circuito
Compreendendo o circuito
Compreendendo o circuito

De acordo com a funcionalidade, este circuito pode ser dividido em quatro partes:

A: O circuito detector de cruzamento zero

Este circuito gera um pulso quadrado de 5 V sempre que a onda senoidal vai de positiva para negativa. O resistor R1 combinado com D1 e D2 limita a oscilação da tensão de entrada na junção do diodo de -0,6 V a + 5,6 V (assumindo que a tensão direta do diodo seja 0,6 V). Além disso, você pode aumentar a faixa de tensão de entrada do circuito aumentando o valor de R1.

O resistor R2 e R3 formam um divisor de voltagem para limitar a oscilação de voltagem negativa a -0,24Volts, já que a voltagem de modo comum de entrada do LM358 é limitada a -0,3Volts.

O resistor R4, R5, capacitor C1 e o op-amp (aqui usado como um comparador) formam o circuito Schmitt Trigger onde o resistor R4 e R5 definem a histerese na entrada + 49,5mV acima do solo. A saída do Schmitt Trigger é enviada ao Arduino PIN2 para processamento posterior.

B: Isolamento e Redução de Tensão

Como o nome sugere, esta parte isola e reduz a tensão para aproximadamente 12 Vrms. A tensão reduzida é posteriormente alimentada para o circuito de instrumentação.

C: circuito detector de pico

Este circuito determina a tensão máxima de pico do sinal de entrada. Os divisores de resistores R6 e R7 reduzem a tensão de entrada por um fator de 0,23 (12 Vrms é reduzido para 2,76 Vrms). O diodo D3 conduz apenas o meio ciclo positivo do sinal. A tensão em C2 aumenta até o valor de pico do sinal retificado, que é alimentado para o pino analógico A0 do Arduino para calcular posteriormente a tensão.

Além disso, você pode substituir este circuito por um circuito detector de pico de precisão como os mencionados aqui. Mas para os meus propósitos de demonstração, o circuito acima será suficiente.

D: Arduino

Nesta parte, o Arduino captura os pulsos quadrados gerados pelo circuito Schmitt Trigger e lê a tensão analógica do circuito detector de pico. Os dados são posteriormente processados para determinar o período de tempo (portanto, a frequência) do pulso quadrado (que é igual ao tempo de alimentação CA por pessoa) e a tensão da alimentação.

Etapa 4: Cálculo de frequência e tensão

Cálculo de frequência:

Com a ajuda do Arduino, podemos medir o período de tempo T do sinal. Os pulsos de onda quadrada do detector de cruzamento zero são enviados ao pino 2, a partir daí podemos medir o período de tempo de cada pulso. Podemos usar o temporizador interno do Arduino (especificamente Timer1) para calcular o período de tempo entre duas bordas ascendentes do pulso quadrado com a ajuda de interrupções. O temporizador é incrementado em 1 por ciclo de clock (sem prescaler = 1) e o valor é armazenado no registro TCNT1. Conseqüentemente, o relógio de 16 MHz incrementa o contador em 16 a cada microssegundo. Da mesma forma, para prescaler = 8, o cronômetro é incrementado em 2 a cada microssegundo. Daí o período de tempo entre duas arestas ascendentes

T = (valor TCNT1) / tempo gasto para cada contagem

Onde, o tempo gasto para cada contagem = prescaler / (velocidade do clock do Arduino (16 MHz)

Portanto, a frequência f = 1 / T = (velocidade do clock do Arduino (16 MHz) / (pré-escalador * valor TCNT!)

Portanto, a velocidade do temporizador (Hz) é dada por = (velocidade do clock do Arduino (16 MHz)) / prescaler

e a frequência do sinal é dada por = (velocidade do clock do Arduino

Correspondentemente, podemos calcular a frequência f a partir da relação f = 1 / T.

Cálculo da tensão:

O ADC onboard do Arduino tem uma resolução de 10 bits (valores possíveis = 2 ^ 10 = 1024), retornando valores na faixa de 0-1023. Para calcular a tensão analógica correspondente V, temos que usar a seguinte relação

V = (leitura ADC) * 5/1023

Para calcular a tensão de alimentação Vs (rms), devemos levar em consideração a relação do transformador, o divisor do resistor R6R7 e o circuito detector de pico. Podemos simplesmente juntar os vários fatores / proporção como:

Razão do transformador = 12/230 = 0,052

Divisor do resistor = R7 / (R6 + R7) = 0,23

No circuito detector de pico = 1,414

Vs (rms) = V / (1,414 * 0,052 * 0,23) = (Leitura ADC) * 0,289

Deve-se notar que este valor está longe do valor real, principalmente devido ao erro na relação real do transformador e à queda de tensão direta do diodo. Uma maneira de contornar isso é determinar o fator após a montagem do circuito. Isso é medindo a tensão de alimentação e a tensão através do capacitor C2 separadamente com um multímetro, então calculando Vs (rms) da seguinte forma:

Vs (rms) = ((Tensão de alimentação * 5) / (Tensão em C2 * 1023)) * (Leitura ADC)

no meu caso, Vs (rms) = 0,33 * (leitura ADC)

Etapa 5: Código Arduino

# define volt_in A0 // pino de leitura de tensão analógica

volatile uint16_t t_period; uint16_t ADC_value = 0; float volt, freq; void isr () {t_period = TCNT1; // armazena o valor TCNT1 em t_period TCNT1 = 0; // redefine Timer1 ADC_value = analogRead (volt_in); // lê a tensão analógica} float get_freq () {uint16_t timer = t_period; se (temporizador == 0) retornar 0; // para evitar a divisão por zero else return 16000000.0 / (8UL * timer); // frequência é dada por f = clk_freq / (prescaler * timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // define o prescaler para 8 TCNT1 = 0; // redefine o valor do Timer1 TIMSK1 = bit (TOIE1); // habilita a interrupção de estouro do Timer1 EIFR | = bit (INTF0); // limpa o sinalizador de interrupção INT0 Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // habilita a interrupção externa (INT0) delay (1000); detachInterrupt (0); freq = get_freq (); volt = ADC_value * 0,33; String buf; buf + = String (freq, 3); buf + = F ("Hz / t"); buf + = String (volt); buf + = F ("Volts"); Serial.println (buf); }

Etapa 6: Conclusão

Conclusão
Conclusão
Conclusão
Conclusão

Você pode montar o circuito em uma placa de ensaio e ajustar o código e adicionar um cartão SD para armazenar os dados, que podem ser analisados posteriormente. Um exemplo é, você pode analisar a voltagem e a frequência nos horários de pico.

O circuito que montei na placa de ensaio usava LM324 (quad opamp) em vez de LM358 (dual opamp) porque eu não tinha aquele IC naquele momento e o bloqueio nacional devido à pandemia de COVID-19 dificultou a obtenção de um novo IC. No entanto, isso não afetaria o funcionamento do circuito.

Sinta-se à vontade para comentar abaixo para quaisquer sugestões e dúvidas.

Recomendado: