3 votos

Frecuencia del temporizador PWM del AVR

Estoy aprendiendo a usar un Attiny84. He generado una señal pwm rápida. He conseguido entender cómo hacerlo:

#include <avr/io.h>

int main(void)
{
  // setup timer0
  TCCR0B |= _BV(CS00);  // use clk_i/O without prescalers as clock source.
                        // also enables TIMER0

  // set fast PWM mode
  TCCR0A |= _BV(WGM01) | _BV(WGM00);  // Mode 3
  TCCR0A |= _BV(COM0A1) | _BV(COM0A0);  // set OC0A on compare match, clear on BOTTOM

  OCR0A = 0xff / 2;  // 50% PWM

  // set PB2 as output. This should enable OC0A
  DDRB |= _BV(PB2);

  for (;;) {
  }
}

Sin embargo, no entiendo por qué sólo obtuve ~30kHz en el osciloscopio. Desactivé el fusible CKDIV8 y puse mi CKSEL en "Calibrated Internal RC Oscillator 8MHz".

Pensé que podría tener al menos 8MHz de frecuencia PWM. No encuentro en la documentación cómo se relacionan clk_i/o y clk_cpu. ¿Hay alguna manera de obtener una mayor frecuencia PWM?

N.B.: No necesito tener una frecuencia PWM concreta, sólo estoy probando el chip y tratando de entender sus límites.

7voto

chrisbunney Puntos 228

Tienes un reloj de 8MHz, pero PWM de 8 bits. Esto resulta en una frecuencia de salida de 8MHz/256=31.25kHz. Si necesitas una frecuencia de salida más alta, puedes utilizar el modo 7 en su lugar, a costa de la profundidad de la señal PWM.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X