Controlar un servo con un TLC5940 (calcular la configuración de PWM)

Estoy tratando de controlar algunos servos y un montón de LED RGB desde una placa arduino. Para hacer eso, voy a encadenar algunos chips TLC5940. El problema que estoy tratando de resolver en este momento es qué configuración de PWM necesito para los servos; en particular, ¿cuáles son los ajustes de rotación mínima y rotación máxima?

Mi servo es un: HiTech HS-55. Este sitio: http://www.servocity.com/html/hs-55_sub-micro.html dice que el servo funciona con "+Pulse Width Control 1500usec Neutral" con un pulso de 600us siendo -90 y un pulso de 2400us siendo +90.

Para averiguar cómo generar pulsos tan largos con mi controlador PWM, necesito saber la frecuencia en la que se ejecuta el controlador. La hoja de datos del controlador: http://www.ti.com/lit/ds/symlink/tlc5940.pdf dice esto sobre la operación PWM en la parte inferior de la página 19:

El ciclo PWM en escala de grises comienza con el flanco descendente de BLANCO. El primer pulso GSCLK después de BLANK baja aumenta el contador de escala de grises en uno y enciende todas las SALIDAS con un valor de escala de grises distinto de cero. Cada siguiente flanco ascendente de GSCLK aumenta el contador de escala de grises en uno. El TLC5940 compara el valor de escala de grises de cada salida OUTn con el valor del contador de escala de grises. Todas las OUTn con valores de escala de grises iguales a los valores del contador se apagan. Una señal BLANK=H después de 4096 pulsos GSCLK restablece el contador de escala de grises a cero y completa el ciclo PWM de escala de grises (consulte la Figura 21). Cuando el contador llega a un conteo de FFFh, el contador deja de contar y todas las salidas se apagan. Poner BLANK alto antes de que el contador llegue a FFFh reinicia inmediatamente el contador a cero.

Lamentablemente no tengo ni idea de lo que eso significa. (Creo) Sé que el controlador PWM recibe algún tipo de señal de reloj de arduino, pero desafortunadamente no me ayuda a resolverlo.

¿Alguien puede ayudarme a averiguar qué configuraciones necesito usar en el controlador PWM para generar los pulsos deseados? El valor más cercano funcionará. Para mi aplicación, si el servo se acerca un par de grados, debería estar lo suficientemente cerca. ¿Esto funcionará en absoluto? Mi comprensión de cómo funciona el servo es que generalmente necesitan un pulso cada 20 ms, por lo que incluso si calculo cómo generar la duración correcta del pulso, dudo que funcione mágicamente en un pulso cada 20 ms. ¿El servo aceptará la entrada?

Me puedes aclarar un poco la relacion entre el TLC5490 y los servos, si hay alguna...
No hay relación. Solo necesito poder controlar una gran cantidad de LED y Servo desde una placa Arduino Uno.

Respuestas (2)

Para responder al lado TLC5940 de la pregunta:

En primer lugar, tenga en cuenta que al usar TLC5940 su intensidad no necesita ser valores de 12 bits (4096 valores): puede usar el TLC5940 con intensidades de cualquier valor de 12 bits o menos. Por ejemplo, las intensidades de 8 bits (256 valores) proporcionan un resultado muy satisfactorio. Más sobre esto último.

Asumiendo intensidades de 12 bits, así es como GSCLKfunciona BLANK: TLC5940 no tiene su propio reloj. Por lo tanto GSCLK, se utiliza para averiguar cuándo encender y apagar cada LED. Al comienzo de un ciclo, todos los LED están encendidos. Cada vez que se recibe un flanco positivo, GSCLKse incrementa un contador interno en TLC5940. Cada LED cuyo valor de intensidad es inferior al contador se apaga. Entonces, los LED con intensidad 1se apagan después del primer ciclo, los LED con intensidad 2se apagan después del segundo ciclo y los LED con intensidad 4096 no se apagan en absoluto. Al final del ciclo, el chip no se reinicia solo, sino que espera un borde positivo BLANKpara reiniciarlo, y después de esto, el ciclo comienza nuevamente.

Esto es lo que esto significa para controlar el TLC5940: necesita dos salidas PWM; uno para GSCLKy otro para BLANK, y el uno para BLANKdebe suceder cada 4096 ciclos de GSCLK. Ahora observe que aquí estamos hablando de la frecuencia , y no del ciclo de trabajo, mientras que es el ciclo de trabajo el que analogWrite()controla. Para manejar el TLC5940, puede usar una biblioteca escrita para manejar el TLC5490, o puede hacer la conducción de nivel inferior del TLC5940 usted mismo, que puede usar uno de los siguientes enfoques (asumiendo que está usando un Arduino basado en ATmega, y en escala de dificultad creciente):

  • Programe los dos temporizadores usted mismo de modo que usen diferentes preescaladores de modo que la BLANKlínea se maneje a 1/4096 de la frecuencia delGSCLK
  • Programa el CKOUTfusible en el ATmega, haciendo que emita la señal del reloj en uno de sus pines de salida. Usa esto para GSCLK. Luego use un temporizador para generar un BLANKpulso a 1/4096 de la frecuencia del reloj.
  • Reloj el ATmega externamente y use el mismo reloj para GSCLK. Haga que un temporizador ATmega genere el BLANKpulso a 1/4096 de la frecuencia del reloj.

Ahora a la cuestión de la relación de frecuencia entre el reloj TLC5940 y el PWM. La BLANKlínea tendrá un ciclo de trabajo de 1/4096 (o cualquiera que sea el valor máximo de intensidad que esté usando), por lo que probablemente no funcionará para sus servos. El GSCLKciclo de trabajo suele ser 50/50, pero no es necesario. Supongamos que desea que sus LED parezcan estables y tomemos el parpadeo de 50 Hz. Esto significaría que necesita que su 1LED de intensidad parpadee a 50 Hz o más, lo que significa que un ciclo largo de 4096 relojes debería completarse en 20 milisegundos, lo que significa que suGSCLKel reloj debe ser de al menos 204kHz. A 204 kHz, los pulsos de reloj tienen una duración de aproximadamente 5 uS. Entonces, aunque en teoría podría usar el mismo reloj para sus servos y el TLC5940 (creo que eso es lo que está preguntando): si mantiene la frecuencia del reloj (a 204 kHz) y cambia el ciclo de trabajo, podría controlar sus servos y cronometrar el TLC5940 . Sin embargo, si usa intensidades de 12 bits, entonces el reloj en escala de grises que necesita el TLC5940 será demasiado rápido para los servos.


Pero, si los valores de intensidad de 4096 son demasiado para manejar, considere usar valores de intensidad de 8 bits. Aún tendrá que enviarlos como valores de 12 bits (eso es lo que espera la interfaz TLC5940), sin embargo, no hay una ley que diga que su BLANKpulso debe ocurrir cada 4096GSCLKrelojes Si ocurre cada 256 relojes, tienes una intensidad de 8 bits. Entonces, sus intensidades de 8 bits deben enviarse como valores válidos de 12 bits (con los cuatro bits altos siendo cero), y reiniciará el ciclo de reloj cada 256 relojes. Puede usar cualquier otro número de bits de intensidad, siempre que sea 12 o menos, de la misma manera. Si está utilizando 256 valores de intensidad (=escala de grises), entonces su reloj mínimo es 12.8kHz y la duración del reloj es 78uS. Más cerca del pulso 2400uS +90, pero todavía bastante lejos. Si asumimos que el pulso de +90 es un ciclo de trabajo de 90/10, calculamos que la duración del ciclo del reloj es de 2,6 mS, lo que se traduce en un reloj de 375 Hz. En este cronometraje, el valor máximo de intensidad que no generará parpadeo es de 8 valores (3 bits) a 50 Hz de persistencia en el tiempo límite y 16 valores (4 bits) a 25 Hz.

Wow, esta es una respuesta impresionante. Creo que hay toda la información que todos necesitan aquí para averiguar si puedo hacer que haga lo que quiero, pero voy a tener que leerlo varias veces para entenderlo. ¡Gracias por la ayuda!
Estaba mirando la biblioteca TLC para Arduino y en realidad tiene un método para controlar los servos desde la biblioteca. Así que parece que todo este trabajo se ha hecho por mí (con suerte). Gracias de nuevo.

Tiene una entrada de reloj en escala de grises (se recomienda 30 MHz, consulte la página 3) y cuenta hasta 4096 valores.

Para su servo que es demasiado rápido (la duración del ciclo es ~ 140 µs), por lo que necesita usar un reloj más lento. Luego puede calcular el tiempo de la señal del servo en términos de sus ciclos de reloj.