Director de la Orquesta

En este documento se describe el primer controlador del sistema de control de la línea de fruta, el controlador que vamos a llamar {}, porque es el que marca la pauta, maneja la batuta para la orquesta de controladores de la línea. Sin Director hay caos.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Director

El encoder se monta sobre el eje delantero del calibrador, y emite pulsos al girar este eje. El número de pulsos en una rotación completa tiene que ser un múltiple integro del número de dientes en el sprocket de la cadena. Así, con el paso de cada fruto, o rodillo, el encoder genera un número integro de pulsos al {}. Estos pulsos vamos a llamar microPasos, o {μPasos}, a diferencia de los macroPasos. Pueden haber cuatro, cinco, diez microPasos por cada fruto, y habrá un macroPaso por cada fruto. Por ejemplo, si el sprocket tiene 45 dientes y el encoder genera 360 pulsos por revolución (ppm) entonces habrán ocho microPulsos por cada rodillo que pasa. Si el encoder emite un pulso por revolución (aquí indicado como {}), este puede utilizarse para asegurar que el {} no ha perdido sincronización. Si hay un desfasaje entre cadena y {} el sistema completo va a fallar. Este tema se va a volver a visitar mas adelante.

Trazas

El Director almacena el número de pulsos por rodillo; en el ejemplo anterior serían ocho. Entonces, por cada ocho pulsos, emite otro pulso, el macroPulso, o {} pulso, que corresponde al paso de un fruto. Los macroPulsos se envían al controlador de iluminación ({}, y el controlador de solenoides, {}. Los {μPulsos van solamente al {}.

Otra funcionalidad del {} es de generar un tren de pulsos aunque la cadena no está moviendo. El operador tiene que seleccionar la generación con un interruptor y la frecuencia con una perilla.

En la sección a continuación se describen dos aspectos de programación de estos controladores, el uso de interrupciones y temporizadores.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

El uso de interrupciones es una característica importante de sistemas de control basados en microcontroladores. Un ejemplo puede ilustrar que significa interrupciones. Un evento va a ocurrir, por ejemplo un amigo nos va a llamar por teléfono con un dato muy importante para la reunión en que estamos. Sabemos que va a llamar, pero no sabemos cuando. Entonces podemos tener el teléfono a mano, tal vez en silencio para no molestar a la gente, pero cada segundo tenemos que mirar el visor para ver si está llamando.

Otra forma es tener el teléfono guardado pero con el sonido en alto. Mientras esperamos la llamada podemos dedicar toda nuestra atención a la reunión cumbre. Cuando el amigo llama el teléfono va a decir “Entel está’quí’, y sabemos que tenemos una llamada entrante.

La primera versión se llama ‘polling’, mientras la segunda es ‘interrupción’. La señal que esperamos puede venir de un sensor externo, que no es tan frecuente, pero a lo que tenemos que responder de inmediato. Típicamente va a ser un voltaje que sube o baja, el flanco de la señal.

En nuestro {}, la señal va a venir del encoder. El eje puede estar girando rápido o lento, pero tenemos que responder de inmediato. El {} tiene que re-enviar el microPaso, y cada cierto número de pulsos también tiene que enviar un macroPaso. En el caso del {} con cada macroPaso tiene que gatillar un pulso a los LEDs. El {} recibe el macroPaso y captura la imagen. El {} recibe el microPaso y el macroPaso y tiene que coordinar la activación de los solenoides. Todo se hace con interrupciones.

En el programa del {} abajo, se ve que hay la declaración de una función que responde a cierta interrupción, por ejemplo:\

Esta es la declaración de la interrupción externa 0, y no hace mucho, solamente cambia el valor de una variable. En el programa se puede ver como esta interrupción es configurado. Antes de ver el programa, se toca el tema de los contadores / temporizadores que es otro aspecto característico de programación de los controladores.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Los temporizadores de los microcontroladores son contadores que van incrementándose con una frecuencia definida. Si sabes el valor en empieza el conteo, y lo puedes leer mas tarde, y si sabes con que frecuencia se va incrementando, puedes determinar el tiempo transcurrido. Hay muchos usos de los contadores / temporadizares; aquí vamos a ver solamente su uso para calcular la frecuencia de los microPasos.

Supongamos que queremos medir hasta 50 frutos por segundo, y que nuestro encoder genera cinco microPasos por cada rodillo. Sería el caso de un sprocket de 40 dientes y un encoder de 200ppm. Quiere decir que hay un frecuencia de 250 microPasos/segundo, 4ms/microPaso.

Vamos a utilizar el temporizador número uno del ATmega328, (Timer1) que es de 16 bits. Significa que el número máximo hasta que puede contar es 0xFFFF, 65353{10}. La alternativa es el contador cero, de ocho bits, que tiene un valor máximo de 255.

Tenemos que definir la frecuencia con que cuenta el Timer1. Aquí hay varias alternativas; se elige el escalonamiento para permitir la precisión y la duración de conteo que uno desea. Hay cinco alternativas:\

En nuestra aplicación, la frecuencia mas rápida es de 50 frutos/segundo que significa 250 microPasos/segundo y un período de 4ms entre microPasos. La precisión del pre-escalador 1024 es de 64μs que es suficiente para estimar esta frecuencia rápida. El tiempo máximo de conteo es de 4s, equivalente a un fruto cada 20s. Nuevamente el pre-escalador 1024 es suficiente para el extremo mas lento de los casos del ejemplo.

Para finalizar esta sección, se menciona que la selección del pre-escalador se realiza dando valores específicos a una registro en memoria. Los valores se encuentran en el manual del ATmega328p, documento que hay que tener a la mano cuando uno está programando un controlador. Para empezar viendo el programa, es muy importante conocer las conexiones que se va a realizar entre el controlador y los dispositivos en la línea. Y en este caso, ya que estamos trabajando con un Arduino disfrazado como un PLC, hay que tener mucho cuidado con la nomenclatura. Los puntos de conexión, los pins, tienen diferentes nombres en el Arduino, en el Controllino y en el ATmega328.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

The program for the {} was written in C language for the AVR ATmega328p microcontroller as used in several Arduino boards and the Controllino Mini PLC, also based on Arduino (). This hardware setup was selected since programming the Arduino is a relatively common capability; it is much easier to find Arduino programmers than to find PLC programmers. An alternative supplier for very similar PLC’s is Industrial Shields ().

Most of the program is configuration of port, interrupts and I/O. The main routine, starting near line 220, first calls the configuration routine, then reads the configuration parameters from static memory, and enters an infinite, never ending loop. Within this loop, the program checks to see if the reconfiguration button is pressed, then checks if the simulation button is pressed. If reconfiguration is requested, the parameters are reread. If the simulation is requested, the program reads a potentiometer to see how fast the pulse train should be, and then simulates an {} + {} cycle.

The main work is done in coordination with the external interrupt routines. Every time an encoder pulse is received by the {}, an external interrupt is generated. This external interrupt causes two actions: a {} pulse is emitted and an internal counter (nMicroStepsRemaining) is decremented. When this counter reaches zero, the {} emits a {} pulse, and resets the counter.

Note that reception of the TDC pulse will always reset the nMicroStepsRemaining variable to zero. When the system is shut down at the end of the day, the chain will stop at any arbitrary position. When the system is energized again, the chain will not be synchronized with the major pulses. After the first TDC pulse, this synchronization will be recovered.

One small, but very important point should be mentioned. The program shown below has no debouncing procedure. If the encoder is an old device with mechanical contacts, the pulses will be full of noise, and a program without debouncing will go crazy. Even if the encoder uses optical or magnetic technology to generate pulses, the production plant might have poor grounding, and every once in a while a nearby motor might introduce high voltages in the ground line that would cause spurious pulses. Input signal conditioning using an R-C filter followed by a Schmidt trigger buffer would help the electronics. Additionally, the software can include a delay in reacting to the change of the input signal, so that the signal must rise (or fall) and stay up (or down) for a short while before accepting the input. The definition of ‘short’ might be on the order of 10ms, but depends on how quickly the system must react.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%

En el código del programa {}, los primeros 76 líneas son comentarios. Después hay declaraciones e inclusiones de otros archivos de definiciones.

La línea que viene de fase B del encoder está conectado a la interrupción 0, mientras la linea que viene de Z está con interrupción 1. La línea del pulso A está conectado al pin PC3, puerto C, pin 3. Tienes dos salidas, Paso y microPaso, conectados a los pins PB0 y PB1, puerto B, pins 0, 1.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

A partir de línea 140 empieza el código. La primera función es una ISR, {}, correspondiente a la interrupción externa 0, el pulso B desde el encoder. El código verifica el estado de la línea A del encoder para determinar si la rotación es con reloj o contrareloj. Después incrementa el contador de micropasos. Si el valor de micropasos es mayor al número de micropasos definido para el sistema, entonces tiene que levanta el pin de salida para los macroPasos. Sino, levanta el pin de micropasos. Finalmente, asigna un valor al contador TCNT0 para el ancho de pulso, que determina cuando los pins de salida vuelven a cero.

A continuación está el ISR INT1, que es gatillado cuando la línea Z es activada. Este se utiliza solamente para verificación de la sincronización. Podría ser un poco mas robusto aquí, pero lo importante es decidir que hacer cuando hay un problema.

Finalmente, hay el ISR gatillado cuando el temporizador 0 sobrepasa el valor 255 (8 bits). Lo único que pasa aquí es que retorna los valores de los pins N_STEP y U_STEP a cero.

El ISR del temporizador 1 es utilizado en el modo de simulación, no de operación normal. Este temporizador determina la frecuencia del tren de pulsos que se emiten en modo de simulación, con la cadena detenido, sin señales del encoder.

El ISR de USART_RX es para la interrupción cuando un byte es recibo por el UART0. En este programa comunicaciones seriales son usadas solamente si uno quiere conectarse directamente al controlador y manejar el modo de simulación. Pero, podría ser interesante tener una conexión permanentamente, por ejemplo, para detección de fallas.

El último ISR es para la lectura del conversor A/D, que en este sistema no se utiliza. La idea original fue utilizar una perilla de potenciómetro para modificar la frecuencia del tren de pulsos en simulación. El programador se puso flojo, y no lo implementó.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

La siguiente función {}, es muy importante, y puede parecer jeroglíficos a quien no conoce la estructura de los ATmega. En esta función se asignan los valores iniciales a los puertos y registros de control del microcontrolador. Hay que conocer la arquitectura del controlador, y tener el manual a mano.

Primero, en lineas 284 - 294, se asignan el sentido de cada pin, entrada o salida. Cero es entrada, uno es salida. Entonces la DDRB (data direction, port B) es 0x03 ( == 0000 0011), que significa que pins 0 y 1 son salidas mientras 2 hasta 7 son entradas. Esto tiene que coincidir con las conexiones de cables, sino no va a funcionar nada.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \end{document}