Robot Zero 2012. Driver de motores.

Este año al parecer vamos a seguir con los robots velocistas…, o almenos es la actividad que quiere seguir realizando el 99% de los asistenes a los viernes… Así que habrá que ir pensando en preparar alguna versión nueva de velocista para el próximo Cosmobot.

Queriendo utilizar encoders para la nueva versión y estando al límite del DC-DC en la versión de robot del pasado Cosmobot, estamos pensando en rediseñar la electrónica y hacerla a medida, ya que la Baby Orangutan se queda un poco pequeña para las nuevas ideas que queremos implementar.

Evidentemente los costes de desarrollo en este tipo de proyectos electrónicos suelen ser enormes, por lo que voy a intentar diseñar mis aportes a la nueva versión con las cosas que encuentre por casa. Ya que si se empieza a hacer pedidos de componentes y de piezas para probar.. mejor no sumar..

Uno de los componentes principales de los robots velocistas es el driver de los motores, éste puede ser tan simple como un transistor que encienda y apague el motor o un puente en H que compremos para controlar el motor en ambos sentidos. En los robots velocistas los motores siempre giran en el mismo sentido, es decir no se suele invertir el giro de las ruedas (o almenos así lo hemos estado haciendo en los robots hasta ahora con buenos resultados), por lo que llevar un puente en H para el control del motor no es necesario para la mayoría de los robots, medio puente puede ser más que suficiente. 

A continuación un pequeño resumen de lo que es un motor visto desde fuera y el diseño de un driver con las cosas que he encontrado por aquí.

Cuando tenemos un motor y queremos ver como funciona dentro de un circuito, lo primero es mirar a su modelo equivalente.

El modelo equivalente de un motor es una resistencia, una bobina y una fuente de alimentación en serie. Para conocer los valores de la bobina y la resistencia podemos mirar la hoja de características del motor, si no la tenemos  como suele ser lo normal se pueden medir. La fuente de alimentación que aparece en la imagen se corresponde con la fuerza cotraelectromotriz que se genera cuando gira el motor, su valor es función de la velocidad, cuanto mayor sea la velocidad del motor mayor es su fuerza contra electromotriz y por tanto menor la intensidad que este consume y par que genera.

El circuito más sencillo para controlar un motor desde la pata de un microcontrolador es el siguiente:

Para el control del motor desde un microcontrolador lo único que necesitamos es un transistor y un diodo. Si usamos un transistor de canal N o un NPN, cuando pongamos un 1 lógico en su puerta/base el transistor conduce, comportandose en el caso del mosfet como una resistencia de un valor muy pequeño, por lo que la corriente pasa a través del motor haciendo que éste comience a girar en un sentido.

Junto a la puerta del Mosfet es de buena práctica poner una resistencia a tierra, de esta forma el transistor está apagado si se pierde la conexión a puerta del pin del microcontrolador (o se configura éste por error como entrada). Si no ponemos a tierra la puerta mediante una resistencia y se deja la puerta al aire, el transistor puede estar apagado o encendido, y por tanto activando y desactivando el motor.

Si el motor está girando y queremos apagarlo ponemos un cero en la puerta del transistor, cuando el transistor pasa de ON a OFF y quiere apagar el motor a lo primero que tenemos que mirar es a la bobina que hay en el motor.

La bobina almacena energía en forma de campo electromagnético cuando por ella pasa una intensidad, es igual que un condensador que almacena energía en forma de campo electrostático cuando le somentemos a una diferencia de potencial entre sus bornes.

Al igual que el condensador se opone a los cambios de tensión, la bobina se opone a los cambios de intensidad, y si por una bobina está pasando una intensidad y de repente la cortamos (apagamos el transistor), la bobina intenta que esa intensidad se mantenga (la energía almacenada no puede desaparecer de manera instantanea). Para que la intensidad se mantenga la bobina crea una diferencia de potencial entre sus bornes, se puede ver como una fuente de tensión donde su valor de tensión es L(dI/dt). Es decir cuando cerramos el transistor podemos pensar en la bobina como una fuente de tensión de un valor muy alto, lo que hace que aparezca un valor de tensión muy alto en el drenador del transistor, si no le ponemos solución destruirá el transistor.

Para evitar que el transistor se rompa y pueda seguir circulando la intesidad por la bobina se pone un diodo en antiparalelo con el motor, este diodo mantiene el drenador del transistor a un valor de Vcc + 0.3V (caída en el diodo). Cuando apagamos el transistor y aumenta la tensión en el drenador debido a la bobina del motor el diodo empieza a conducir, y a través de él pasa la intensidad de la bobina del motor cerrando el circuito como se ve en la imagen. Lo más indicado es usar un diodo de tipo Schottky cuya caída de tensión es baja, al igual que su tiempo de recuperación.

Este sería el circuito más simple para controlar un motor, además de encenderlo y apagarlo podemos controlar su velocidad, para ello lo que hacemos es encender y apagar muy rápido el transistor, es decir metemos una señal cuadra en su puerta desde el microcontrolador.

Montamos el circuito y metemos una señal cuadrada en la puerta del transistor (señal amarilla) y en el drenador del transistor (borne negativo del motor) conectamos el otro canal del osciloscopio (señal azul). Ponemos el motor sin carga en su eje, es decir su velocidad va a ser máxima al no tener carga por lo que su fuerza contra electromotriz va a ser también alta, y por tanto la intensidad que pasa por el motor y su par son mínimos.

Cuanto mayor sea el tiempo en que la señal amarilla está a uno (mosfet conduce)  mayor es la velocidad del motor, se puede ver como cuando la señal cuadrada en la puerta (señal amarilla) está a uno activa el transistor y la caída de tensión en su drenador es prácticamente cero.

Cuando la señal amarilla pasa a cero y el transistor se apaga se puede ver como aumenta la tensión en el drenador, ésto es debido al efecto de la bobina, icrementando la tensión en el drenador y provocando que el diodo empiece a conducir, poniendo el drenador del transistor a Vcc + 0.3V (caída del diodo). El motor estaba sin carga por lo que por la bobina pasaba muy poca intensidad y por tanto se puede ver como la bobina no tenía energía suficiente para mantener la intensidad y encendido el diodo lo que queda de periodo de la señal.

Si ahora ponemos un dedo en la rueda del motor para que el motor disminuya la velocidad, reduzca su fueza contra electromotriz y por tanto aumente el par y la intensidad que pasa por él, se puede observar como la energía almacenada en la bobina es mayor (está pasando más intensidad a través de él) y ahora si es capaz de mantener encendido el diodo durante todo lo que queda de periodo, manteniendo el drenador a la tensión del motor más la caída de tensión del diodo polarizado en directa.

Cuanto mayor sea la frecuencia de la señal amarilla más uniforme sera la intensidad que atraviesa el motor y par que éste suministra, pero también según la aumentemos el motor puede entrar en pérdidas. El motor de Pololu lo hemos usado con buenos resultados a una frecuencia de PWM de 9.8 KHz.

Este es el circuito más sencillo para controlar un motor, podemos encenderlo, apagarlo y controlar su velocidad. Es equivalente a tener un coche con el pedal de acelerador, pero sin el pedal del freno.. y no tener frenos en un coche/velocista puede ser un problema.

Para darle la capacidad de frenar el motor al velocista he hecho y probado con unos mosfets que he encontrado olvidados en un cajón el siguiente circuito:

Es el circuito anterior pero ahora se ha añadido un segundo mosfet de canal P en paralelo con el motor que se va a encargar de frenarlo. Cuando todos los transistores están apagados el motor está libre, si encendemos el mosfet de debajo y apagamos el de arriba el motor se comporta como en el circuito anterior, y si apagamos el mosfet de canal N y encendemos el de canal P frenamos el motor si éste está girando. Debemos evitar encender todos los transistores a la vez ya que los quemaremos.

Si apagamos el mosfet de debajo desconectamos el motor de la fuente de alimentación, si hay un par inverso, es decir una inercia o fuerza aplicada al eje que lo hace girar el motor se comporta como  un generador debido a la fuerza contra electromotriz (la fuente de alimentación del circuito equivalente).

Si queremos frenar el motor debemos conectar una carga entre sus bornes que permita a la intensidad circular en sentido inverso al anterior, esto lo hacemos activando el mosfet de canal P como se ve en la imagen, cierra el circuito permitiendo a la intensidad  circular en sentido inverso al anterior  y por tanto frenando el motor. 

Los dos mosfets no pueden estar activos al mismo tiempo, por lo que hay que tener en cuenta los tiempos de encendido y apagado de los transistores. En estos circuitos se suelen usar drivers de mosfets para aumentar la tensión Vgs (lo que reduce la resistencia del transistor) y cargar más rápido sus capacitancias de puerta, lo que supone menores tiempos de conmutación. No tenía ningún por aquí para probar.

Como no pueden estar activos al mismo tiempo los transistores no podemos usar el “fast pwm mode” de los módulos pwm de muchos micros, ya que este modo no da nunca un 0% o un 100% de ciclo de trabajo de pwm limpio. Hay que usar otros modos de estos módulos como el “phase correct pwm mode” con el que si podemos tener la señal a uno o a cero por completo todo el tiempo.

Con esta idea he montado el circuito con un SI4562DY que trae un mosfet de canal P y otro de canal N en un mismo integrado, un diodo schotkky, un transistor npn y unas cuantas resistencias. Esquema y fotolito (las letras colocadas para insolar se deben leer al revés), el fotolito es para motores de pololu de poca intensidad, para más intensidad en el datasheet indican dejar más cobre en las patas de salida.

Imagenes del montaje:

Adjunto un par de videos del funcionamiento del circuito, el primero donde se puede ver el efecto de aplicar el freno y el segundo donde se controla la velocidad del motor.

En la tercera, cuarta y quinta vez se aplica el pin de frenar.

El ciclo de trabajo mínimo que puedo generar en esta prueba es 4% y es suficiente para que el motor comience a andar.

Este circuito es una alternativa a los puentes en H, la principal ventaja es que podemos situar un condensador cerca de cada motor, en el puente en H (doble) sólo se puede poner uno cerca del punte, con un poco de suerte a lo mejor llega para usar el dc-dc de Pololu, que en la versión del robot anterior al 80% de velocidad decía basta ante los picos de los motores.

El control del motor se puede hacer de dos formas:

  • Aplicar una señal PWM en el transistor N y dejar el P siempre apagado.
  • Aplicar una señal PWM en el transistor N y la inversa en el P, dejando un tiempo entre los flancos de subida y bajada para no cortocitcuitar.

Cada método de control tiene sus ventajas y desventajas y supongo que los probaremos los dos.

Visitas :16846
Both comments and pings are currently closed.

9 Responses to “Robot Zero 2012. Driver de motores.”

  1. Gremio says:

    Excelente articulo!

  2. JM says:

    Gracias

  3. salvachuan says:

    Muy buena entrada, una explicación genial
    Gracias por compartir

  4. Oscar says:

    Muy curioso cómo has logrado el frenado del motor. ¿Es el equivalente de poner los dos polos del motor a alimentación?. Si no quieres tener la rueda del motor libre ¿Se podría usar un inversor para usar un sólo pin? inversor

  5. JM says:

    Es equivalente a unir los polos, el mosfet de canal P los une cuando se enciende y proporciona un camino para que pueda pasar la intensidad en sentido inverso generada por la f.c.e.m. Esta intensidad hace girar al motor en sentido inverso al sentido que genera la f.c.e.m. por lo que intenta frenarlo.

    En principio no puedes poner la NOT directamente sin electrónica adicional que retrase el encendido de los Mosfets o retarde el paso de intensidad durante un tiempo si se cortocircuitan (debido a sus tiempos de encendido y apagado). O tienes un micro que te permite la opción de meter un tiempo muerto entre los flancos de bajada y subida en su módulo pwm.

    Sólo vas a frenar cuando el PWM sea cero, ya que cuando no lo sea la corriente en el motor va a tener sólo un sentido debido a la bobina, cuando sea cero y ésta se descargue comienzas a frenar con el P activado y el N ya apagado.

    Lo que quiero probar, primero es si aguanta el dc-dc de pololu con un condensador grande en cada motor, después frenar contra dejar la rueda libre para evitar deslizar en la curvas, y por último la idea sería hacer una especie de ABS frenar–liberar–frenar–liberar así a una frecuencia de 20-30 Hz a ver si se nota algo el efecto, pero de momento lo principal es probar el dc-dc de Pololu que he probado y montado otros dc-dc (pidiendo samples..) pero sin buen resultado, ya que los ic que hay suelen ser insoldables en casa.

    A ver si este fin de semana me da tiempo a montar una placa con micro y los drivers para probar.

    Cualquier cosa la seguimos discutiendo en el foro que es más cómodo que escribir y leer aquí.

  6. […] Here’s a nice little circuit that will drive a motor and allow you to stop its rotation, giving your robot a set of brakes. It’s part of [JM's] post about the in’s and out’s of building microcontroller friendly motor controllers (translated). […]

  7. iddar says:

    Hola, antes que todo felicitarte por tu trabajo el cual sigo desde hace tiempo.
    Te escribo para solicitarte permiso de utilizar tu circuito para uno de los tutoriales de eagle PCB que estoy realizando. De antemano gracias por toda la información que compartes con la comunidad.

    • C.I.r.E. says:

      Hola,

      no hace falta pedir permiso para usar para lo que sea cualquier circuito, código o esquema del blog, ya que lo subimos por si a alguien le puede servir.

      Esto son cosas que hacemos y que nos han funcionado y por tanto documentamos, pero ver que funciona de la manera correcta siempre queda bajo la responsabilidad del usuario final que lo utiliza, aquí sólo vamos poniendo nuestros avances a nivel de aficionados.

      Gracias por el comentario.

      Saludos.

Subscribe to RSS Feed Follow me on Twitter!