Controlando un servo con Attiny85 OCR1B

0

Actualmente tengo un proyecto donde necesito controlar un servo usando OCR1B. Ya me di cuenta de cómo usar uno con Timer0, pero no puedo usarlo para este proyecto.

Entonces, mis preguntas son:   - ¿Cómo configuro la frecuencia PWM a 50Hz (para el servo)?   - ¿Cómo cambio el ciclo de trabajo para establecer la posición del servo?

También el reloj de mi sistema es 1MHz.

¡Gracias por responder!

    
pregunta marenz2569

1 respuesta

1

50Hz es una vez cada 20 milisegundos, y puede tener una resolución casi arbitraria de ancho de pulso usando una lógica muy simple para dar servicio a un pin GPIO para ir a lógica ALTA o lógica BAJA para enviar el pulso. Incluso puedes hacer un montón de otras tareas antes de que el pin finalmente necesite cambiar de estado.

Está intentando obtener un temporizador de hardware que funcione tan bajo como 50Hz, cuando generalmente la gente quiere que esos temporizadores y pulsos PWM sean cientos de hercios, incluso decenas de kilohertz.

Simplemente use el pin como un pin lógico digital, y use un tiempo y lógica simples para establecer el pin alto y bajo según sea necesario para enviar los pulsos.

Digamos que desea que el pulso tenga una duración de 1 milisegundo (1000 microsegundos), durante un intervalo de 20 milisegundos. Digamos que configura un temporizador (no importa cuál) para desbordar e incrementar una variable estática global llamada algo como "TICK_COUNT" y tiene una frecuencia conocida. A partir de esto, puede estimar el tiempo transcurrido durante la operación, y definitivamente durante intervalos cortos como en el orden de 20 ms. Incluso podría restablecer esta variable de conteo al final de cada ciclo de 20 ms.

en el circuito de control principal de su programa, solo verificará el valor de conteo actual (y podrá convertirlo en microsegundos si puede) contra la duración del pulso deseado (llame a este "setPoint", y convertirá de microsegundos a muchos TICK_COUNT que este necesita) ser).

Comience con el pin configurado en ALTO. Una vez que currentCount > = setPoint, deje el pin BAJO. Tenga otra lógica que no haga nada hasta que currentCount > = CYCLE_END, que, sin embargo, es necesario para que sea ~ = 20 milisegundos. Luego reinicia todos los estados lógicos y comienza todo este ciclo nuevamente.

Cualquiera que sea la lógica de programa que tenga que necesite cambiar el punto de ajuste del servo, simplemente escriba en la variable global setPoint, y la lógica de control servo lo manejará.

Creo que he entrado en demasiados detalles, pero espero que todo esto ayude.

    
respondido por el KyranF

Lea otras preguntas en las etiquetas