Controlando un Servo con un TLC5940 (calculando la configuración de PWM)

1

Estoy tratando de controlar unos pocos servos y un montón de RGB-LED desde una placa arduino. Para ello voy a encadenar unos cuantos 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: enlace dice que el servo se ejecuta en "+ Pulse Width Control 1500usec Neutral" con 600us el pulso es de -90 y el pulso de 2400us es +90.

Para averiguar cómo generar pulsos tan largos con mi controlador PWM, necesito saber la frecuencia con la que se ejecuta el controlador. La hoja de datos del controlador: enlace dice esto sobre la operación de PWM en la parte inferior de la página 19 :

  

El ciclo PWM en escala de grises comienza con el borde descendente de BLANK. El primer pulso GSCLK después de que BLANK se pone bajo aumenta el contador de escala de grises en uno y enciende todos los valores de OUTn con escala de grises no 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. Todos los valores de OUTn con escala de grises iguales a los valores del contador se desactivan. Una señal EN BLANCO = H después de 4096 pulsos GSCLK restablece el contador de escala de grises a cero y completa el ciclo PWM en escala de grises (consulte la Figura 21). Cuando el contador alcanza una cuenta de FFFh, el contador deja de contar y todas las salidas se apagan. Si se pone en BLANCO alto antes de que el contador alcance FFFh, el contador vuelve a cero inmediatamente.

Lamentablemente no tengo 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.

¿Puede alguien 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 pone dentro de un par de grados, debería estar lo suficientemente cerca. ¿Funcionará esto en absoluto? Mi comprensión de cómo funciona el servo es que generalmente necesitan un pulso cada 20 ms, así que incluso si calculo cómo generar la duración correcta del pulso, dudo que mágicamente funcione a un pulso cada 20 ms. ¿Aceptará el servo la entrada?

    
pregunta William

2 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 (valores 4096): puede usar el TLC5940 usando 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 este último.

Suponiendo una intensidad de 12 bits, aquí es cómo funcionan GSCLK y BLANK : TLC5940 no tiene su propio reloj. Por lo tanto, GSCLK se usa 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 una ventaja positiva en GSCLK , se incrementa un contador interno en TLC5940. Cada LED cuyo valor de intensidad es menor que el contador se apaga. Por lo tanto, los LED con intensidad 1 se apagan después del primer ciclo, los LED con intensidad 2 se 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 restablece solo, sino que espera una ventaja positiva en BLANK para restablecerlo, y después de esto, el ciclo comienza de nuevo.

Esto es lo que esto significa para manejar el TLC5940: necesita dos salidas PWM; uno para GSCLK y otro para BLANK , y el de BLANK debe suceder cada 4096 ciclos de GSCLK . Ahora note que estamos hablando de frequncy aquí, y no del ciclo de trabajo, mientras que es ciclo de trabajo lo que analogWrite() controla. Para conducir el TLC5940, puede usar una una biblioteca escrita para manejar el TLC5490, o puede hacer el manejo de menor nivel del TLC5940 usted mismo, que puede utilizar uno de los siguientes enfoques (suponiendo que está utilizando un Arduino basado en ATmega y en una escala de dificultad creciente):

  • Programe los dos temporizadores usted mismo de manera que utilicen precalificadores diferentes, de manera que la línea BLANK se conduzca a 1 / 4096º la frecuencia del GSCLK
  • Programe el fusible CKOUT en el ATmega, haciendo que emita la señal del reloj en uno de sus pines de salida. Use esto para GSCLK . Luego use un temporizador para generar un pulso BLANK a 1/4096 de la frecuencia de reloj.
  • Registre el ATmega externamente y use el mismo reloj para GSCLK . Haga que un temporizador ATmega genere el pulso BLANK a 1/4096 de la frecuencia de reloj.

Ahora a la pregunta de la relación de frecuencia entre el reloj TLC5940 y el PWM. La línea BLANK tendrá un ciclo de trabajo de 1/4096 (o cualquiera que sea el valor de intensidad máxima que esté utilizando), por lo que probablemente no funcionará para sus servos. El GSCLK suele ser un ciclo de trabajo de 50/50, pero no es necesario. Asumamos que desea que sus LED parezcan constantes, y tomemos el parpadeo parpadeo para que sea 50Hz. Esto significaría que necesita que su intensidad 1 LED parpadee a 50Hz o más, lo que significa que un ciclo largo de 4096 relojes debería completarse en 20 milisegundos, lo que significa que su reloj GSCLK debería ser de al menos 204kHz. A 204 kHz, los pulsos del reloj son de aproximadamente 5 uS. Entonces, 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, puede controlar sus servos y marcar el TLC5940 . Sin embargo, si usa intensidades de 12 bits, entonces el reloj de escala de grises que necesita el TLC5940 será demasiado rápido para los servos.

Pero, si los valores de intensidad 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 ninguna ley que diga que su pulso BLANK debe ocurrir cada 4096% de relojes GSCLK . Si ocurre cada 256 relojes, tienes una intensidad de 8 bits. Por lo tanto, 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 utilizar cualquier otro número de bits de intensidad, siempre que sea 12 o menos, de la misma manera. Si está utilizando valores de intensidad 256 (= escala de grises), entonces su reloj mínimo es 12.8 kHz 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 +90 es un ciclo de trabajo de 90/10, entonces calculamos que la duración del ciclo del reloj es de 2,6 ms, lo que se traduce en un reloj de 375Hz. En este momento, el valor de intensidad máxima que no producirá parpadeo es de 8 valores (3 bits) a 50Hz de persistencia y 16 valores (4 bits) de 25Hz. Puede decidir si eso es lo suficientemente bueno para sus propósitos.

    
respondido por el angelatlarge
1

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.

    
respondido por el starblue

Lea otras preguntas en las etiquetas