Generando señal de servo en atmega2560

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

ingrese la descripción de la imagen aquí

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

¿Cómo debo configurar el módulo temporizador (registros TCCR) y cómo hacer el cronometraje? 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 tiempo adecuados. Tengo dudas sobre el reloj principal utilizado. ¿Es el cristal de 16 MHz en la placa Arduino? ¿O hay alguna otra fuente de reloj incorporada dentro del atmega2560 para que tengamos que mencionar explícitamente qué reloj usar?)

Hay configuraciones de fusibles que puede "parpadear" que determinan qué fuente de reloj usa su microcontrolador (tiene razón al suponer que hay un oscilador interno que se puede usar en lugar del cristal de 16MHz). Para empezar, puede descargar el IDE de arduino y luego abrir los archivos fuente para la biblioteca de servos.
Los fusibles de Arduino rara vez se tocan. Puede matar el gestor de arranque. Como menciona @NickHalden, ¿por qué no usar las bibliotecas de servo estándar?
@NickHalden sí, he usado Arduino IDE y estoy de acuerdo con eso. Necesito mudarme a AtmelStudio para que puedas hacer algo de codificación real. Pero estoy probando todo solo con la ayuda de la hoja de datos atmega2560. Sería muy amable si pudiera encontrar un buen tutorial con algunos ejemplos funcionales y completos , al menos solo para manejar un servo.
@jippie, consulte el comentario anterior ... (no se permite recomendar a dos personas en un solo comentario: D)

Respuestas (2)

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

En una placa Arduino, el reloj principal que se utiliza normalmente para el temporizador/contador 0..n es el cristal de la placa, normalmente de 16 MHz, aunque algunas placas Arduino/clónicas también utilizan cristales de 8 MHz o 20 MHz. La sección 18 de la hoja de datos aborda la selección de fuente de reloj / preescalador de relojes externos o internos.

Tiene la opción de usar el "oscilador interno calibrado" ATmega2560, esencialmente un temporizador RC incorporado, pero carece de precisión / estabilidad, ya que podría ser necesario para la señal del servo, según la aplicación. Para usar el oscilador interno, establezca CKSEL3:0 en 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 se desea precisión en el control del servo, en lugar de utilizar Timer0, que es un temporizador/contador de 8 bits, uno de los contadores de temporizador de 16 bits (1, 3, 4 y 5) sería la opción preferida. .

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