Tabla de contenido:
- Paso 1: demostración
- Paso 2: Recursos utilizados
- Paso 3: diagrama de bloques
- Paso 4: esquema
- Paso 5: LM386 - Fijación
- Paso 6: AmpOp - Diferencial (resta)
- Paso 7: AmpOp - Inverter Adder
- Paso 8: Maple Mini - Pinage
- Paso 9: Maple Mini - Fijación - A / D utilizado en la captura
- Paso 10: Montaje
- Paso 11: Grafica con los datos obtenidos
- Paso 12: Calcular el valor RMS
- Paso 13: Código fuente
- Paso 14: Archivos
2025 Autor: John Day | [email protected]. Última modificación: 2025-01-13 06:57
Hoy, usaremos el STM32 Maple Mini para hacer una lectura de CA. En nuestro ejemplo, obtendremos el valor RMS de la red eléctrica. Esto es muy útil para aquellos que desean monitorear la red eléctrica para el Internet de las cosas. Luego crearemos una aplicación utilizando la potencia computacional del Maple Mini, aplicaremos un circuito electrónico capaz de permitir la adquisición de una señal de 127Vac, así como aplicaremos el cálculo de la raíz cuadrada media (RMS) en las muestras.
Paso 1: demostración
En nuestro montaje de hoy, tenemos el STM32, además de nuestro circuito analógico para hacer la entrada de 110. Para evitar choques, aísle la resistencia que está entrando por 110.
El circuito es bastante sensible. Estoy ingresando con 110, pero lo reduzco 168 veces usando el divisor de voltaje y lo pongo en el amplificador operacional, que tiene varias funciones.
También tenemos algunos condensadores opcionales para el filtrado de fuentes. Si su fuente es de buena calidad, no es necesario que la utilice.
La entrada AD se calcula a través del osciloscopio, en el que se ve una sinusoide, que no es 110 (pero está bien formada). Otra cosa es que el voltaje en nuestra red eléctrica no es 110 (en realidad es 127 voltios). Pero como estamos pasando por un estabilizador, se ajustará a 115V.
El valor que se muestra en el monitor en serie es el que se calcula en RMS, es decir, el que identifica el medidor Fluke.
Paso 2: Recursos utilizados
• Jerséis
• Un mini arce
• Protoboard
• Un amplificador LM386
• Una fuente simétrica (+ 5V y -5V)
• Un potenciómetro (o potenciómetro) multivuelta de 10k
• Cuatro condensadores de poliéster 100nF
• Tres resistencias de 10k
• Cuatro resistencias de 470k
• Una resistencia de 5k6
• Un diodo zener 1n4728A
Paso 3: diagrama de bloques
Paso 4: esquema
Este es un circuito que desarrollé en base a las especificaciones que creo que son las mejores para esta medición, pero hay varios otros ejemplos que se pueden encontrar en Internet.
Paso 5: LM386 - Fijación
El LM386 tiene dos amplificadores para acondicionamiento o amplificación de señal.
Paso 6: AmpOp - Diferencial (resta)
Paso 7: AmpOp - Inverter Adder
Paso 8: Maple Mini - Pinage
Pines marcados en:
Rojo >> Tolerante a 3V3
Verde >> Tolerante a 5V
Paso 9: Maple Mini - Fijación - A / D utilizado en la captura
Destaco aquí que el pin que utilicé es el D11 que (en la nomenclatura del STMicroelectronics) es el PA0.
Paso 10: Montaje
Para nuestro circuito, necesitará una fuente simétrica, como la que creamos para este proyecto. De lo contrario, necesitará dos fuentes.
Paso 11: Grafica con los datos obtenidos
Paso 12: Calcular el valor RMS
Paso 13: Código fuente
Código fuente: definiciones y constantes
Al principio, definimos la lectura del pin como D11, así como las diversas constantes utilizadas en los cálculos.
#define leituraTensao D11 // AD CH0 no pino PA0 // valor teórico divisor de tensão = 168.85714285714285714286 const float fatorDivisor = 168.40166345742404792461; // valor teórico do ganho de amplificação = 1.0 const float fatorAmplificador = 1.0; // Valor usado en la multiplicación de la lectura const float fatorMultiplicacao = fatorDivisor * fatorAmplificador; // Valor teórico de la tensión de alimentación Vcc = 3.3V const float Vcc = 3.3; // valor teórico do offset do amplificador = Vcc / 2.0; const float offSet = 1.66; // fator teórico da conversão do AD = 3.3 / 4095.0 const float fatorAD = Vcc / 4095.0; const int amostras = 71429; // resulta em 1, 027 segundos para cada atualização // const int amostras = 35715; // resulta em 0, 514 segundos para cada atualização
Código fuente: variables globales
Ahora, definimos algunas variables globales.
flotador Vrms = 0.0; // armazena o valor rms da tensãofloat Vmax = 0.0; // armazena o valor máximo detectado float Vmin = 10000.0; // armazena o valor mínimo detectado float Vmed = 0.0; // armazena o valor médio entre Vmáx e Vmín
Código fuente - Configuración ()
Inicie el puerto serie a 1 Mbps. Ajustamos el puerto AD como entrada y esperamos 5 segundos antes de comenzar a recopilar datos. El tiempo de espera es opcional.
configuración vacía () {Serial.begin (1000000); // inicia un puerto serial em 1Mbps pinMode (leituraTensao, INPUT); // ajusta a porta do AD como entrada delay (5000); // aguarda 5s antes de iniciar a coleta. (opcional)}
Código fuente: bucle (): inicia las variables de recopilación de datos
En el bucle, tenemos la variable de iteración. Aquí, también almacenamos las lecturas de AD en 0.0 y reiniciamos la variable VRMS también en 0.0.
bucle vacío () {int i = 0; // variável para iteração float leitura = 0.0; // armazena como leituras do AD Vrms = 0.0; // reinicia a variável Vrms
Código fuente: captura y ejecuta los cálculos individuales para cada muestra.
En esta etapa, si i es más pequeño que la muestra, comenzamos un ciclo de muestreo hasta que i alcanza el número de muestras. Ejecutamos analogRead para leer el puerto analógico y calcular la suma de los cuadrados de los voltajes de lectura. Finalmente, incrementamos el iterador.
while (i <amostras) {// inicia um ciclo de amostragem até que i alcance o número de amostras leitura = analogRead (leituraTensao); // lê a porta analógica //Serial.println(leitura); // Descomente se quiser ver o sinal bruto do AD Vrms = Vrms + pow (((leitura * fatorAD) - offSet), 2.0); // calcula un soma dos quadrados das tensões lidas i ++; // incrementa o iterador}
Código fuente - Cálculos generales de las muestras e identificación de máximo, mínimo y promedio.
Aplicamos el hecho de la multiplicación para determinar el valor real de los voltajes. Detectamos si el valor es máximo o mínimo, y calculamos la media de los valores máximo y mínimo actuales.
// Aplicando fator de multiplicação para determinar o valor real das tensões Vrms = (sqrt (Vrms / amostras)) * fatorMultiplicacao; // detecta se é um valor é máximo if (Vrms> Vmax) {Vmax = Vrms; } // detecta se é um valor mínimo if (Vrms <Vmin) {Vmin = Vrms; } // calcula un medio de valores máximo e mínimo atuais Vmed = (Vmax + Vmin) / 2.0;
Código fuente - Opciones de salida
Tenemos tres opciones para "graficar" el valor de salida. Hemos formateado la salida al trazador de serie Arduino IDE, como CSV o Jason.
// saída formatada para plotter serial IDE Arduino Serial.print (Vrms, 3); Serial.print (","); Impresión serial (Vmax, 3); Serial.print (","); Impresión serial (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); / * // saída formatada como json Serial.print ("{" instante (ms) ":"); Serial.print (millis ()); Serial.print (","); Serial.print ("\" Vrms (V) ":"); Impresión serial (Vrms, 3); Serial.print (","); Serial.print ("\" Vmax (V) ":"); Impresión serial (Vmax, 3); Serial.print (","); Serial.print ("\" Vmin (V) ":"); Impresión serial (Vmin, 3); Serial.print (","); Serial.print ("\" Vmed (V) ":"); Impresión de serie (Vmed, 3); Serial.println ("}"); * / / * // saída formatada como CSV Serial.print (millis ()); Serial.print (","); Impresión serial (Vrms, 3); Serial.print (","); Impresión serial (Vmax, 3); Serial.print (","); Impresión serial (Vmin, 3); Serial.print (","); Serial.println (Vmed, 3); * /}
Paso 14: Archivos
Descarga los archivos:
INO