Generando señal servo en atmega2560

7

Soy nuevo en AtmelStudio. Necesito saber cómo generar una señal de control de servo usando módulos de temporizador de atmega2560. Estoy utilizando una placa Arduino Mega . (Consulte los últimos párrafos de esta página para obtener más información sobre las señales de control de servo).

No estoy seguro de cómo hacer el tiempo exacto. La parte de selección de reloj siempre es un poco confusa para mí.

¿Cómo debo configurar el módulo del temporizador (registros TCCR) y cómo hacer el tiempo? Es mejor si hay un ejemplo de código de trabajo.

(He intentado usar el temporizador 0 en el modo PWM rápido. Da pulsos en consecuencia, pero no sé cómo calcular los preescaladores de sincronización adecuados. Tengo dudas sobre el reloj primario utilizado. ¿Es el cristal de 16MHz activado? la placa Arduino o hay alguna otra fuente de reloj incorporada dentro de la atmega2560, de modo que tenemos que mencionar explícitamente qué reloj usar ??)

    
pregunta Anubis

2 respuestas

3

Dado que la pregunta solicita un código AVR de trabajo para el servocontrol, este artículo , aunque escrito para el microcontrolador ATmega32, sería un excelente recurso.

En una placa Arduino, el reloj principal que normalmente se usa para el Temporizador / Contadores 0..n es el cristal en la placa, generalmente 16 MHz, aunque algunas placas Arduinos / clon también usan cristales de 8 MHz o 20 MHz. La sección 18 de la hoja de datos aborda la selección de la fuente del reloj / prescaler desde relojes internos o externos.

Usted tiene la opción de usar el "oscilador interno calibrado" ATmega2560, esencialmente un temporizador RC incorporado, pero que carece de precisión / estabilidad, ya que podría ser necesario para la señal servo, dependiendo de la aplicación. Para usar el oscilador interno, configure CKSEL3: 0 a 0010. De la Sección 10.3.1 de la hoja de datos :

The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0").

Una sugerencia adicional:
Si la precisión del servocontrol es deseable, en lugar de usar Timer0, que es un contador / temporizador de 8 bits, uno de los contadores de temporizador de 16 bits (1, 3, 4 y 5) sería una opción preferida.

    
respondido por el Anindo Ghosh
1

Hace unos años escribí un código de servo PWM para ATMega168 y ATTiny2313 que manejaba 64 canales (servos). El código y los esquemas se pueden encontrar en www.lhexapod.com

    
respondido por el Len Holgate

Lea otras preguntas en las etiquetas