¿Por qué algunos pines tienen una frecuencia PWM diferente?


Respuestas:


23

Esas no son las únicas frecuencias disponibles para las señales PWM. Sin embargo, son las frecuencias determinadas por el preescalador aplicado (que puede cambiar fácilmente como se detalla a continuación).

Cada uno de los 3 pares de pines PWM está vinculado a un temporizador, cada uno de los cuales tiene su propia frecuencia base, de la siguiente manera:

  • Los pines 5 y 6 están emparejados en el temporizador 0, con una frecuencia base de 62500Hz
  • Los pines 9 y 10 están emparejados en el temporizador 1, con una frecuencia base de 31250Hz
  • Los pines 3 y 11 están emparejados en el temporizador 2, con una frecuencia base de 31250Hz

Luego, cada conjunto de pines tiene una serie de valores de preescalador que se pueden elegir, que dividirán la frecuencia base de ese par de pines. Los valores disponibles del preescalador son:

  • Los pines 5 y 6 tienen valores de preescalador de 1, 8, 64, 256 y 1024
  • Los pines 9 y 10 tienen valores de preescalador de 1, 8, 64, 256 y 1024
  • Los pines 3 y 11 tienen valores de preescalador de 1, 8, 32, 64, 128, 256 y 1024

Las diferentes combinaciones producen diferentes frecuencias en un pin PWM dado. Observe que el temporizador 2 (vinculado a los pines 3 y 11) tiene más valores de preescalador disponibles, lo que resulta en más frecuencias disponibles.

Ahora, por qué el temporizador 2 es diferente, esa es una pregunta separada.

Editar: Aquí hay una lista de posibles frecuencias PWM por pin (de este artículo ):

Para los pines 6 y 5 (OC0A y OC0B):

  • Si TCCR0B = xxxxx001, la frecuencia es de 64 kHz
  • Si TCCR0B = xxxxx010, la frecuencia es de 8 kHz
  • Si TCCR0B = xxxxx011, la frecuencia es de 1 kHz (este es el valor predeterminado del gestor de arranque Diecimila)
  • Si TCCR0B = xxxxx100, la frecuencia es 250Hz
  • Si TCCR0B = xxxxx101, la frecuencia es 62.5 Hz

Para los pines 9, 10, 11 y 3 (OC1A, OC1B, OC2A, OC2B):

  • Si TCCRnB = xxxxx001, la frecuencia es de 32 kHz
  • Si TCCRnB = xxxxx010, la frecuencia es de 4 kHz
  • Si TCCRnB = xxxxx011, la frecuencia es 500Hz (este es el valor predeterminado del gestor de arranque Diecimila)
  • Si TCCRnB = xxxxx100, la frecuencia es 125Hz
  • Si TCCRnB = xxxxx101, la frecuencia es 31.25 Hz

TCCRnBes donde establece los bits de preescalador para el temporizador n, reemplazándolos npor 0, 1 o 2, según el temporizador que desee configurar. Si aún no está seguro acerca de las operaciones bit a bit, lea este tutorial de matemáticas de bits .

Mis fuentes:

Tenga en cuenta que parece haber divergencia en esas fuentes sobre si los pines 9 y 10 tienen el mismo comportamiento que 5 y 6 o 3 y 11, pero de todos modos se entiende la idea. Estoy leyendo el datashet para tratar de descubrir cuál es el correcto, o si esto es una diferencia entre los tableros.


1
¿A qué ATmega se refiere esta respuesta? No lo comprobé, pero apuesto a que difiere ligeramente según el controlador.
jippie

@jippie Buen punto! Las fuentes se refieren a ATmega168 y 328.
Ricardo

@jippie Solo para aclarar, en mi respuesta, los números de pin se refieren a cómo son asignadores en la placa Uno (pin 1 significa Pin Digital 1 o D1, por ejemplo), no el IC (el pin ATmega328 1 se reinicia).
Ricardo

1
Creo que esos detalles también cambian con las tablas, Uno, Duemilanove, Mega, ...
jippie

@jippie Definitivamente sí.
Ricardo

8

No conozco las consideraciones de diseño, pero si revisa la hoja de datos del microcontrolador en su Arduino, notará que los pines PWM están agrupados y por grupo conectados a un temporizador. La velocidad a la que se incrementa este temporizador varía según el preescalador configurado. Si cambia el preescalador para un determinado temporizador, cambia la frecuencia PWM para los pines PWM relacionados. Creo que algunos temporizadores se duplican para otros fines, como la millis();función. Si cambia el preescalador para ese temporizador, los valores devueltos por millis()se desactivarán por el mismo factor.

Puede calcular la configuración para el preescalador de la siguiente manera:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ aproximadamente 128 $$

preescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = aproximadamente 128.

Consulte la hoja de datos y verá que 128 es uno de los valores de preescalador que puede seleccionar.


2
Chico, ¿extrañamos MathJax o qué? Espero que lo habilitemos después de la versión beta.
Ricardo

1
@Ricardo Tengo un botón MathJax en mi navegador; o) meta.arduino.stackexchange.com/questions/13/…
jippie
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.