Esquema eléctrico del encoder sgp 1 0196. Conexión de un codificador a un microcontrolador PIC

Finalmente obtuve este maravilloso giro y ahora quiero decirte cómo trabajar con él. Mi codificador (EC12E24204A9) es algo como esto:

El codificador tiene tres pines: Común, A y B. El común suele estar siempre conectado a tierra y los otros dos a cualquier pin del microcontrolador. Los pines A y B se deben tirar hacia la fuente de alimentación positiva a través de resistencias del orden de 10 kOhmios para excluir falsas alarmas de las captaciones. No recomendaría usar un ajuste de microcontrolador interno. Ella es muy débil. Para demostrar cómo funciona, cuelguemos 8 LED más. (nota: si se utilizan mega16, mega32 y anteriores, debe apagar jtag; de lo contrario, la mitad de los LED no se iluminarán)
Entonces obtuvimos el siguiente esquema:


Gire la perilla del codificador hacia la derecha; la luz corre hacia la derecha. Gire a la izquierda: la luz corre hacia la izquierda. ¿Cómo funciona un codificador? Lo averiguaremos. No hay nada complicado. Echemos un vistazo a los gráficos a continuación.
Cuando el codificador se gira en una dirección, la señal se ve así:

A otro:

Surge la pregunta, ¿cómo puede el microcontrolador distinguir el sentido de rotación del codificador?

Hay dos algoritmos de sondeo de codificadores populares:

  • Interrumpir sondeo
  • Sondeo comparando el estado anterior del codificador y el actual

Cada uno de estos métodos de encuesta tiene sus propias ventajas y desventajas. Probé ambos y me decidí por el segundo método. Lo bueno del sondeo con interrupciones es que puede proporcionar una respuesta instantánea a la rotación de la perilla del codificador. Pero también existe un serio inconveniente. Como el rebote de contacto. Para suprimirlo, por supuesto, puede usar varias herramientas de software y hardware, pero no me molesté. Echemos un vistazo más de cerca al segundo algoritmo de sondeo. Durante el funcionamiento, el microcontrolador lee continuamente datos de los pines en los que cuelga el codificador y compara lo que lee con el resultado de la lectura anterior. Dependiendo del resultado de la comparación de los estados, el programa saca conclusiones sobre el sentido de rotación. Hay comentarios en el programa, creo que serán suficientes para entender el algoritmo. Si tienes alguna duda, puedes preguntar, como siempre, en los comentarios.

Codificador incremental parece potenciómetro, pero a diferencia de un potenciómetro, no tiene posiciones finales, puede girar en ambas direcciones para un número ilimitado de revoluciones. También debe tenerse en cuenta que el codificador incremental no gira tan suavemente como el potenciómetro, sino en pasos. Se puede ver en la radio del coche, osciloscopio, un centro de música, una lavadora y otros equipos, donde el ajuste de un parámetro se realiza dentro de amplios límites. Por supuesto, los parámetros también se pueden cambiar usando los botones, por ejemplo, para hacer que la música 20 valores más fuerte, cuando controle el botón, debe presionarlo 20 veces, y cuando controle el codificador, gírelo a un cierto ángulo, dependiendo del algoritmo de procesamiento.

Codificador incremental representa dos contactos, cuyo orden de cierre depende del sentido de giro.


De hecho un codificador incremental convierte la rotación del eje en impulsos eléctricos que contiene información sobre el sentido de giro.

Construyamos el circuito de prueba que se muestra en la imagen de arriba y conectemos a los pines A y B osciloscopio, resistencias pull-up - 4.7K.
Giremos el codificador en el sentido de las agujas del reloj.


Ahora en sentido antihorario.


Los oscilogramas muestran que, dependiendo del sentido de rotación, cambia el orden de cierre de los contactos. Pero el frente no siempre resulta tan hermoso.


Dado que los contactos son mecánicos, son propensos a rebotar, es decir, al cerrarse debido a la elasticidad de los materiales, se producen múltiples cortocircuitos incontrolados y aberturas, que se pueden ver en el oscilograma de arriba.

Hay dos formas de lidiar con el rebote: primero consiste en agregar condensadores y resistencias como se muestra en la siguiente imagen.


Dado que el rebote es un fenómeno a corto plazo, un condensador lo extingue fácilmente.


El oscilograma muestra que después de instalar los condensadores, los frentes se volvieron menos empinados y el rebote desapareció.

Segunda forma- software y todo depende de la implementación del sondeo de las salidas del codificador. Si estado del codificador supervisado por interrupciones externas, luego de que se dispara la interrupción, es necesario hacer un retraso de 20-30 milisegundos, durante el cual el MC no responderá a un cambio en el estado de salida, es decir, no sentirá rebote. Si el sondeo de los pines del codificador se implementa en un temporizador, entonces el intervalo entre encuestas debe ser más largo que la duración del rebote, los mismos 20-30 milisegundos.

consideremos métodos de procesamiento de datos provenientes del codificador.
El primer método es que conectamos una de las patas del codificador a la salida de interrupciones externas y la configuramos para una interrupción en el flanco descendente. En la interrupción, verificamos el estado de la otra pierna, y si es cero, entonces la rotación ocurre en una dirección, de lo contrario en la otra. A continuación se muestra el código que implementa este método para AVR.
#incluir ISR (INT2_vect) (si (PINB y 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<Cuando el codificador se gira hacia un lado, el LED se enciende, cuando el codificador se gira hacia el otro lado, se apaga.

El segundo método es comparando el estado actual y el anterior... Expresemos los niveles lógicos del tren de pulsos como ceros y unos.


Entonces obtenemos un número finito de estados del codificador. El primer dígito es el nivel lógico de la primera salida del codificador, el segundo es el nivel lógico de la segunda salida.

Supongamos que el último estado en el que se ubicó el codificador es igual a tres, si el siguiente estado es igual a uno, entonces gira en una dirección, si es dos, luego en la otra. Resulta que puedes arreglar la transición de un estado a otro y determinar el sentido de rotación, pero la implementación más simple es cuando pasas de 11 a 01 y 10. A continuación se muestra el código que implementa el algoritmo descrito para AVR,
#define F_CPU 8000000UL #include #incluir uint8_t last_state = 0; ISR (TIMER0_COMP_vect) (// ambos pines del codificador están conectados a los pines 2 y 3 del puerto B // leer su estado uint8_t current_state = (PINB & 0x06) >> 1; // tener en cuenta la transición solo si el estado anterior es 11 // y si no es igual al nuevo if ((last_state == 3) && (last_state! = Current_state)) (// si el nuevo estado es 01 - enciende el LED if (current_state == 1) (PORTB | = 0x01;) // si el nuevo estado es 10 - apague el LED if (current_state == 2) (PORTB & = ~ 0x01;)) // al salir de la interrupción, el estado actual se convierte en el último estado anterior = current_state;) int main (void) (// dos entradas para conectar el codificador DDRB & = ~ 0x06; // extraer las entradas a la fuente de alimentación PORTB | = 0x06; // salida para conectar el LED DDRB | = 0x01 ; // configurar el temporizador para reiniciar por coincidencia TCCR0 = (1<Eso es todo.
Codificador comprado

El módulo codificador KY-040 es un sensor de ángulo de rotación mecánico, convierte el ángulo de rotación de un objeto giratorio (por ejemplo, un eje) en señales eléctricas que se desplazan 90 grados entre sí. Este módulo tiene tres pines: CLK, DT y SW. Las señales desplazadas 90 grados entre sí aparecen con precisión en los pines CLK y DT cuando se giran en sentido horario / antihorario, el pin SW se utiliza para obtener el estado del eje central del codificador, que funciona como un botón.

Entonces, sin entrar en los detalles del dispositivo codificador en circuito (este será un artículo separado), conectémoslo a la placa Arduino Uno. Diagrama de conexión del módulo codificador junto con un indicador de siete segmentos de varios dígitos:

Nos bastará con tan solo analizar el estado de las señales que dan los pines CLK y DT, para ello existe un pequeño diagrama de circuito que mostrará cómo se desplazan las señales al girar en una dirección u otra.

Se puede ver en el diagrama que cada vez que la señal A (pin CLK del codificador) pasa de alta a baja, se lee el estado de la señal B (pin DT del codificador). Si la señal B da un nivel de señal alto, significa que la rotación del codificador es en el sentido de las agujas del reloj. Si la señal B da un nivel de señal bajo en la transición de la señal A de nivel bajo a alto, esto significa que la rotación del codificador es en sentido antihorario. Al leer ambas señales en el programa, puede determinar la dirección de rotación, también al contar los pulsos de la señal B, puede incrementar o disminuir el contador de pulsos del software.

Para leer las señales A y B, así como las señales del eje central del codificador (recuerde, funciona como un botón), puede aplicar la estructura que se describe a continuación. Este diseño se puede integrar en el boceto, agregando varias funcionalidades, todo está limitado solo por el deseo y la imaginación del desarrollador. El cuerpo de la estructura está suficientemente bien comentado, se pueden eliminar más comentarios para simplificar el texto del boceto. Entonces, una estructura para leer y convertir señales de codificador en datos útiles:

// Variables temporales para almacenar niveles de señal // recibidas del codificador unsigned char encoder_A, encoder_B, encoder_A_prev; // Variable para rastrear los clics en los botones - // el eje central del codificador static bool SW_State = false; void setup () (// Presets // Declaraciones de variables // Inicializar puertos, etc.) void loop () (// Conectar CLK al pin 3 en la placa Arduino // Conectar DT al pin 4 en la placa Arduino // Leer los valores de las salidas del encoder // Y almacenarlos en variables encoder_A = digitalRead (3); encoder_B = digitalRead (4); // Si el nivel de señal A es bajo, // y en el ciclo anterior fue alto si (! Encoder_A && encoder_A_prev) (// Si el nivel de señal B es alto if (encoder_B) (// Esto significa que la rotación es en el sentido de las agujas del reloj // Aquí puede insertar una operación de incremento // Aquí puede insertar algunas propias // operaciones de procesamiento de datos en la dirección requerida) // Si el nivel de señal es demasiado bajo else (// Esto significa que la rotación es en sentido antihorario // Aquí puede insertar una operación de disminución // Aquí puede insertar algunas de sus propias // operaciones de procesamiento de datos en la dirección requerida)) // Es imperativo guardar el estado del nivel de señal actual A // para su uso utilizando este valor en el siguiente ciclo de exploración del programa encoder_A_prev = encoder_A; // Trabajamos con el eje central del codificador - un botón // Esta pieza de código forma una especie de disparador de palanca // Lee el valor del pin 2 en la placa Arduino // al que está conectado el pin SW del codificador // Si se presiona el eje central, entonces la señal SW será de nivel bajo if (! DigitalRead (2)) (// Si la variable SW_State se establece en falso, entonces se establece en verdadero if (! SW_State) (// Y recuerde el estado SW_State = true;) // Y viceversa - si la variable SW_State se establece en true, // entonces restablecerla a false else (// Y recuerda el estado SW_State = false;)))

A continuación se muestra un esquema para procesar las señales del codificador y mostrar el valor del contador en la pantalla. Este boceto tiene una estructura incorporada para leer y convertir señales de codificador, que se describió anteriormente.

#include "LedControl.h" / * * Conectamos la biblioteca LedControl.h * y creamos un objeto de la clase LedControl * mientras que la pantalla de 7 segmentos con el controlador MAX72xx * debe conectarse a la placa Arduino de la siguiente manera: * Arduino -> Módulo de pantalla MAX72xx * Arduino -> Módulo de pantalla MAX72xx * Arduino -> Módulo de pantalla MAX72xx * Arduino -> Módulo de pantalla MAX72xx * Arduino -> Módulo de pantalla MAX72xx * Arduino -> Módulo codificador * Arduino -> Módulo codificador * Arduino -> Codificador Módulo * / LedControl lc = LedControl (12, 11, 10, 1); // Nombra las direcciones de los puertos en la placa Arduino const int Dir = 4; const int Paso = 3; const int Switch = 2; // Contador es una variable para almacenar el valor del contador static long Counter = 0; // SW_State - Disparador de bandera para el seguimiento de la presión del eje central static bool SW_State = false; // Variables temporales para almacenar los niveles de las señales del codificador unsigned char encoder_A, encoder_B, encoder_A_prev; void setup () (// El dispositivo (pantalla de 7 segmentos) sale del modo de suspensión lc.shutdown (0, false); // Establece el brillo de la pantalla en 8 // Total de modos de brillo posibles de 0 a 15 lc. setIntensity (0, 8); // Limpiar la pantalla lc.clearDisplay (0); // Configurar los puertos para el codificador pinMode (Dir, INPUT); pinMode (Step, INPUT); pinMode (Switch, INPUT);) void loop () (// Leer los valores de las salidas del encoder // Y almacenarlos en variables encoder_A = digitalRead (Step); encoder_B = digitalRead (Dir); // Si el nivel de señal A es bajo, // y en el ciclo anterior era alto if (! Encoder_A && encoder_A_prev) (// Si el nivel de señal B es alto if (encoder_B) (// Esto significa que la rotación es en el sentido de las agujas del reloj // Nuestra condición: // Si el valor del contador es mayor que o igual al número máximo if (Contador> = 99999999) (// Restablecer el valor del contador Contador = 0;) else (// De lo contrario, incremente cada vez que haga clic en un Contador ++;)) // Si el nivel de la señal B es bajo else (// Zn Lee rotación en sentido antihorario // Si el valor del contador es menor o igual a cero si (Contador<= 0) { //проинициализировать значение максимальным числом Counter = 99999999; } else { //Иначе декрементировать при каждом щелчке на единицу Counter --; } } } //Обязательно нужно сохранить состояние текущего уровня сигнала А //для использования этого значения в следующем цикле сканирования программы encoder_A_prev = encoder_A; //Работаем с центральной осью энкодера - кнопкой //Этот кусок кода образует собой как бы перекидной триггер //Считываем значение пина 2 на плате Arduino //которомый проименован как Switch //Если центральная ось нажата - то сигнал Switch будет иметь низкий уровень if(!digitalRead(Switch)) { //Если переменная SW_State установлена в false то установить её в true if(!SW_State) { //И запомнить состояние SW_State = true; } //И наоборот - если переменная SW_State установлена в true, //то сбросить её в false else { //И запомнить состояние SW_State = false; } } //Часть программы которая заполняет разряды //семисегментного дисплея значением счетчика long intCounter = Counter; int divCounter; for(int i = 0; i < 8; i ++) { divCounter = intCounter % 10; intCounter = intCounter / 10; if(intCounter == 0 && SW_State) { if(divCounter == 0) { if(i == 0) { lc.setChar(0, 0, "0", false); } else { lc.setChar(0, i, " ", false); } } else { lc.setDigit(0, i, divCounter, false); } } else { lc.setDigit(0, i, divCounter, false); } } }

Video como funciona:


Esperamos que te haya gustado el material de este artículo, deja tus dudas, deseos y críticas en los comentarios a continuación.

  • Usando codificadores ópticos industriales en Arduino
Habilite javascript para que los comentarios funcionen.

Para implementar un proyecto de demostración, necesitamos:

  • Codificador de 24 posiciones;
  • 16 LED (3 mm);
  • Controlador LED A6276;
  • microcontrolador PIC18F2550.

Un codificador es un elemento de control moderno y original para dispositivos digitales, y en apariencia es similar a una resistencia variable (ver figura a continuación). Otro nombre para este control es sensor de ángulo, sensor de rotación. La rotación del eje va acompañada de clics, por ejemplo, 24 clics por revolución. El codificador tiene 3 salidas: A, B, C y se utiliza para la entrada rápida de datos en dispositivos digitales. Algunos modelos tienen un botón incorporado que se activa presionando el eje del codificador (se agrega una salida más).

Principio de funcionamiento del codificador

Al girar un clic, por ejemplo, hacia la derecha, el contacto A + C se cierra primero, luego B + C. Cuando el eje gira con este clic, los contactos se abren en la misma secuencia. Cuando el eje se gira en la otra dirección, la secuencia de cierre con el contacto C cambia, es decir al girar a la izquierda, primero B + C se cierra, luego A + C.

Usando el codificador en proyectos de microcontroladores, quizás usando el mismo codificador, implemente varios tipos diferentes de entrada de datos, sin embargo, esto requiere cierta retroalimentación y visualización para que el usuario sepa qué información está ingresando y en qué posición está el codificador.

Diagrama esquemático

Los pines A y B del codificador están conectados a los puertos del microcontrolador RB4 y RB5, el pin C del codificador está conectado a tierra. Vale la pena señalar que las resistencias pull-up deben conectarse a las líneas de señal de los pines A y B. El codificador no se conecta accidentalmente a las líneas de E / S especificadas del microcontrolador: en primer lugar, el puerto B tiene resistencias pull-up incorporadas y no tenemos que conectar las externas, y en segundo lugar, el puerto B del microcontrolador tiene una muy función útil - "interrupción-cambio" - interrupción en el cambio de nivel, que nos permitirá controlar el estado del codificador.

Se utilizan 16 LED convencionales de 3 mm para visualizar los datos de entrada y se ubicarán en la PCB alrededor del codificador instalado. Los LED están conectados al chip A6276.

El A6276 es un controlador LED en serie de 16 bits. El controlador contiene un registro de desplazamiento CMOS de 16 bits, pestillos y controladores asociados para controlar los LED, y puede activar más LED de los que permite el microcontrolador. Además, el controlador se puede controlar a través de la interfaz SPI, lo que reduce aún más el número de líneas de E / S utilizadas y hace que el proyecto sea escalable.

El software del microcontrolador para resolver nuestro problema es relativamente simple. Hay 3 modos de funcionamiento (entrada de información) y retroalimentación:

  • Modo de posicionamiento de 360 ​​°: en este modo, los LED indican la "posición" actual del codificador, el usuario puede girar el eje del codificador hacia la izquierda y hacia la derecha en cualquier ángulo;
  • Modo "Volumen / Nivel": en este modo, los LED indican el valor actual entre los niveles mínimo y máximo del rango de entrada (como el nivel de volumen en los dispositivos de audio);
  • Modo de alternancia giratoria de 3 posiciones: en este modo, solo hay tres posiciones seleccionables que el usuario selecciona girando el eje del codificador hacia la izquierda o hacia la derecha.

Demostración del proyecto

Descargas

Se ubica el archivo ZIP con el proyecto en el entorno MPLAB y el código fuente en Hitech C, así como el diagrama esquemático y la topología de la placa de circuito impreso.

En este proyecto de demostración, veremos la tarea de emparejar un control llamado codificador con un microcontrolador PIC.

Para implementar un proyecto de demostración, necesitamos:

  • Codificador de 24 posiciones;
  • 16 LED (3 mm);
  • Controlador LED;
  • microcontrolador.

Un codificador es un elemento de control moderno y original para dispositivos digitales, y en apariencia es similar a una resistencia variable (ver figura a continuación). Otro nombre para este control es sensor de ángulo, sensor de rotación. La rotación del eje va acompañada de clics, por ejemplo, 24 clics por revolución. El codificador tiene 3 salidas: A, B, C y se utiliza para la entrada rápida de datos en dispositivos digitales. Algunos modelos tienen un botón incorporado que se activa presionando el eje del codificador (se agrega una salida más).

Principio de funcionamiento del codificador

Al girar un clic, por ejemplo, hacia la derecha, el contacto A + C se cierra primero, luego B + C. Cuando el eje gira con este clic, los contactos se abren en la misma secuencia. Cuando el eje se gira en la otra dirección, la secuencia de cierre con el contacto C cambia, es decir al girar a la izquierda, primero B + C se cierra, luego A + C.

Usando el codificador en proyectos de microcontroladores, quizás usando el mismo codificador, implemente varios tipos diferentes de entrada de datos, sin embargo, esto requiere cierta retroalimentación y visualización para que el usuario sepa qué información está ingresando y en qué posición está el codificador.


Diagrama esquemático: conexión de un codificador a un microcontrolador PIC (haga clic para ampliar)

Los pines A y B del codificador están conectados a los puertos del microcontrolador RB4 y RB5, el pin C del codificador está conectado a tierra. Vale la pena señalar que las resistencias pull-up deben conectarse a las líneas de señal de los pines A y B. El codificador no se conecta accidentalmente a las líneas de E / S especificadas del microcontrolador: en primer lugar, el puerto B tiene resistencias pull-up incorporadas y no tenemos que conectar las externas, y en segundo lugar, el puerto B del microcontrolador tiene una muy función útil - "interrupción-cambio" - interrupción en el cambio de nivel, que nos permitirá controlar el estado del codificador.

Se utilizan 16 LED convencionales de 3 mm para visualizar los datos de entrada y se ubicarán en la PCB alrededor del codificador instalado. Los LED están conectados al chip A6276.

El microcircuito es un controlador LED con entrada de información en serie de 16 bits. El controlador contiene un registro de desplazamiento CMOS de 16 bits, pestillos y controladores asociados para controlar los LED, y puede activar más LED de los que permite el microcontrolador. Además, el controlador se puede controlar a través de la interfaz SPI, lo que reduce aún más el número de líneas de E / S utilizadas y hace que el proyecto sea escalable.

El software del microcontrolador para resolver nuestro problema es relativamente simple. Hay 3 modos de funcionamiento (entrada de información) y retroalimentación:

  • Modo de posicionamiento de 360 ​​°: en este modo, los LED indican la "posición" actual del codificador, el usuario puede girar el eje del codificador hacia la izquierda y hacia la derecha en cualquier ángulo;
  • Modo "Volumen / Nivel": en este modo, los LED indican el valor actual entre los niveles mínimo y máximo del rango de entrada (como el nivel de volumen en los dispositivos de audio);
  • Modo de alternancia giratoria de 3 posiciones: en este modo, solo hay tres posiciones seleccionables que el usuario selecciona girando el eje del codificador hacia la izquierda o hacia la derecha.

Demostración del proyecto