Circuitos contadores de impulsos de bricolaje. Cuentarrevoluciones simple - Diseños de complejidad simple - Circuitos para principiantes

💖 ¿Te gusta? Comparte el enlace con tus amigos.

A partir de unidades funcionales estándar de tecnología digital, no es difícil montar un cronómetro electrónico similar a los que se fabrican para las aulas de física de las escuelas. Estos dispositivos utilizan el método de medición del tiempo por conteo de pulsos, que consiste en medir el número de pulsos cuyo período de repetición se conoce. Dichos dispositivos contienen los siguientes componentes principales: un generador de impulsos de conteo, un circuito de control (en el caso más simple, su función la desempeña el botón "Inicio"), un contador decimal binario, decodificadores e indicadores. Los últimos tres nodos forman una década de conversión, modelando un decimal. Cabe señalar que medir el tiempo mediante el método de conteo de pulsos va acompañado de un error inevitable igual a una unidad de conteo. Esto se debe a que el dispositivo registrará el mismo número de pulsos y, por tanto, mostrará el mismo tiempo si el conteo se detiene inmediatamente después de la llegada del último pulso o justo antes de la llegada del pulso anterior. En este caso, el error tomará el valor más grande, igual al tiempo entre dos adyacentes.

Arroz. 172. Década de recálculo

impulsos. Si reduce el período de repetición del pulso e introduce dígitos del contador adicionales, puede aumentar la precisión de la medición en el número requerido.

En la Figura 172 se muestra una década del contador del cronómetro. Consiste en un contador binario-decimal en el decodificador y un indicador en la lámpara de neón. Para encender el indicador, es necesario. alto voltaje Por lo tanto, según las normas de seguridad, el dispositivo debe ser utilizado por un supervisor. El circuito utiliza un decodificador diseñado específicamente para funcionar con un indicador de alto voltaje. En lugar de una lámpara, puede utilizar lámparas de otros tipos: diseñadas para una tensión de alimentación de 200 V y una corriente de indicación. El microcircuito consta de un disparador con una entrada de conteo (entrada y un divisor de disparador por 5 (entrada). Al conectar. la salida de un disparador de conteo (salida 1) con la entrada del divisor, un contador binario-decimal. Responde al flanco descendente de un pulso positivo o a un paso de voltaje negativo aplicado a la entrada. El borde a veces se muestra como una flecha dirigida hacia el IC si responde a un paso de voltaje positivo, o una flecha dirigida en dirección opuesta al IC si reacciona a una caída de voltaje negativa.

Para controlar el funcionamiento de la década de conteo, se utilizan tres botones y un interruptor. Antes de que comience el recuento de la década

se pone a cero usando el botón “Establecer”. O", en este caso se suministra un 1 lógico a las entradas del contador. Luego, el interruptor selecciona la fuente de los pulsos de conteo; puede ser un disparador o un multivibrador. En el modo “conteo de cierre mecánico”, cuando se presiona y suelta el botón secuencialmente, se produce un conteo binario-decimal y el indicador enciende secuencialmente los números 1, 2, 3, etc. hasta el número 9, luego se enciende el número 0. y se repite el conteo. En el modo de conteo de pulsos, la entrada del contador recibe pulsos de un multivibrador ensamblado según el circuito ya conocido de la Fig. 168). Para medir el tiempo en segundos, la frecuencia del pulso debe ser de 1 Hz. esta instalado resistencia variable y capacidad igual

Para obtener un contador decimal binario de varios bits, se encienden secuencialmente, es decir, la salida del primero está conectada a la entrada del segundo, la salida del segundo está conectada a la entrada del tercero, etc. Para poner el contador de varios dígitos en el estado cero, las entradas se combinan y se conectan al Botón “Establecer”. 0".

Si, por ejemplo, el dispositivo está destinado a ser utilizado en lecciones de física, entonces el tiempo debe medirse en un rango bastante amplio: de 0,001 a 100 s. Para ello, el generador debe tener una frecuencia y el contador debe constar de cinco decimales. En este caso, las lecturas del indicador digital se verán así: 00.000; 00.001; 00.002,etc. hasta 99.999 s.

El ámbito de aplicación del contador-cronómetro de entrenamiento se puede ampliar significativamente si se introducen dos dispositivos adicionales- unidad de control sin contacto y unidad de retardo de tiempo. El primer bloque debe permitir el encendido y apagado automático y sin inercia del dispositivo. Para ello, puede utilizar el circuito de relé fotográfico ya conocido (Fig. 76), seleccionando la sensibilidad deseada y haciendo coincidir el voltaje de las fuentes de alimentación. El circuito de control debe tener dos fotosensores: uno se utiliza para encender y el otro para apagar el cronómetro en los momentos en que los rayos se cruzan con un cuerpo en movimiento. Conociendo la distancia entre los fotosensores y las lecturas del cronómetro, es fácil calcular la velocidad del cuerpo. La unidad complementaria utiliza dos amplificadores de fotocorriente. Sus señales de salida controlan el funcionamiento de un disparador de conteo, una de cuyas salidas está conectada a la entrada del cronómetro a través de un interruptor de transistor.

También se pueden dar otros ejemplos del uso de contadores electrónicos. Por ejemplo, una máquina que simula un juego de dados consta de la ya comentada década de

Y una lámpara de neón controlada por pulsos multivibradores (ver Fig. 168, 172). Los jugadores se turnan para presionar el botón que interrumpe el conteo. Gana aquel cuyo indicador muestre el número más alto. El momento en que se detiene el contador, así como el momento en que se detiene el cubo con puntos del 1 al 6, está determinado por motivos aleatorios, por lo que la cuenta de décadas junto con el multivibrador es un sensor electrónico de números aleatorios. Demos más ejemplos de su uso en diversas situaciones de juego.

Al verificar la velocidad de reacción de los jugadores, una resistencia establece una cierta frecuencia de funcionamiento del multivibrador y la velocidad a la que cambian los números del indicador (ver Fig. 168 y 172). Los participantes en el juego deben presionar el botón multivibrador cada vez que el indicador muestra un número determinado preseleccionado. Cuanto mayor sea la frecuencia de conmutación, más difícil será cumplir esta condición. Los más lentos son eliminados primero; el ganador es el jugador con mejor reacción. En otra versión más difícil del juego, debes continuar presionando el botón al ritmo establecido por el juez después de que desaparezca el indicador. Para ello ciérrelo con una cortina mecánica o apáguelo con un botón.

Una década de conteo junto con un multivibrador es especialmente conveniente de usar en juegos si su fuente de alimentación es autónoma, es decir, no está conectada a la red. En este caso, se utiliza un indicador LED de siete segmentos controlado por un decodificador de circuito integrado. Ya estamos familiarizados con este microcircuito e indicador (Fig. 150, 163). Los circuitos multivibrador y contador permanecen sin cambios. El circuito de un sensor de números aleatorios que funciona desde una fuente de 5 V se muestra en la Figura 173.

Un ejemplo de un dispositivo más complejo que funciona sobre la base de un medidor eléctrico es una unidad de retardo o temporizador. La Figura 174 muestra un diagrama esquemático de un temporizador que permite encender varias cargas durante un tiempo de 0 a 999 s. Consiste en un contador decimal de tres dígitos ensamblado en un microcircuito de tres decodificadores en un chip multivibrador y un circuito de control en un microcircuito, así como un microcircuito. La fuente de conteo de pulsos es un multivibrador sintonizado a una frecuencia de 1 Hz. Sus pulsos se envían a la entrada de un contador decimal de tres dígitos. Los códigos binarios de cada dígito se envían a los decodificadores. En sus salidas, las señales cero aparecen secuencialmente a medida que llegan a las entradas.

Arroz. 173. Década de recálculo con indicador LED

códigos binarios correspondientes. El ajuste del retardo de tiempo requerido se realiza mediante interruptores que conectan las salidas del decodificador con los elementos del microcircuito. Las entradas de los elementos Y se conectan en pares para obtener un elemento. El interruptor establece unidades en segundos, el interruptor en decenas de segundos. y el interruptor cientos de segundos. Si, por ejemplo, los interruptores están conectados a los pines 2, 3 y 7 del decodificador, entonces habrá tres ceros en las entradas del elemento OR-NOT solo en el momento en que el contador registre 237 pulsos o un período de tiempo. Han pasado 237 segundos desde el inicio del conteo. En este caso, aparecerá una señal 1 en la salida del elemento OR-NOT. Hasta este momento, para todos los códigos binarios del contador, la salida del elemento lógico era una señal cero.

El circuito de control del temporizador funciona de la siguiente manera. Primero se presiona el botón "Detener"; como resultado, el disparador RS ensamblado en el microcircuito se pone en estado cero. Desde la salida directa, el nivel de voltaje cero se suministra a un transistor 1/77, cuyo circuito emisor incluye un devanado de relé electromagnético. El transistor y el relé están apagados. Al mismo tiempo, en la salida inversa aparece 6. alto nivel, que sirve como señal de reinicio para el contador. Cuando presiona el botón "Inicio", el disparador RS pasa al estado único y aparece 3 en la salida directa. Nivel de alto voltaje, suficiente para abrir el transistor 1/77 y operar el relé. Sus contactos cierran el circuito de alimentación de la carga. Al mismo tiempo

(haga clic para ver el escaneo)

el nivel de voltaje cero eliminado de la salida inversa del disparador "abre" el contador. El contador funciona hasta que aparecen señales de salida correspondientes al número marcado en las salidas del decodificador. En este caso, como ya se mencionó, aparece una única señal en la salida, que se alimenta a través del inversor a la entrada del disparador. Se pone en estado cero y, en consecuencia, el transistor, el relé electromagnético y la carga se apagan. El contador se pone a cero.

El temporizador mostrará la hora actual en segundos si los LED están conectados a las salidas del decodificador. El conteo del tiempo será más conveniente si los códigos binarios decimales de los contadores se suministran a decodificadores que funcionan junto con indicadores de siete segmentos.

-20 dB escribió:
¿Por qué no abordar el asunto con poco derramamiento de sangre? ¿Existe algo como el IZhTS5-4/8 mencionado anteriormente, con salidas de segmento separadas?

En el alijo de K176IE4 sin usar de la época soviética, queda mucho (un contador/divisor por 10 con un decodificador de siete segmentos y una salida de transferencia, utilizado para formar unidades de minutos y horas en un reloj electrónico, un análogo incompleto... CD4026 - lo que está incompleto, no lo he mirado... todavía) en el encendido clásico para control LCD. 4 piezas - 2 por canal, + 2 piezas. 176(561)LE5 o LA7: ¿uno para formadores de pulso único (supresores de rebote de contacto), el segundo, para formar un meandro para “iluminar” el indicador LCD?

Por supuesto, la solución en MP es más hermosa, pero en la basura es más barata y solo se puede resolver en la rodilla... Con la programación MP, por ejemplo, lo paso mal (a menos que alguien me entregue un volcado ya preparado). ) - para mí es más fácil con el hardware.


Bueno, estoy dispuesto a apostar aquí. Hagamos los cálculos. Para empezar, el costo:
1. PIC12LF629 (SOIC-8) - 40 rublos. (~$1,15)
2. Pantalla de Motorola S200/S205/T190/T191: alrededor de 90 rublos (~$2,57). Además, la resolución es 98x64: dibuja y escribe lo que quieras.
3. A granel (atajos SMD, botones, condensadores SMD, etc.) de un vistazo: alrededor de 50 rublos. (~$1,42)

Total: ~180 rublos (~$5)

El caso, la batería (yo elegiría la batería Lo-Pol del mismo scooter C200: compacta, espaciosa, económica (relativamente)), no la contamos, ya que ambas son necesarias en ambas opciones.

Ahora tu opción:

1. LCI5-4/8 - alrededor de 50 rublos (~$1,42)
2. K176IE4 (CD4026) - 15 rublos (~0,42$)x4=60 rublos (~1,68$)
3. K176LA7 - 5 rublos (~0,14$)x4=20 rublos (~0,56$)
4. A granel (atajos SMD, botones, condensadores SMD, etc.) de un vistazo: alrededor de 50 rublos. (~$1,42)

Total: ~180 rublos (~$5)

¿Cuál es el beneficio?

Ahora estimemos las características de rendimiento y la funcionalidad:

La versión con MK tendrá consumo. máximo 20mA, mientras que en tu versión creo que 1,5...2 veces más. Además, en su versión existe la (relativa) complejidad de una placa de circuito impreso en 7 cajas + un ILC5-4/8 de múltiples patas (probablemente de doble cara), la imposibilidad de actualizar el dispositivo (agregar o cambiar funcionalidad) sin entrar en el circuito (solo a nivel de software), la imposibilidad de organizar la memoria para mediciones (conteo), fuente de alimentación de al menos 5V (con menos no balancearás el LCI), peso y dimensiones. Hay muchos más argumentos que se pueden dar. Ahora la opción con MK. Ya escribí sobre el consumo actual: 20 mA máx. + la posibilidad de un modo de suspensión (consumo - 1...5 mA (principalmente LCD)), la complejidad de la placa para un microcircuito de 8 patas y un conector de 5 pines para una pantalla LCD de Motorola es incluso ridícula. Flexibilidad (puede hacer algo como esto mediante programación, sin cambiar el circuito o la placa; esto le pondrá los pelos de punta), el contenido de información de la pantalla gráfica de 98x64 no se puede comparar con los 4,5 dígitos de un LCI de 7 segmentos. fuente de alimentación: 3...3,5 V (incluso puede usar una tableta CR2032, pero Li-Pol de Mabyl es aún mejor). La capacidad de organizar una memoria de múltiples celdas para los resultados de medición (recuentos) del dispositivo, nuevamente, solo a nivel de software, sin interferir con el circuito y la placa. Y finalmente, las dimensiones y el peso no se pueden comparar con su opción. El argumento "No sé programar" no será aceptado: quien quiera encontrará una salida. Hasta ayer no sabía cómo trabajar con la pantalla del teléfono móvil Motorola S205. Ahora puedo. Ha pasado un día. Porque lo NECESITO. Al final, tienes razón: puedes preguntarle a alguien.)) Eso es algo como esto. Y no es una cuestión de belleza, sino del hecho de que la lógica discreta está irremediablemente obsoleta tanto moral como técnicamente como elemento principal del diseño de circuitos. Lo que requirió docenas de cajas con un consumo total enorme, complejidad de PP y enormes dimensiones ahora se puede ensamblar con un MK de 28 a 40 pies de manera fácil y natural, créanme. Ahora hay mucha más información sobre MK que sobre lógica discreta, y esto es bastante comprensible.

El contador del microcontrolador es bastante sencillo de repetir y está ensamblado en el popular microcontrolador PIC16F628A con una salida de indicación en 4 indicadores LED de siete segmentos. El contador tiene dos entradas de control: “+1” y “-1”, así como un botón de “Reset”. El control del nuevo circuito contador se implementa de tal manera que no importa cuánto tiempo o poco tiempo se presione el botón de entrada, el conteo continuará solo cuando se suelte y se presione nuevamente. Cantidad máxima Los pulsos recibidos y, en consecuencia, las lecturas de ALS son 9999. Cuando se controla en la entrada "-1", el conteo se realiza en orden inverso al valor 0000. Las lecturas del contador se guardan en la memoria del controlador incluso cuando se enciende la alimentación. apagado, lo que guardará los datos en caso de interrupciones aleatorias en la tensión de alimentación.

Diagrama esquemático de un contador inverso en el microcontrolador PIC16F628A:

El reinicio de las lecturas del contador y al mismo tiempo el estado de la memoria a 0 se realiza mediante el botón "Reset". Debe recordarse que cuando enciende por primera vez el contador inverso en el microcontrolador, puede aparecer información impredecible en el indicador ALS. Pero la primera vez que pulsas cualquiera de los botones la información se normaliza. Dónde y cómo se puede utilizar este circuito depende de las necesidades específicas, por ejemplo, instalado en una tienda u oficina para contar visitantes o como indicador para una máquina de bobinado. En general, creo que este contador en un microcontrolador le resultará útil a alguien.

Si alguien no tiene el indicador ALS requerido a mano, pero tiene otro (o incluso 4 indicadores idénticos separados), estoy listo para ayudar a volver a dibujar el sello y rehacer el firmware. En el archivo del foro hay un diagrama de circuito, una placa y un firmware para indicadores con un ánodo común y un cátodo común. tarjeta de circuito impreso se muestra en la siguiente figura:

También hay nueva versión firmware para un contador en un microcontrolador PIC16F628A. Al mismo tiempo, el circuito y la placa del medidor permanecieron iguales, pero el propósito de los botones cambió: botón 1: entrada de pulso (por ejemplo, desde un interruptor de láminas), botón 2 enciende el conteo para restar los pulsos de entrada, mientras el punto más a la izquierda del indicador se ilumina, el botón 3 - agregar pulsos - El punto más a la derecha se ilumina. Botón 4 - restablecer. En esta versión, el circuito contador de un microcontrolador se puede aplicar fácilmente a una máquina bobinadora. Justo antes de dar vueltas o desenrollarlas, primero debes presionar el botón “+” o “-”. El medidor se alimenta desde una fuente estabilizada con un voltaje de 5V y una corriente de 50mA. Si es necesario, puede funcionar con baterías. El caso depende de tus gustos y capacidades. Esquema proporcionado por Samopalkin.

Contadores de impulsos eléctricos

Un contador es un dispositivo digital que cuenta el número de impulsos eléctricos. El factor de conversión del contador es igual al número mínimo de pulsos recibidos en la entrada del contador, después de lo cual los estados en la salida del contador comienzan a repetirse. Un contador se llama sumador si después de cada siguiente pulso el código digital en la salida del contador aumenta en uno. En un contador sustractivo, después de cada pulso en la entrada del contador, el código digital en la salida se reduce en uno. Los contadores en los que es posible pasar del modo suma al modo resta se denominan reversibles.

Se pueden preinstalar contadores. En tales contadores, la información de las entradas preestablecidas se transfiere a las salidas del contador. mediante una señal en una entrada preestablecida especial. Según su estructura, los contadores se dividen en serie, paralelo y serie paralelo. Un contador binario en serie está formado por una cadena de flip-flops contadores conectados secuencialmente. En un contador paralelo, los pulsos de conteo se aplican simultáneamente a las entradas. todos los dígitos del contador. Los contadores paralelos son más rápidos que los contadores en serie. Los contadores en serie paralela tienen alta velocidad y alto valor.

cambio del factor de conversión. Los contadores de impulsos eléctricos están disponibles en las series TTL y CMOS. Como ejemplo de contador TTL, considere el microcircuito K155IE5. Diagrama funcional El contador K155IE5 se muestra en la Figura 1.51,a, y su símbolo está encendido. diagramas de circuito

en la Figura 1.51, b. El contador K155IE5 en realidad tiene dos contadores: con un factor de conversión de dos (entrada C0 y salida Q 0) y con un factor de conversión de ocho (entrada C1 y salidas Q 1, Q 2, Q 3). Se obtiene fácilmente un contador con un factor de conversión de dieciséis conectando la salida Q0 a la entrada C1 y aplicando pulsos a la entrada C0. El diagrama de tiempos del funcionamiento de dicho contador se muestra en la Figura 1.52. La Figura 1.53 muestra diagramas de conexión que cambian el factor de conversión del medidor K155IE5. Las salidas del contador Q 0, Q 1, Q 2, Q 3 tienen Q 1, Q 2 con entradas para poner el contador a cero, obtenemos un contador con un factor de conversión de seis (figura 1.53a). La Figura 1.53, b muestra el diagrama de conexión para obtener un factor de conversión de diez, y la Figura 1.53, c - doce. Sin embargo, en los circuitos que se muestran en las Figuras 1.53, a - c, no hay posibilidad de poner los contadores en el estado cero.

Las figuras 1.54, a, b muestran, respectivamente, contadores con factores de conversión seis y siete, en los que se proporciona una entrada para poner el contador en el estado cero. Análisis operación del circuito, que se muestra en las Figuras 1.53 – 1.54, muestra que para obtener un factor de conversión dado, aquellas salidas del contador cuyos coeficientes de ponderación en total dan el factor de conversión requerido se conectan a las entradas del elemento lógico AND.

La Tabla 1.3 muestra los estados en las salidas del contador con un factor de conversión de diez después de la llegada de cada pulso siguiente, y el contador se configuró previamente en el estado cero.

Veamos algunos de los contadores de la serie CMOS. La Figura 1.55 muestra el símbolo del microcircuito K561IE8: un contador decimal con decodificador. El microcircuito tiene una entrada para poner al estado cero R, una entrada para suministrar pulsos de conteo de polaridad positiva CP y una entrada para Suministro de pulsos de conteo de polaridad negativa. CN.

El contador conmuta en función de la disminución de pulsos de polaridad positiva en la entrada CP, mientras que debe haber uno lógico en la entrada CN. El contador cambiará según la disminución de los pulsos de polaridad negativa en la entrada CN si la entrada CP es cero lógico. Una de las diez salidas del contador siempre tiene una lógica. El contador se pone a cero cuando se aplica uno lógico a la entrada R. Cuando el contador se establece en cero, la salida “0” se establecerá en uno lógico y todas las demás salidas se establecerán en ceros lógicos. Los chips K561IE8 se pueden combinar en contadores multibit con acarreo en serie, conectando la salida de acarreo del chip anterior a la entrada CN del siguiente. La Figura 1.56 muestra un diagrama de un contador multibit basado en microcircuitos K561IE10.

La industria produce contadores para relojes electrónicos. Veamos algunos de ellos. La Figura 1.57 muestra el símbolo del microcircuito K176IE3 y la Figura 1.58 muestra el microcircuito K176IE4.

En estas figuras, las salidas de los microcircuitos se muestran para la designación de segmento indicador estándar que se muestra en la Figura 1.59. Estos microcircuitos se diferencian entre sí por el factor de conversión.

El factor de conversión del microcircuito K176IE3 es seis y el factor de conversión del chip K176IE4 es diez. La puesta a cero de los contadores en cuestión se realiza aplicando una señal uno lógica a la entrada R. La conmutación de los activadores del contador se produce cuando los pulsos positivos disminuyen en la entrada C. Los microcircuitos tienen una salida de transporte p (pin 2), a la que generalmente se conecta la entrada del siguiente contador. La caída de voltaje en esta salida se forma en el momento en que el contador pasa del estado 9 al estado 0. Los microcircuitos difieren en las señales en el pin 3. Para el microcircuito K176IE3, aparece uno lógico en el pin 3 cuando el contador está configurado en estado 2, y para el microcircuito K176IE4, al estado 4. Esto es necesario para restablecer el reloj a las 24 horas.

Cuando se aplica una señal cero lógica a la entrada S, las lógicas en las salidas del contador estarán en aquellos segmentos que muestran el número de pulsos recibidos en la entrada del contador. Cuando se aplica una unidad lógica a la entrada S, la polaridad de las señales de salida cambia. La capacidad de cambiar la polaridad de las señales de salida hace que sea bastante fácil cambiar el diagrama de conexión de los indicadores digitales. La Figura 1.60 muestra un diagrama de cómo conectar un indicador luminiscente a las salidas del microcircuito K176IE4. La conexión del indicador a las salidas del microcircuito K176IE3 será similar. Diagramas de conexión

Indicadores LED

A menudo, cuando se opera un dispositivo microcontrolador, es necesario contar el tiempo "antropomórfico": cuántas fracciones de segundo debe brillar el LED, el período máximo de tiempo de doble clic, etc. En general, cuente no solo nano y microsegundos, pero también decenas de milisegundos, o incluso segundos, minutos e incluso horas (me temo que decir días...).
Al mismo tiempo, en los microcontroladores a menudo es necesario trabajar simultáneamente con microsegundos: períodos de pulso, espera anti-rebote, etc.
También hay dispositivos que funcionan de forma continua durante muchas horas e incluso días: equipos de aviación, equipos de automóviles, dispositivos de fondo de pozo (a veces hablamos de funcionamiento continuo durante varios días). En estos casos, el desbordamiento de temporizadores y variables de 8 bits es inaceptable.
Me gustaría combinar todo esto en una solución elegante y universal: tener un medio para medir el tiempo con una precisión de microsegundos que no se desborde durante varios días.
¿Por qué no? Sufrí durante algún tiempo y se me ocurrió una solución para microcontroladores AVR de 8 bits. Para hacer esto, utilicé un contador de tiempo de 8 bits y una variable de 4 bytes. Actualmente no trabajo con PIC ni AT89 y no estoy familiarizado con otras plataformas integradas. Sin embargo, si los lectores ayudan, yo también lo haré por ellos.
Ventajas: el código es muy repetible (ya estoy fabricando el quinto dispositivo con él); facilidad de operación (las interrupciones no se utilizan para la parte del trabajo del cliente); la parte del cliente del código es condicionalmente independiente de la plataforma; en la interrupción, una operación de suma (pero, claro está, para un valor de 4 bytes); No dispositivo externo- temporizador en tiempo real.
Sólo encontré un inconveniente: uno de esos temporizadores tan útiles y siempre necesarios está ocupado...
El artículo será de interés principalmente para los principiantes: no descubrí América aquí.

Teoría

Entonces, tengo a mi disposición un dispositivo basado en Atmega16A con cuarzo de 12MHz. Tomemos su contador de tiempo 0. Este es un temporizador de ocho bits, eso es suficiente para nosotros. ¿Por qué? Contamos:
  1. tomamos 12 MHz del cuarzo y tomamos el factor de división entre 8; obtenemos una frecuencia de 1500 KHz;
  2. Tomamos el modo CTC (reinicio por coincidencia) y configuramos la interrupción para que coincida con 150; obtenemos la frecuencia de interrupción de 10 KHz;
  3. en esta misma interrupción incrementamos la variable (se obtiene un incremento cada 0,1 milisegundos);
  4. si es un valor de 32 bits sin signo, se desbordará después de aproximadamente
    • 429496729,6 milisegundos;
    • 42949,7 segundos;
    • 7158,3 minutos;
    • 119,3 horas;
    • 4,97 días.
En otras palabras, esta solución crea un temporizador con una precisión de 0,1 milisegundos durante (casi) 5 días (sin embargo, debemos tener en cuenta que el cuarzo real tiene un error; hablaremos de esto más adelante). Y si también analiza el valor del temporizador 0 (se incrementa cada 2/3 microsegundos), entonces puede obtener un contador con una precisión de 0,67 microsegundos.
¿Suficiente? Detrás de mis ojos. Usando un contador de 0,1 milisegundos, en mis proyectos yo:
  • Cuento la duración del brillo y las pausas entre los LED;
  • Tomo en cuenta los tiempos de espera cuando trabajo con UART, USB;
  • En el equipo de prueba preparé todo tipo de situaciones: combinaciones espacio-temporales complejas;
  • Mantengo intervalos de tiempo específicos al sondear el ADC y otros sensores;
  • Le digo a la computadora la hora de mi funcionamiento (del dispositivo) y transmito información en un intervalo de tiempo determinado;
  • Teniendo en cuenta el contador hasta el microsegundo, realizo un control anti-rebote al pulsar teclas, analizando pulsos en largas líneas.
¡Y todo esto cabe fácilmente en UN CONTROLADOR ATmega16! Además, ¡esto no es Assembler, sino C multiplataforma! ¡Y sin contador externo en tiempo real!
No está mal, ¿verdad?

Configuración para AVR

¿Cómo hacer todo esto en AVR?
En primer lugar, creamos una variable externa, a la que llamo “DeciMilliSecond”:
// en main.h typedef unsigned long dword; // entero de 32 bits sin signo extern volatile dword dmsec; // 0,1 ms // en main.c volatile dword dmsec;
Como señaló correctamente @no-smoking, esta variable debe ser volátil para que el compilador no intente optimizarla.
Inicializo esta variable en una función:
dmseg = 0;
A continuación, configuro el modo de funcionamiento del temporizador 0:
// . temporizador 0 – 0,1 mseg Timer0_Mode (TIMER_Mode_CTC | TIMER0_Clk_8);
Temporizador0_Cntr(149);
Temporizador_Int(Temporizador0_Cmp); Al mismo tiempo, en algún MCU_init.h declaro todo lo que se necesita:<< 1) // совпадение таймера 0 // . TCCRn #define WGM1 (1 << 3) #define CS1 (1 << 1) // . источник сигнала для таймера 0 #define TIMER0_Clk_8 CS1 // предделитель 8 // . режим работы таймера #define TIMER_Mode_CTC WGM1 // CTC (сброс при совпадении) // . настройка таймера #define Timer_Int(Mode) TIMSK = (Mode) #define Timer0_Mode(Mode) TCCR0 = (Mode) #define Timer0_Cntr(Cntr) OCR0 = (Cntr)
// en mcu_init.h #incluir
// . TIMSK #definir Temporizador0_Cmp (1
Bueno, entonces, cuando sea posible, habilito las interrupciones:
#asm("SEI") Queda por describir la interrupción. Esto es más fácil que todo lo anterior:
#incluir

interrumpir Timer0_Compare (nulo) ( ++dmsec; )

¡Eso es todo, el temporizador está descrito, configurado y funcionando!

Configuración para PIC

Esto es lo que me dijeron los queridos fans de PIC:
En los picos, esto se puede repetir fácilmente usando el módulo Timer2. Tiene una función de interrupción similar por coincidencia.
PR2 = 75: el valor en el que el temporizador se reiniciará y generará una interrupción
T2CON.T2CKPS = 2 - preescalador 1:16

T2CON.T2OUTPS = 0 - sin postescalador
T2CON.TMR2ON = encendido - el temporizador está habilitado
PIE1.TMR2IE = activado: habilita la interrupción cuando TMR2 y PR2 coinciden
INTCON.GIE = ​​​​activado: habilita el procesamiento de interrupciones

Como puede ver, el preescalador aquí es 2 veces más grande, por lo tanto PR2 es 2 veces más pequeño.
Estas configuraciones generarán interrupciones con una frecuencia de 10 kHz a una frecuencia del sistema de 48 MHz (el temporizador está configurado en Fosc/4), la frecuencia estándar para USB Full Speed.

Uso

El código para el cliente de este temporizador es multiplataforma (excepto para acceder al valor del temporizador 0 en AVR).
Aquí hay un fragmento del código para compartir USB:
#include "main.h" // aquí está la variable dmsec, next_USB_timeout #include "FT245R.h" // aquí están las funciones para trabajar con el módulo USB #include "..\Protocol.h" // aquí está el microcontrolador -protocolo de intercambio de computadora // * * // ** Analizar paquetes USB // ** void AnalyzeUSB (void) ( #define RECEIVE_BYTE(B) while (!FT245R_IsToRead)\ ( if (dmsec > end_analyze) return; )\ B = FT245_ReadByte (); #define RECEIVE_WORD(W) // similar para 2 bytes #define RECEIVE_DWORD(W) // similar para 4 bytes dword end_analyze, d; NewAnalyze: if (!FT245R_IsToRead) // no devuelve ningún paquete; max_USB_timeout; para el análisis actual next_USB_timeout = dmsec + MaxSilence_PC_DEV; // tiempo de espera para el intercambio general RECEIVE_BYTE (b) // cambio de encabezado de paquete (b) ( case SetFullState: RECEIVE_DWORD (d); // lee la palabra is_initialized = 1; // procesar ChangeIndicator () ; romper ) // cambiar (paquete) ir a NewAnalyze; #undef RECEIVE_BYTE // cancelar #define #undef RECEIVE_WORD #undef RECEIVE_DWORD )
Las funciones macro RECEIVE_BYTE, RECEIVE_WORD, RECEIVE_DWORD implementan procedimientos de lectura teniendo en cuenta el tiempo de espera de una determinada fase de intercambio. Como resultado, si algo se cuelga del otro lado, el microcontrolador no entrará en hibernación. Tenga en cuenta: ¡WatchDog no es necesario! Y todo gracias a la variable/constante max_USB_timeout, que establece el tiempo de espera con una precisión de 0,1 milisegundos.
El análisis del “silencio en el aire” utilizando la variable next_USB_timeout se implementa de la misma manera. Esto permite que el microcontrolador 1) sepa que la computadora ha desaparecido en alguna parte, 2) lo indique de alguna manera (en mi caso, el LED de "error" se enciende). La constante/variable MaxSilence_PC_DEV le permite variar el concepto de "silencio" dentro del rango más amplio, desde una fracción de milisegundo hasta varios días.
Todos los demás puntos se implementan de manera similar.
Si necesita utilizar un contador de microsegundos, allí aparece una función de comparación:
#define GetUSec(A,B) ( #asm ("CLI"); A = dmsec; B = TCNT0; #asm ("SEI"); ) // ** // ** Diferencia horaria entre eventos con precisión de 2/ 3usec // ** Diferencia de dword (dword prev_dmsec, byte prev_usec) ( dword cur_dmsec; byte cur_usec; ​​​​dword dif; // . anota la hora actual GetUSec (cur_dmsec, cur_usec); // calcula la diferencia dif = cur_dmsec - prev_dmsec ; diferente<<= 8; if (cur_usec < prev_usec) dif += 255 + (dword) cur_usec - prev_usec; else dif += cur_usec - prev_usec; return dif; }
A la función se le pasa el punto anterior en el tiempo: el valor anterior de dmsec y el temporizador 0.
Primero, usamos la macro GetUSec para detener las interrupciones para que el valor de dmsec y el contador no se dañen al momento de copiar. Y copie la hora actual.
A continuación, convertimos la diferencia horaria al formato de 2/3 de microsegundo, teniendo en cuenta el desbordamiento.
Bueno, volvamos esta vez.
Y luego usamos esto de forma regular para controlar las medidas anti-rebote y otras medidas. No olvide también pausar las interrupciones al marcar el momento actual, o mejor aún, use la macro GetUSec.

Resultados

Este temporizador resultó ser una solución extremadamente conveniente para mí. Creo que también te será útil. Y lo usé en mis siguientes proyectos:
  • Situaciones de vallado de centralita. Se trata de una placa robusta de medio metro con tres controladores: ATmega128 como central y ATmega64 como dos auxiliares (lados derecho e izquierdo). No existe conexión galvánica entre los tres controladores y sus componentes: la alimentación se basa en ionistores y la comunicación se realiza mediante optoacopladores. El controlador central carga grupos de algunos ionistores y en este momento alimenta ambos lados desde otros ionistores. Aquí tuvimos que crear un algoritmo de varias etapas para cambiar todo esto con el fin de minimizar la interconexión. En particular, estamos hablando del trabajo coordinado de 8 relés: aquí los temporizadores funcionan durante 3,3 ms (tiempo de respuesta de relé garantizado). Bueno, de hecho, ambas partes controlan 10 relés y alrededor de medio centenar de multiplexores. Todo este equipo funciona con características de tiempo claramente definidas (con una precisión de 1 ms, la duración máxima es de 6 segundos). Bueno, al final, tiempo de espera banal para USB, UART.
  • Sensor de profundidad. Aquí estoy resolviendo otro problema (un proyecto en progreso). Hay dos conductores (de muchos metros de largo) que definen la situación “desplazamiento hacia arriba 1 cm” y “desplazamiento hacia abajo 1 cm”. Hay muchas maneras de establecer una dirección. En cualquier caso, se trata de determinadas combinaciones de impulsos. Usando este temporizador determino el rebote y la duración de un pulso estable. El tiempo de rebote máximo permitido (aquí 10 microsegundos es suficiente), la espera anti-rebote y la duración mínima/máxima del pulso se configuran desde la computadora. Bueno, hay un modo de depuración: el sensor se convierte en un analizador lógico. Esto le permite depurar el funcionamiento de la línea y ajustar los coeficientes. Bueno, de nuevo tiempo de espera, LED.
  • Sensor de señal analógica. Un ADC banal de 8 canales. Aquí utilizo un cronómetro para tomar las pausas necesarias.
Estimados usuarios de habra de otras plataformas, pueden indicarme el código de inicialización del temporizador correspondiente, así como las reglas para acceder a él; lo agregaré aquí. Puede que sea necesario seleccionar horarios diferentes para otras plataformas. Pero en cualquier caso, debería ser algo dentro de unas pocas unidades de microsegundos para el temporizador en sí y algo múltiplo de 100 microsegundos para la variable del contador. Porque resulta que a veces un milisegundo no es suficiente.
Dile a tus amigos
Con el advenimiento...