jueves, 30 de mayo de 2013

PWM síncrono | Synchronous PWM

Ya sabemos cómo controlar la velocidad y el sentido de la marcha de un tren con Arduino, ahora vamos a ver cómo aplicarlo a una maqueta analógica. El principal problema que se nos presenta es el de las transiciones entre cantones de vía alimentados con diferentes fuentes PWM. No voy a extenderme explicándolo ya que hay dos blogs que lo hacen estupendamente, mejor de lo que yo lo haría.

El primero es “AGP SchwarzWaldBahn 220” de A. G. Pino, dónde plantea el problema que ocurre cuando un tren toma la corriente de dos tramos de vía alimentados cada uno por una fuente PWM diferente:

El segundo es “Mi Maqueta Marklin Z”de Ignacio de la Fuente, donde explica una posible solución al problema planteado:
    PWM (y III): Solución bidireccional.
    Cab Control: Varios reguladores que pueden asignarse a cualquier cantón aislado del circuito.

Bueno, pues yo propongo otra solución. Una solución que sólo funciona en teoría pero no en la práctica ya que el ancho de los pulsos PWM dependerá de la tolerancia de los componentes utilizados.

Mi idea es la de sincronizar un número n de generadores PWM alineados a la izquierda. ¿Y cómo se consigue esto? Pues muy sencillo, con una señal de reloj y n generadores de un único pulso de una duración menor o igual que la frecuencia de dicho reloj. Veamos la siguiente imagen:
We know how to control the speed and direction of a train with Arduino, now let's see how to apply it to an analog layout. The main issue we have to overcome are transitions between isolated blocks of track using different PWM sources. I will not dwell explaining it as there are two blogs that do this great, better than I would do (Sorry, these blogs are only in spanish)

The first is “AGP Schwarzwaldbahn 220” by A. G. Pino, where the problem happens when a train is powered from two different sections of track, each with a different PWM source:

The second one is “Mi Maqueta Marklin Z” by Ignacio de la Fuente, explaining a possible solution to the problem:

Well, I propose another solution. A solution which works only in theory but not in practice since the PWM pulse widths depend on the tolerances of the components used.

My idea is to synchronize n left-aligned PWM sources. And how is this achieved? Very simple, with a clock signal and n single pulse sources with a pulse duration less or equal than clock frequency.
Consider the following image:


Teoría de PWM síncrono
Synchronous PWM theory

Cada una de las fuentes de pulso genera un único pulso cada vez que el reloj pasa de estado alto a bajo. Si el reloj es constante, se generarán pulsos constantes. Para construir estos circuitos se emplea el circuito integrado 555 en configuración monoestable y para el reloj una salida PWM de Arduino con un valor de entre 240 y 250 (sobre 255). Para evitar disparos erróneos se coloca al final del reloj una resistencia pullup de 10K.
Each of the pulse sources produces a single pulse each time clock goes from high to low. If clock is constant, constant pulses are generated. To make these circuits we have to use 555 ic in monostable configuration and an Arduino PWM output for generating clock, with a PWM value of between 240 and 250 (about 255). To prevent erroneous triggering, a 10K pullup resistor must be placed at the end of the clock line.

555 monoestable
Monostable 555
La frecuencia que he elegido para el reloj es de 62500Hz, o lo que es lo mismo un pulso cada 16us. En Arduino UNO, por ejemplo, esta frecuencia sólo se puede conseguir con los pins 5 y 6 que son los que están conectados al TIMER0.

Para calcular los valores de los componentes en configuración monoestable se utiliza la siguiente función:
I've chosen 62500Hz as clock frequency, or a pulse every 16us. In Arduino UNO, for example, this frequency can only be achieved using pins 5 and 6, which are currently connected to TIMER0.

Use the following function in order to calculate the values for the components in monostable configuration:
    T = 1.1 * R * C
Dónde los valores son en unidades:
    T en segundos. R en ohmios. C en faradios.
Where the values are in units:
    T in seconds. R in ohms. C in farads.
Para obtener 16us usando un potenciómetro de 10K tenemos que:
To obtain a 16us pulse using a 10K potentiometer we have:
    16us = 1.1 * 10K * C C = 16us / (1.1 * 10K) C = 1.45e-9 C ~ 1500pF
Resolviendo T con C = 1500pF:
Solving T with C = 1500pF:
    T = 1.1 * 10K * 1500pF T = 0.0000165s T = 16.5us
Obtenemos un tiempo superior al del reloj, por lo tanto el valor máximo que usaremos en el potenciómetro será:
We get a time higher than the clock time, therefore the maximum value that we will use in the pot will be:
    R = T / (1.1 * C) R = 16us / (1.1 * 1500pF) R ~ 9K70
A partir del 97% del potenciómetro tendremos una señal PWM del 100%.

Para la primera prueba he utilizado 3 circuitos monoestables con resistencias fijas de 4K7 para obtener aproximadamente la mitad del ciclo PWM en las tres salidas:
With a pot value upper than 97% we will have a 100% PWM signal.

For the first test I used three monostable circuit with 4K7 fixed resistors, to get about half of the PWM cycle at all three outputs:





Se puede observar como el inicio del pulso de las tres señales está perfectamente sincronizado, no ocurre lo mismo con el final, ya que ni las tres resistencias ni los tres condensadores son exactamente iguales entre sí. Las resistencias tienen una tolerancia de 5%, por lo tanto sus valores pueden variar entre 4465 y 4935 ohmios. Los condensadores que he utilizado también tienen una tolerancia del 5%, por lo tanto sus valores oscilan entre 1425 y 1757 picofaradios.

Para la segunda prueba he sustituido las resistencias fijas de 4K7 por un potenciómetro digital de 10K de Microchip, el MCP4131.
It can be seen that the pulse start of all three signals are perfectly synchronized, not so with the signal end, as neither the three resistors and three capacitors are exactly equal. The resistors have a tolerance of 5%, so their values may vary between 4465 and 4935 ohms. The capacitors I've used also have a tolerance of 5%, so their values range are between 1425 and 1757 pF.

For the second test I replaced the 4K7 fixed resistors by a digital 10K potentiometer from Microchip, the MCP4131.






Se puede apreciar una mayor diferencia en la salida ya que estos potenciómetros tienen una tolerancia del 20%.

Como ya he dicho antes, esta es una solución teórica, una solución que sólo funcionaría si los componentes tuviesen tolerancia 0%.

Para finalizar, me gustaría recomendar la lectura de los dos blogs a los que he hecho referencia al inicio de este artículo:

We can see a major difference at the outputs, as these potentiometers have a tolerance of 20%.

As I said before, this is a theoretical solution, a solution that would only work if all of the components had a tolerance of 0%.

Finally, I'd recommend reading the two blogs to which I referred at the beginning of this article:






Descargas:
Downloads:

TestFixRes.zip

TestMCP4131.zip





Enlaces:
Links:

Cantón ferroviario (ES): http://es.wikipedia.org/wiki/Cantón_ferroviario

Model RR blocks (EN): http://modeltrains.about.com/od/bmodelrailroadterms/g/block.htm

Circuito integrado 555 (ES): http://es.wikipedia.org/wiki/Circuito_integrado_555

555 integrated circuit (EN): http://en.wikipedia.org/wiki/555_IC

NE555 (EN): http://www.ti.com/lit/ds/symlink/ne555.pdf

MCP4131 (EN): http://ww1.microchip.com/downloads/en/DeviceDoc/22060b.pdf


AGP SchwarzWaldBahn 220 (ES): http://agp-schwarzwaldbahn.blogspot.com.es
Mi Maqueta Marklin Z (ES): http://mimaquetaz.blogspot.com.es




6 comentarios:

  1. Hola Raul

    Me ha dirigido a tu blog, mi amigo Angel, al que también mencionas en esta entrada, y me ha parecido muy interesante ¡Cómo no!, asi que me voy a hacer seguidor y voy a poner enlaces en mi blog.

    Veo que has buscado una excelente solución al tema de la sincronización de señales PWM. Algo asi había yo buscado, pero mis conocimientos de electrónica son semasiado cortos para haber llegado a una solución como esa.

    Al final, para mi maqueta, en la que hay ocho cantones, he ido a un sistema basado en el "Cab Control" controlado por el programa de ordenador que maneja toda la maqueta. Puedes ver una descripción en este enlace:

    https://sites.google.com/site/mimaquetaz/traccion

    Funciona "casi" bien. Es decir en algunos casos, sobre todo a marchas muy lentas se nota una levísima irregularidad en la marcha al pasar de un cantón a otro. Supongo que se debe a algo parecido a lo que comentas, es decir a las tolerancias de los componentes que pueden hacer que haya alguna diferencia en la corriente que alimenta la vía a uno y otro lado del corte.

    Un Saludo

    ResponderEliminar
    Respuestas
    1. Hola Ignacio, bienvenido a mi nuevo blog.

      Yo tampoco tengo muchos conocimientos de electrónica, sólo lo básico a nivel hobby. Soy programador, por eso casi siempre trato de solventar problemas electrónicos usando microcontroladores.

      La verdad, llegué a esta solución de casualidad, pensando en cómo se sincronizan las señales de todas las fuentes de video de un plató de TV, dónde todas las máquinas deben entregar un fotograma cada vez que reciben una señal de sincronía para que no se produzcan saltos de video en el mezclador. Así que pensé: este sistema puede utilizarse para sincronizar cualquier tipo de señal, por ejemplo PWM…

      Creo recordar que en tu maqueta la conmutación de señal PWM se hace antes de pasar por la etapa de potencia, ¿no?, ¿Has probado conmutar la señal después de la etapa? En teoría no debería afectar, pero es posible que haya alguna variación entre una etapa y otra, o incluso si el cable que lleva alimentación a un cantón es más largo que otro puede ser que ejerza más resistencia en la señal.

      Un saludo!

      Eliminar
    2. Hola otra vez.

      Asi que eres programador y por eso tratas de solucionar los problemas con microcontroladores....Pues yo tambien soy programador y por eso trato de resolver los problemas.. ¡por software!

      Lo que me dices de conmutar directamente la corriennte de alimentación no lo puedo hacer, sin rehacer por completo mi sistema. De todas formas es algo que no me preocupa. La irregularidad al pasar de un cantón a otro es insignificante. Hay que esar muy pendiente para notar algo. Desde luego, tal como está hecho está completamente garantizada la sincronización de los pulsos de PWM. Asi que como digo, si hay alguna diferencia, tiene que ser obligatoriamente por diferencias de tolerancia en los componentes de la etapa de potencia.

      No me deja apuntarme como Seguidor. Mira a ver si lo tienes abierto

      Un Saludo








      Eliminar
    3. Hola Ignacio,

      Con lo de resolver los problemas con microcontroladores me refería a resolverlos por software ya que el microcontrolador es un elemento electrónico que puede emular a cualquier integrado por medio de programación.

      Con respecto a tu maqueta, tienes razón, en los videos que he visto no he podido apreciar ningún salto, sólo sé que hay una iregularidad por que lo has comentado, así que yo no me preocuparía.

      He revisado el tema de los seguidores y está habilitado, hoy han habido seguidores nuevos. No sé dónde puede estar el fallo.

      Supongo que te lo dirán muchas veces, pero tengo muchas ganas de ver tu maqueta terminada (O casi, porque estas cosas nunca acaban ;) ) y ver circular varios trenes a la vez!

      Un saludo!

      Eliminar
    4. Hola otra vez.

      ....si, pero tu usas un microcontrolador. Lo que yo quería decirte es que yo ni eso (nunca he manejado ninguna clase de microcontrolador) asi que intento resolver todo por medio del software del programa de ordenador que controla la maqueta.

      En el último post de mi blog: "Mousecab" tienes un ejemplo clarísimo: Se trataba de interpretar la señal de un encoder incremental usado como mando de control de la velocidad de las locomotoras. Como no tengo ni idea de como hacerlo de otra forma, lo he resuelto por software, leyendo las transiciones de los datos generados e interpretando por programa el sentido de giro que representan.

      Seguro que tu habrías utilizado algún microcontrolador o algún otro elemento de hardware para interpretar esas señales y reconocer el sentido de giro del mando.

      Ya me he podido dar de alta. Ayer no solo no me funcionaba, sino que ni siquiera podía ver a los otros seguidores en el cuadro de seguidores.

      Respecto de mi maqueta, lo voy a dejar como está, porque en efecto no se nota prácticamente ningún salto (es más un cambio de sonido que otra cosa) Te lo comenté simplemente a propósito de tu artículo en el que te referías a la influencia que las tolerancias de los componentes pueden tener sobre el comportamiento de dos elementos que deberían ser idénticos.

      Supongo que has visto el vídeo: http://youtu.be/RU61BPh8U7A

      Ahí puedes ver dos trenes funcionando simultáneamente. De momento no se pueden poner más de dos trenes, porque solo he puesto balizas en tres cantones. No quise liarme a poner balizas por todas partes, antes de estar bien seguro del funcionamiento del sistema, no fuese a ser que luego tuviese que modificar algo, en particular las distancias entre las balizas y los semáforos.

      Cuando tenga todas las balizas puestas y todo el sistema funcionando, podrás ver más trenes funcionando, y si quieres venir por casa, los verás en vivo y en directo.

      Un Saludo




      Eliminar
    5. ¡Muchas gracias por la invitación! La verdad es que me pilla un poco lejos, pero me encantaría ver la maqueta en vivo y en directo.

      Eliminar