Índice:
2025 Autor: John Day | [email protected]. Última modificação: 2025-01-13 06:58
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
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
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
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.