Cambio de frecuencia del PWM en el Arduino Mega

Hola a todos,

Trabajando con el arduino mega y las salidas PWM me topé que necesitaba cambiar la frecuencia a la cual genera los pulsos, algo bien documentado para la placa chica pero no habia visto nada para la grande. Así que por fuerza me puse a investigar y esto encontré:

  • El Mega 2560 tiene 15 salidas PWM por hardware
  • A sólo 6 de ellas se les puede modificar el factor de división de frecuencia:
Registro    Pin en
del micro   Arduino
TCCR0B         4
TCCR1B        12
TCCR2B         9
TCCR3B         2
TCCR4B         7
TCCR5B        45

Para el Timer/Counter 0,1,3,4 y 5
Config.   Divisor   Frecuencia PWM
0x00            -        0
0x01            1   31,333 Hz
0x02            8    3,916 Hz
0x03           64      489 Hz
0x04          256      122 Hz
0x05         1024       30 Hz

Para el Timer/Counter 2
Config.   Divisor   Frecuencia PWM
0x00            -        0
0x01            1   31,333 Hz
0x02            8    3,916 Hz
0x03           32      979 Hz
0x04           64      489 Hz
0x05          128      244 Hz
0x06          256      122 Hz
0x07         1024       30 Hz

Por omisión, la frecuencia del PWM está configurada a 489 Hz y ya es de nosotros el moverla a voluntad usando los registros. El código a incluír es algo así:

//Para bajar la frecuencia del PWM pin 45 del Mega 2560 a 30 Hz
TCCR5B = TCCR5B & 0b000 | 0x05;
//Para bajar la frecuencia del PWM pin 9 del Mega 2560 a 30 Hz
TCCR2B = TCCR2B & 0b000 | 0x07;

Imagenes del osciloscopio (TCCR2B)
Sin división
entre 8
entre 32
entre 64
entre 128
entre 256
entre 1024

Espero que sea útil, saludos.

oye amigo, es posible variar la frecuencia de 30 hz a 0? he buscado por muchos lugares si puedo hacer algo asi para controlar los pulsos de apertura en un inyector por segundo, mediante un potenciómetro pero lo único que logré es controlar la corriente que alimenta a la frecuencia, (Termine cargándome una proto board), no estoy seguro si se pueda, ya que es para un proyecto de la escuela, estoy en sistemas automotrices y pues me piden controlar el tiempo de inyección y el tiempo que este se cierra.

Solo e intentado con algo asi

apertura = ((analogRead(A6))); //8lectura de tiempo de gatilleo
           Serial.println(apertura);

     apertura=map(apertura, 0.00,1023.99, 0.01, 10.00);
     
     cerrado = apertura*3; 
     
     digitalWrite(led, HIGH);
     delay(apertura);

     digitalWrite(led, LOW);
     delay(cerrado);

     tiempo=apertura+cerrado;
     Serial.print(apertura);
     Serial.print(',');
     Serial.print(cerrado);
     Serial.print(',');
     Serial.println(tiempo);

Es posible que leas las Normas del foro y las apliques.
1. Códigos van con etiquetas.
2. No respondas hilos de mas de 120 dias y ni hablar de algo sin terminar del 2011 o no te diste cuenta?
Lo que debes hacer es crear tu hilo y entonces si, esperar a que seas respondido.
Cierro el hilo porque no corresponde tu inquietud.