ATmega. Contador de pulsos PWM. Conexión de Arduino a un medidor de electricidad Contador de pulsos en arduino

  • Tutorial

La tarea de hoy: ¿cómo determinar el ángulo de rotación de un codificador incremental?

Hoy, en una serie de publicaciones sobre el cerebro Arduino, un breve artículo con un pequeño experimento y un par de recetas. En los comentarios a uno de mis artículos anteriores, me acusaron de usar un arduino para contar los pulsos del codificador; uf, hacer eso:
Un codificador óptico de 1000/revolución y un ATMega que no tiene un circuito de hardware para trabajar con un codificador (como la serie STM32, por ejemplo) son un callejón sin salida.
Además, en los comentarios hubo mucha teorización, que es mejor omitir. Mejor intentemos probar en hardware hasta qué punto esto es un callejón sin salida. En primer lugar, ¿qué es un codificador incremental? Cualquiera que recuerde la era de los ratones preópticos sabe con certeza la respuesta. Dentro del codificador hay un disco con ranuras, así que para mayor claridad tomé una foto de un disco con quinientas ranuras:


Se coloca un LED en un lado de este disco y un fotodiodo en el otro:

Mientras gira, el disco transmite luz al fotodiodo (si la ranura está opuesta al par LED-fotodiodo) o no la transmite. A una velocidad de rotación constante, se obtiene una hermosa sinusoide en la salida del fotodiodo (no olvide que el flujo de luz se puede bloquear parcialmente). Si esta señal pasa a través de un comparador, produce una señal de onda cuadrada. Contando el número de pulsos de señal, obtenemos cuánto ha girado el eje del sensor.

¿Cómo se determina la dirección de rotación? Es muy sencillo: el sensor contiene no uno, sino dos pares de fotodiodos LED. Dibujemos nuestro disco, los puntos A y B muestran la posición de los fotosensores. Al girar el eje del codificador, eliminamos dos señales de estos fotosensores:

Los sensores están colocados a tal distancia que al girar a velocidad constante se genera un meandro que gira un cuarto del período. Esto significa que cuando el fotosensor A se encuentra frente al centro de la ranura, el fotosensor B se encuentra exactamente en el borde de la ranura. Cuando el sensor gira (condicionalmente) en el sentido de las agujas del reloj, con un flanco ascendente en la señal B, la señal A es igual a uno. Cuando el sensor gira en la dirección opuesta, con un flanco ascendente en la señal B a es igual a cero.

Todo esto es genial, pero ¿qué debo copiar y pegar en mi proyecto?

Este:

Ángulo largo volátil = 0; carácter volátil ABprev = 0; incremento int constante = (0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0); ISR (PCINT0_vect) ( // D8 o D9 ha cambiado el carácter AB = PINB & 3; ángulo += incremento; ABprev = AB; ) void setup() ( pinMode(8, INPUT); // A pinMode(9, INPUT) ; // B PCICR |= (1<< PCIE0); // interrupt will be fired on any change on pins d8 and d9 PCMSK0 |= 3; ABprev = PINB & 3; Serial.begin(115200); } void loop() { Serial.println(angle); delay(100); }
Déjame explicarte cómo funciona este código. Estoy probando el código en ATmega328p (Arduino nano), las salidas del codificador están ubicadas en los pines d8 y d9 del arduino nano. En términos de ATmega328p, esto significa que los dos bits menos significativos del puerto PINB dan el estado actual del codificador. La función ISR se llamará ante cualquier cambio en estos dos bits. Dentro de la interrupción guardo el estado del codificador en una variable AB:

Carácter AB = PINB y 3; // Atención, digitalRead() de Arduino está contraindicado // cuando la velocidad de funcionamiento es crítica para nosotros
¿Para qué? Miremos el gráfico anterior; en él, las líneas de puntos indican los momentos en que se llama a una interrupción (cualquier borde de cualquier señal). Para cada llamada de interrupción, los siguientes números son el estado de la variable AB:

Se puede observar que al girar en el sentido de las agujas del reloj la variable AB cambia con un periodo de cuatro valores: 2310 2310 2310. Al girar en sentido antihorario, la variable AB cambia 0132 0132 0132.

Si ambos fotosensores estaban bloqueados (variable AB = 0), y cuando se llama a la interrupción, AB se vuelve igual a 2, entonces el sensor gira en el sentido de las agujas del reloj, suma uno al contador. Si AB pasa de 0 a 1, entonces el sensor gira en sentido antihorario, resta uno del contador. Lo mismo ocurre con otros cambios en la variable AB, hagamos una tabla:

Tenga en cuenta que la tabla no está completamente completa. ¿Qué poner en lugar de los signos de interrogación? Por ejemplo, en teoría, la diagonal principal de la tabla nunca debería usarse, la interrupción se llama cuando la variable AB cambia, por lo que la transición 0->0 no debería ocurrir. Pero la vida es dura y si el microcontrolador está ocupado, puede perder varias interrupciones y aun así ser llamado. En este caso propongo no sumar ni restar nada, ya que claramente no tenemos datos suficientes; Llenemos las celdas que faltan con ceros, aquí está nuestra tabla:

Incremento constante constante = (0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0);
Ahora espero que el código sea completamente claro.

Como resultado, durante un período de la señal A tenemos cuatro interrupciones que, al girar el sensor en una dirección, aumentarán el contador no en 1, sino en 4. Es decir, si el codificador incremental dice 2000PPR (dos mil ranuras en el disco), entonces su resolución real es 1/8000 revolución.

Espera, ¿qué pasa con el ruido?

Al pasar una onda sinusoidal a través de un comparador, inevitablemente obtendremos un rebote en los bordes de nuestra señal rectangular. Tomemos una lupa y miremos un frente:

La señal A es constante, por lo tanto, según nuestra placa, sumamos uno en el flanco ascendente de la señal B y restamos uno en el flanco descendente. Como resultado, si logramos resolver todos los frentes de nuestra charla, nuestro algoritmo la absorberá perfectamente. Y aquí se vuelve interesante: ¿podrá nuestro Arduino hacer tales delicias? Podemos teorizar durante mucho tiempo, hagamos un experimento.

De la teoría a la práctica

Contaremos las legumbres de tres formas:
  • Software en ATmega328p
  • Contador de hardware de sondeo ATmega328p
Los tres métodos cuentan los impulsos de manera absolutamente igual, pero, por supuesto, los métodos de hardware tienen significativamente mayor velocidad señales de sondeo. El codificador lo utiliza Omron E6B2-CWZ6C (2000PPR).

Conexión

contador de programas

La conexión es sencilla, sólo dos cables del codificador se conectan a las patas d8 y d9 del arduino.

HCTL-2032

Conectar hctl-2032 a Arduino se parece a esto:

Para no ocupar todas las patas del arduino, instalé otro 74hc165.

BeagleHueso Azul


BeagleBone Blue tiene un decodificador de cuadratura incorporado, por lo que los codificadores de 3,3 V se pueden conectar simplemente al conector adecuado. Mi codificador tiene lógica de 5 V, así que agregué un convertidor de nivel de dos vías en bss138:

Experimento uno

Me planté con un péndulo, que ya describí:

El carro no se mueve, simplemente conectaré tres contadores al codificador del péndulo. ¿Por qué un péndulo? Porque la fuerza de gravedad proporciona un marcador no flotante: cada vez que el péndulo se sitúa en la posición inferior, los contadores deben mostrar un número múltiplo de 8000 (tengo un codificador de 2000ppr).

Aquí hay tres medidores conectados en paralelo, de arriba a abajo: beaglebone, software meter, hctl2032. En esta prueba no se utiliza el controlador PWM para el motor del carro:

Inicio de la prueba, el péndulo está estacionario, dos monitores de puerto serie y un contador beaglebone iniciados a través de ssh:

Doy una vuelta completa al péndulo con la mano, esperando que se calme nuevamente en la posición inferior:

¡Los tres contadores muestran exactamente 8000, como se esperaba! Bueno, de los comentarios aprendimos que debido a la charla, el contador del software debería estar muy equivocado cuando bajas velocidades péndulo. Repito el procedimiento diez veces: balanceo el péndulo para que haga una revolución y luego espero hasta que se calme por completo. Luego lo vuelvo a agitar y espero hasta que se calme. La fricción es baja, una iteración dura un par de minutos, lo que resulta en aproximadamente media hora de trabajo de contraataque.

¡Ja, pero nuevamente nadie se equivocó!

Experimento dos

Entonces, el traqueteo en realidad resultó no ser tan terrible como parecía. Quito el péndulo y coloco un destornillador en el eje del codificador:

Luego aumento lentamente la velocidad, deteniéndome periódicamente y comprobando hasta qué punto los tres contadores coinciden con lo que está sucediendo. Por eso en una de las ventanas tengo una estimación de la velocidad de rotación del eje del codificador.

100 rpm está bien. 500 rpm - pedido, acuerdo total. 900 rpm: ¡AJÁ! Dejo el destornillador:

Los contadores de hardware todavía coinciden entre sí, pero los contadores de software están muy por detrás. Consideremos hasta qué punto esto concuerda con la teoría. El manual del ATmega328p dice que procesar una interrupción (vacía) requiere al menos 10 ciclos de microcontrolador. Trabajando con la pila, un pequeño código dentro de la interrupción: esto es un total de 40 ciclos de reloj por interrupción. 8000 mil interrupciones a 900 revoluciones por minuto (15 revoluciones por segundo) durante 40 ciclos = 4800000 ciclos por segundo. En general, nuestra estimación está muy cerca de la frecuencia de reloj del Arduino, es decir, 1000 rpm es el límite máximo para el contador del codificador. alta resolución en las interrupciones, y para el arduino, que no hace nada más.

A 2000 rpm, ambos contadores de hardware funcionaron sin desajustes, pero mi destornillador no puede producir más.

Resumir:

1. Es muy posible contar en las interrupciones, 15 revoluciones por segundo sigue siendo una velocidad muy decente. Pero si necesita procesar más de un contador, las cosas empeoran dramáticamente. La elección del codificador juega un papel importante, ya que los buenos codificadores tienen supresión de rebote internamente, por lo que un buen codificador y un microcontrolador económico de 8 bits son una gran solución.

2. Los medidores de hardware son más confiables, pero más caros.

3. hctl2032 es significativamente más barato que BeagleBone Blue, pero también es más difícil de conectar al controlador, mientras que BeagleBone es su propio controlador y puede procesar cuatro codificadores a la vez. Y el amplificador para el motor ya está incluido, por lo que el soporte con el péndulo se puede montar con poco esfuerzo. Por otro lado, aunque es bastante exótico, el hctl-2032 cuesta cinco dólares cada uno y puede salvar la situación cuando ya existe un circuito con algún tipo de pico o atmel y no se quiere cambiar mucho.

4. Dicen que stm32 es barato y tiene un contador de hardware. Pero el precio de entrar (en términos de tiempo) en la cuestión es doloroso.

En general, como suele ocurrir, no existe una solución ideal, todo depende de la tarea y de los recursos disponibles.

No, este artículo no trata sobre otra forma de engañar a este desafortunado dispositivo. Aquí hablaremos de cómo usando arduino y el entorno LabView convierten su medidor de energía en un monitor de consumo de energía o incluso en un amperímetro.


El primer contador de electricidad fue el de inducción. El principio de funcionamiento es ridículamente simple: se trata esencialmente de un motor eléctrico, cuyo rotor es un disco de aluminio que hace girar el dial. Cuanto más corriente se consume, más rápido gira el disco. El dispositivo es puramente analógico.

Sin embargo, hoy en día los medidores de inducción están perdiendo terreno, dando paso a sus homólogos electrónicos más baratos. Y solo una de esas personas se convertirá en sujeto de prueba:

El principio de funcionamiento no ha cambiado mucho: en este caso, el disco se reemplaza por una electrónica, que genera pulsos de acuerdo con la cantidad de electricidad consumida. Como regla general, en la mayoría de los dispositivos estos pulsos se muestran mediante un indicador LED. En consecuencia, cuanto más rápido parpadee esta luz, más valiosos kW se quemarán.
Además, en el panel frontal de cualquier dispositivo hay un medidor de relación de transmisión. A- número de pulsos por 1 kWh. Como se puede ver en la foto, el sujeto de prueba tiene A = 12800. De esta información se pueden sacar las siguientes conclusiones:

Con cada impulso, el contador registra un consumo igual a 1/12800 de 1 kWh. Si conecta una carga al medidor y simplemente comienza a contar los pulsos, puede obtener fácilmente la cantidad de electricidad que consumió (kWh) dividiendo la cantidad de pulsos por la relación de transmisión.

Dado que el indicador cambia la velocidad de su parpadeo, es posible derivar una relación entre la potencia (kW) y el tiempo de un pulso de medidor, que proporcionará datos sobre potencia/corriente.
No cargaremos el artículo con cálculos, pero si es necesario,

aquí están

En verdad, la relación de transmisión del medidor es una gran cosa, ya que conociéndola puedes expresar tanto potencia como corriente:
Hagamos una proporción entre nuestra relación de transmisión (A = 12800 imp/kWh) y la relación de transmisión desconocida, que estará en la carga X y durante el tiempo de un solo pulso (parpadeo de una bombilla):

Aquí X es la potencia desconocida y t es el tiempo de un pulso. Expresamos el poder desconocido desde aquí y aquí está:

La corriente se calcula utilizando la siguiente proporción de relaciones de transferencia y corrientes conocidas y desconocidas en la carga X.:


Lo que en general lleva a una fórmula idéntica, pero para la corriente (la corriente se mide en Amperios y los índices indican la carga a la que se producirá esta corriente):

Aquí puede notar un problema: necesita conocer la corriente con una carga ideal de 1 kW. Si se necesita una buena precisión, es mejor medirla usted mismo, y si no, puede calcularla aproximadamente usando la fórmula (se conocen el voltaje y la potencia), pero será más aproximado, ya que no se tiene en cuenta el factor de potencia. cuenta.


Así, todo se reduce a medir el tiempo de un impulso (parpadeo del indicador). En mi investigación me basé en este excelente proyecto. Un italiano creó una interfaz para el monitoreo de energía en el entorno Labview y ideó un circuito para medir pulsos. Pero su proyecto tenía un gran defecto: sólo era adecuado para contadores con una relación de transmisión de 1000 imp/kWh.

El gráfico superior es la potencia promedio durante 5 minutos, el inferior es en tiempo real. La interfaz es bastante flexible y se puede modificar fácilmente para adaptarla a sus necesidades. Si aún no se ha familiarizado con el entorno LabView, le recomiendo que se familiarice.

Para que todo funcionara, bastaba con añadir un único bloque al algoritmo del programa, de acuerdo con la fórmula anterior.

Se parece a esto


Parece sencillo, ¡pero aún hay que pensarlo!

Entonces, si aún decide implementar el monitoreo de energía, existen dos opciones:

1. Su medidor está cerrado y sellado, así que no juegue con él. Esto significa que los pulsos sólo se pueden leer utilizando un fotorresistor que responde al parpadeo de una bombilla. Debe fijarse con cinta aislante azul frente al indicador LED en el panel frontal del medidor.
El diagrama se verá así:

Circuito para captación de impulsos sin contacto.


El programa simplemente compara el valor de resistencia del fotorresistor y el potenciómetro. Además, este último le permite configurar la sensibilidad de dicho sensor para evitar falsos positivos y ajustarse al brillo del indicador.

2. Tienes acceso a la salida de pulsos del contador. Muchos modelos tienen una salida de impulsos que duplica el parpadeo de la luz. Esto se hace para que sea posible conectar el dispositivo a un sistema de contabilidad automatizado. Es un transistor que se abre cuando el indicador está encendido y se cierra cuando se apaga. Conectarse directamente a él no es difícil: solo requiere una resistencia pull-up. Sin embargo, antes de hacer esto, asegúrese de que sea una salida de pulso y no otra cosa. (siempre hay un diagrama en el pasaporte)

Diagrama de conexión a la salida de telemetría.


En mi caso es acceso completo, así que no me molesté demasiado. ¡Instale LabView y comience a medir! Todos los gráficos representan la potencia (W) en tiempo real.
La primera en ser distribuida fue la sufrida tetera. La tapa dice que su potencia es de 2,2 kW, pero a juzgar por el gráfico, normalmente consume sólo 1700 W. Tenga en cuenta que el consumo es más o menos constante en el tiempo. Esto significa que el elemento calefactor (probablemente nicromo) cambia muy poco su resistencia durante todo el proceso de ebullición.

Es un asunto completamente diferente pistola de pegamento- la potencia declarada es de 20 W. Se comporta de acuerdo con las leyes de la física: cuando se calienta, la resistencia del calentador aumenta y la corriente disminuye en consecuencia. Lo revisé con un multímetro y todo está bien.

Antiguo receptor de radio "Primavera". Aquí el gráfico subió al principio debido a que comencé la medición durante el pulso, lo que afectó los datos en consecuencia. Las diapositivas del gráfico muestran cómo giré la perilla de volumen. Cuanto más fuerte es, más devora la radio.

Un taladro percutor con una potencia declarada de 700 W. Presioné el botón hasta el fondo, esperé un poco y lo solté, pero no suavemente. El gráfico muestra claramente el aumento de corriente al arrancar el motor. Por eso la luz parpadea cuando buen vecino comienza a golpear su pared favorita.

Ahora viene la parte divertida. Realicé un pequeño experimento con mi vieja computadora portátil, cuyo resultado se muestra en la imagen:

El punto naranja marca el momento en que lancé varios programas "pesados" a la vez. Como ves, las gráficas de carga del procesador y el mayor consumo tienen algo en común. Recientemente estuve

Medidor de electricidad de bricolaje usando Arduino

En este artículo aprenderá cómo hacer un medidor de electricidad con sus propias manos, controlar el voltaje y la corriente de suministro.

Por lo que este instrumento mide la corriente eléctrica en su hogar a través del transformador de corriente y luego realiza varios cálculos para conocer el valor de potencia, la potencia máxima y la cantidad de electricidad consumida. También es muy fácil agregar tu tarifa local y mostrar el costo de la electricidad utilizada por día.

Lo que necesitarás para un medidor de electricidad doméstico.

Arduino (Uno usado en este tutorial)
pantalla LCD
Transformador de corriente CT - Talema AC1030 (ver más abajo varias opciones y enlaces para comprar)
resistencia de 56 ohmios
condensador de 10μF
2 resistencias compartidas de 100 KOhm

Cómo hacer un medidor de electricidad.

Primero debe comenzar ensamblando componentes en un CT o placa de pruebas para crear su sensor actual que produzca una señal que su Arduino pueda entender. Arduino solo tiene entradas de voltaje analógico que miden 0-5V corriente continua, por lo que debe convertir la salida de corriente del CT en una referencia de voltaje y luego escalar el voltaje de referencia en el rango de 0-5 V.

Montaje de componentes

Si va a instalar su medidor de potencia en algún lugar durante mucho tiempo, puede soldar las resistencias y el condensador directamente al CT.

Mostrado a continuación diagrama basico conectando CT a Arduino:


La pantalla LCD ya usa entradas analógicas, pero la pantalla solo usa A0. Simplemente suelde tres cables desde su sensor de corriente a los pines del escudo y use A1 como entrada del sensor como se muestra a continuación.


Una vez que tenga todos sus componentes conectados, deberá conectar el sensor a lo que desea monitorear.
En cualquier caso, es necesario colocar el TC alrededor de uno de los cables de alimentación, preferiblemente el cable rojo (fase). Asegúrese de que esté instalado solo alrededor de 1, ya que no funcionará si está alrededor de ambos y no se puede conectar alrededor del cable de tierra (cable desnudo amarillo y verde) ya que no fluye energía a través de ese cable. Si lo está conectando a la red eléctrica, conéctelo a uno de los cables de salida después del interruptor principal, como se muestra a continuación.

Seleccionar diferentes componentes

Básicamente, existen cuatro componentes que deben seleccionarse o calcularse adecuadamente para usted.

Selección de transformador de corriente

El primero es un transformador de corriente. Aquí se utiliza el Talema AC1030, que puede aceptar una corriente nominal de 30 A y una corriente máxima de 75 A. A 220 V, en teoría puede manejar hasta 16,5 kW durante períodos cortos de tiempo, pero está clasificado para manejar 6,6 kW de potencia de forma continua, lo que es adecuado para un hogar pequeño. Para calcular cuántos amperios necesita usar, tome la potencia continua máxima que espera consumir y divídala por el voltaje (generalmente 110 V o 220 V según su país).

Calibración de resistencia de carga

A continuación, debe determinar el valor de la resistencia R3; esto convertirá la corriente del CT en una señal de referencia de voltaje. Comience dividiendo la corriente primaria (máxima como se usa anteriormente) por la relación del transformador de corriente (disponible en la hoja de datos). Esto debería ser del orden de 500-5000 a 1. Este artículo funcionó a 42 A con una relación de 1000:1, lo que da una corriente secundaria de 0,042 A o 42 mA. Su voltaje de referencia analógico en el Arduino es 2,5 V, por lo que para determinar la resistencia que está utilizando, R = V / I - R = 2,5 / 0,042 = 59,5 ohmios. El valor de resistencia estándar más cercano es 56 ohmios, por lo que se utilizó.

Aquí hay algunas opciones sobre diferentes CT y sus resistencias de carga ideales (en tamaños estándar):

  • Murata 56050C – 10A – 50:1 – 13Ω
  • Talema AS-103 – 15A – 300:1 – 51Ω
  • Talema AC-1020 – 20A – 1000:1 – 130Ω
  • Alttec L01-6215 – 30A – 1000:1 – 82Ω
  • Alttec L01-6216 – 40A – 1000:1 – 62Ω
  • Talema ACX-1050 – 50A – 2500:1 – 130Ω
  • Alttec L01-6218 – 60A – 1000:1 – 43Ω
  • Talema AC-1060 – 60A – 1000:1 – 43Ω
  • Alttec L01-6219 – 75A – 1000:1 – 33Ω
  • Alttec L01-6221 – 150A – 1000:1 – 18Ω
  • CTYRZCH SCT-013-000 – 100A
  • TOOGOO SCT-013-000 – 100A
El condensador utilizado es de 10 uF, que debería ser suficiente para la mayoría de los rangos de CT para aplicaciones domésticas.

Por último, necesitas dos resistencias de desacoplamiento para obtener el voltaje de referencia de 2,5 V del Arduino. Deberían ser iguales, por lo que R1 = R2, y no necesitamos mucha corriente, razón por la cual estos artículos usan dos resistencias de 100 K ohmios.

Ahora puedes descargar el boceto a tu Arduino si aún no lo has hecho y luego sigue este tutorial para comenzar.

Actualización: desde entonces, el código se modificó para usar la función millis(); consulte el final de la sección para ver el código actualizado.

Descargar archivo: (descargas: 357)

Si no desea utilizar o no tiene una pantalla LCD, también puede modificar el boceto para enviarlo a la ventana serie Arduino IDE como se muestra a continuación.

Descargar archivo: (descargas: 340)

Actualización de código

Desde entonces, el código se ha modificado para utilizar la función integrada millis(), que calcula tiempo exacto ciclo para cada ciclo para mejorar la precisión. Esto sólo supone una mejora de medio por ciento en la precisión del cálculo, pero La mejor manera hazlo.

Aquí está el código mejorado: Descargar archivo: (descargas: 516) Para aquellos de ustedes que leen que la función millis() se desborda después de aproximadamente 49 días, el código se reinicia automáticamente.


Calibrar lecturas actuales

Como se mencionó anteriormente, dado que su configuración, CT, resistencias y voltaje de entrada pueden ser diferentes, hay un factor de escala en el boceto que deberá cambiar antes de obtener resultados precisos.

Para calibrar su medidor de energía, debe asegurarse de que la corriente que genera su medidor se mida exactamente como espera. Para hacer esto con precisión, necesita encontrar una carga calibrada. Esto no es fácil de encontrar en un hogar promedio, por lo que necesitarás encontrar uno que use una cantidad fija y constante de energía. He usado un par de bombillas incandescentes, vienen en diferentes tamaños y su consumo es bastante cercano al que aparece en la etiqueta, lo que significa que una bombilla de 100 W usa muy cerca de 100 W de potencia real, ya que es casi en su totalidad una carga puramente resistiva.

Enchufe una bombilla pequeña (de 100 W aproximadamente) y vea qué carga se muestra. Ahora necesitas configurar el uso del factor de escala en la línea de cálculo:

Doble RMSCurrent = ((maxCurrent - 516) * 0.707) /11.8337

En este caso es 11.8337, puede ser mayor o menor dependiendo de su aplicación. O usa la escala lineal para calcular esta cifra, o si eres malo en matemáticas, juega con diferentes significados hasta que la carga que cargó se muestre en la pantalla del medidor de energía.

Una vez calibrado tu medidor de energía, lo reiniciarás y dejarás que haga su trabajo. A continuación se muestran dos imágenes utilizadas para baja potencia y alta potencia.

Un tacómetro es una herramienta útil para contar las RPM (revoluciones por minuto) de una rueda o cualquier cosa que gire. La forma más sencilla de hacer un tacómetro es utilizar un transmisor y un receptor de infrarrojos. Cuando se interrumpe la conexión entre ellos, sabes que algo está girando y puedes usar el código para calcular las RPM en función de la frecuencia de la interrupción de la comunicación.

En este artículo, veremos cómo utilizar un transmisor y receptor de infrarrojos para fabricar un tacómetro con Arduino. El resultado se muestra en una pantalla LCD de 16x2.

Objetivo de este proyecto es crear un sistema con una entrada y una salida. En la entrada del dispositivo hay una señal que cambia de nivel alto (+5V) a bajo (+0V) cuando se interrumpe la comunicación. Según esta señal, Arduino incrementará el valor del contador interno. Luego se llevan a cabo procesamientos y cálculos adicionales y, cuando se interrumpe el disparador, las RPM calculadas se mostrarán en la pantalla LCD.

Para la comunicación usaremos un haz de infrarrojos de un LED de infrarrojos conectado a través de una resistencia de baja resistencia para que brille intensamente. Usaremos un fototransistor como receptor, que se “cierra” en ausencia de luz del LED IR. Se colocará un ventilador de computadora entre el transmisor de infrarrojos y el receptor y se encenderá. Un receptor de infrarrojos conectado a través de un circuito de transistores generará interrupciones. La interfaz LCD Arduino se utilizará para generar el resultado, de modo que podamos generar el valor final de RPM en la pantalla LCD.

Elementos:
Arduino UNO
LCD 16x2
tabla de pan
Resistencia recortadora 5 kOhm
Saltadores
Conectores SIP
2x transistores 2N2222 NPN
LED infrarrojo
Fototransistor
resistencia de 10 ohmios
Resistencia 100 kiloohmios
Resistencia de 15 kOhm o 16 kOhm
Ventilador de computadora

Lista detallada de artículos

Todos los elementos utilizados en el proyecto se enumeran arriba, pero describiré las funciones de los elementos principales con más detalle.

Arduino UNO
Esta es la placa Arduino que usaremos para procesar los pulsos de la interrupción del haz de infrarrojos que indican la presencia de una aspa del ventilador de la computadora entre el receptor y el sensor. Arduino utilizará estos pulsos junto con un temporizador para calcular las RPM del ventilador.

LCD 16x2
Una vez que Arduino haya calculado las RPM, este valor se mostrará en la pantalla de forma fácil de usar.

Resistencia recortadora 5 kOhm
Este recortador se utilizará para ajustar el contraste de la pantalla LCD de 16x2. Proporciona un voltaje analógico que oscila entre 0 y +5 V, lo que le permite ajustar el brillo de la pantalla LCD.

LED infrarrojo y fototransistor
El fototransistor se enciende cuando lo incide una potente luz IR. Entonces, cuando el LED IR está encendido, mantiene el fototransistor abierto, pero si el LED IR está cubierto por una aspa de ventilador, por ejemplo, entonces el fototransistor está cerrado.

2N3904 y 2N3906
Estos transistores se utilizan para convertir el nivel de la señal con el fin de proporcionar pulsos de salida desde el fototransistor al Arduino, en los que no hay voltajes distintos de +0 y +5V.

Diagrama esquemático

En el circuito, la interfaz de comunicación con la pantalla LCD está simplificada y tiene solo 2 líneas de control y 4 líneas de datos.

Características del esquema.

Interfaz LCD 16x2
2 pines de control y 4 para transferencia de datos están conectados desde Arduino a la pantalla LCD. Esto es lo que le dice a la pantalla LCD qué hacer y cuándo hacerlo.

Circuito de interrupción del haz de infrarrojos
La señal de rotura del haz de infrarrojos va al segundo pin digital del Arduino. Esto interrumpe el Arduino, permitiéndole contar el pulso y permitiendo que el tacómetro reciba los datos.

Biblioteca LCD Arduino

Para este proyecto usaremos la biblioteca LCD de Arduino. Básicamente, simplemente actualizaremos el valor de RPM en la segunda línea al nuevo.

Para prepararse, eche un vistazo al código siguiente, que utiliza esta biblioteca para mostrar "¡Hola, mundo!" en la pantalla LCD. En el tacómetro usaremos un código similar, especialmente: "lcd.print(millis()/1000);".

Comprenda las funciones de esta biblioteca LCD con el mayor detalle posible antes de seguir adelante. No es demasiado complicado y está bien documentado en el sitio web de Arduino.

Calcular RPM usando Arduino

Dado que vamos a calcular las RPM de un ventilador de computadora, debemos comprender que estamos utilizando la interrupción del haz de infrarrojos para el cálculo. Esto es muy conveniente, pero debemos tener en cuenta que el ventilador del ordenador tiene 7 aspas. Esto significa que 7 interrupciones equivalen a 1 revolución.

Si estamos rastreando interrupciones, debemos saber que cada séptima interrupción significa que acaba de ocurrir 1 rotación completa. Si llevamos la cuenta del tiempo que tarda en completar una revolución, podemos calcular fácilmente las RPM.

Tiempo de la 1.ª revolución = P * (μS/revolución)
RPM = rpm = 60.000.000 * (μS/min) * (1/P) = (60.000.000 / P) * (rpm)

Para calcular las RPM usaremos la fórmula dada anteriormente. La fórmula es precisa y la exactitud depende de qué tan bien Arduino pueda realizar un seguimiento del tiempo entre interrupciones y contar el número de revoluciones completas.

En la foto de abajo puedes ver todas las piezas y puentes necesarios como en el diagrama.

Primero, conecte +5V y las líneas de datos/control de la pantalla LCD. Luego pantalla LCD, potenciómetro de contraste y LED de encendido.

Se monta el disyuntor del haz de infrarrojos. Intente mantener cierta distancia entre el LED IR y el fototransistor. Esta foto muestra la distancia entre el LED IR y el fototransistor donde colocaré el ventilador de la computadora.

¡Basta de charlas sobre hardware! ¡Comencemos a hacer el firmware/programa para ver cómo funciona el dispositivo!

Parte del software

Hay dos partes principales del código, que se muestran y detallan a continuación:
-Ciclo de actualización de LCD principal
-Actualización de tiempos de interrupción

El ciclo principal cuenta las revoluciones y actualizaciones de la pantalla LCD. Dado que el bucle principal es un bucle while(1) gigante, siempre estará ejecutándose, se contarán las RPM y la pantalla LCD se actualizará varias veces por segundo. La función en la interrupción cuenta el tiempo entre interrupciones IR, por lo que puede contar las RPM en el bucle principal.

Recuerde que un ventilador de computadora tiene 7 aspas, por lo que este tacómetro está diseñado para funcionar únicamente con esos ventiladores. Si su ventilador u otro dispositivo solo produce 4 pulsos por revolución, cambie el código a "(tiempo*4)".

Los dos ventiladores funcionan a aproximadamente 3000 rpm y 2600 rpm, con un error de aproximadamente +/-100 rpm.

Revisión del tacómetro en Arduino.

El ventilador genera pulsos de interrupción y en la salida vemos RPM. Aunque la precisión no es del 100%, sino aproximadamente del 95%, y el costo de los elementos es de $10, tiene sentido construir este tacómetro en Arduino.

Entonces, ¿qué pasa ahora?

Los sistemas basados ​​en rotura de haz son útiles no sólo para mediciones de RPM, sino también como otros sensores. Por ejemplo, desea saber si una puerta está abierta o cerrada. Quizás quieras saber si algo pasó debajo del robot. Hay muchos usos para el corte de vigas y el circuito utilizado aquí es tan simple que hay muchas maneras de mejorar y construir otros dispositivos sorprendentes.

Conclusión

En general, considero que este proyecto es un éxito... Pero es cuestión de tiempo y experiencia... De una manera u otra, el sistema funciona según lo previsto y de manera bastante confiable, y obtuvimos el resultado esperado. ¡Espero que hayas disfrutado leyendo este artículo y aprendiendo cómo hacer tu propio tacómetro usando Arduino!

Lista de radioelementos

Designación Tipo Denominación Cantidad NotaComerciomi bloc de notas
placa arduino

ArduinoUno

1 al bloc de notas
T2, T3 transistores bipolares

2N2222

2 2N3904 y 2N3906 al bloc de notas
R1 Resistor

10 ohmios

1 al bloc de notas
R2 Resistor

100 kOhmios

1 al bloc de notas
R3 Resistor

16 kOhmios

1

Implementó la señal. PWM 25kHz. No tengo osciloscopio, pero quiero comprobar el resultado. Hacemos un contador de pulso y comprobamos el trabajo.

Tarea

En la base ATmega 328P implementar un contador de pulsos para verificar PWM 25kHz, no se necesita la precisión de las mediciones hasta el pulso, pero es necesario conocer el orden.

Solución

La lógica de la solución es simple: rastreamos los pulsos mediante los cuales incrementamos la variable global en el transcurso de un segundo. El valor acumulado será la frecuencia de la señal entrante.

Para leer pulsos usaremos interrupciones externas, se describen en las páginas 87-96 documentación del fabricante. EN Atmega 328P Hay dos entradas con las que podemos monitorear interrupciones externas. ENT0(PD2) Y ENT1(PD3), para resolver el problema usaremos INT0.

Configurar interrupciones externas

Lo primero que debes hacer es configurar el puerto. D como entrada, y para evitar interferencias conectaré una resistencia pull-up.

Para determinar qué eventos activarán el controlador de interrupciones, debe configurar el registro ÉRICA. bits ISC00 Y ISC01 son responsables por INT0, A ISC10 Y ISC11 detrás INT1. La configuración de los eventos monitorizados es idéntica, salvo la diferencia de bits:

00 Nivel bajo señal;
01 — cualquier cambio lógico en la señal;
10 — flanco descendente de la señal;
11 — Flanco ascendente de la señal.

Para habilitar directamente las entradas de interrupción, utilice el registro EIMSK, pedazos INT0 Y INT1 son responsables de las salidas del mismo nombre. Usando lo anterior escribimos el código.

Void int0_initial(void) ( DDRD = 0x00; // Puerto D como entrada PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Manejo de interrupciones externas

He configurado las interrupciones, ahora necesito procesarlas. Para ello existe una función de interrupción. ISR(), que necesita especificar el tipo de interrupción, en mi caso INT0_vector. En la función incrementaremos la variable. Conteo_tic:

ISR(INT0_vect) ( Tic_Count ++; )

Salida del resultado

Para facilitar la salida del resultado, para no arruinar la pantalla, utilicé un sucio ATmega 328P, A Arduino UNO Y arduino nano, a bordo del cual se encuentra el mismo MK.

Como escribí anteriormente, la precisión de las mediciones no es tan importante, por lo que no configuraré temporizadores, simplemente mostraré el valor acumulado de la variable en el bucle principal una vez por segundo. Conteo_tic y restablecerlo. Durante estas acciones dejo de procesar interrupciones.

A continuación se muestra el código completo para resolver el problema con comentarios:

#definir F_CPU 1600000UL #incluir #incluir volátil sin firmar int Tic_Count = 0; // Manejador de interrupciones externo INT0 ISR(INT0_vect) ( Tic_Count ++; ) void setup() ( int0_initial(); Serial.begin(9600); ) void loop() ( cli(); // Deshabilitar interrupciones Serial.println( Tic_Count); Tic_Count = 0; sei(); // Habilita interrupciones delay(1000); ) void int0_initial(void) ( DDRD = 0x00; // Puerto D como entrada PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Ahora solo queda conectar la señal PWM al pin PD2 y abrir el monitor del puerto serie. También puedes generar y probar una señal en un MK.

Las lecturas de salida son aproximadamente iguales a la frecuencia calculada previamente; se esperan diferencias menores debido a la implementación. Para una medición precisa, probablemente sea más correcto contar el tiempo entre pulsos y a partir de ahí calcular la frecuencia.



Si encuentra un error, seleccione un fragmento de texto y presione Ctrl+Entrar.