Frecuencia de las salidas PWM

Hola a todos

La placa Diecimila con la que estamos trabajando dispone de 6 salidas de modulación por anchura de pulso (PWM) que son ideales para controlar el voltaje aplicado a una carga. El problema es que la frecuencia de este PWM es de tan solo 490 Hz y esto puede ser adecuado para un control de iluminación pero no es lo mejor opción para controlar la velocidad de un motor DC (entre 4KHz y 40KHz normalmente).

Las 6 salidas PWM son controladas por 3 contadores, cada contador se encarga de dos salidas PWM:

Contador 0: D6 (PD6) y D5 (PD5)
Contador 1: D9 (PB1) y D10 (PB2)
Contador 2: D11(PB3) y D3 (PD3)

Entre paréntesis pongo el nombre de la pata del Atmega168 y las que empiezan por "D" son los nombres de las líneas digitales del Arduino

En el Arduino la frecuencia del PWM se consigue a partir de la frecuencia de reloj y de un divisor programable llamado "prescaler". Par conseguir subir los 490HZ de frecuencia del PWM hay que modificar el factor de división del prescaler (64 por defecto) disminuyéndolo hasta conseguir la frecuencia deseada. Estas son las frecuencias que se consiguen:

Contador 1 Contador 2
Prescaler Frecuencia Registro TCCR1B Registro TCCR2B
64 490Hz 3 4
32 984Hz -- 3
8 3936Hz 2 2
1 31360Hz 1 1

Nota, el contador 1 no admite el prescaler de 32

Como el Contador 0 se utiliza para las funciones de retardo, si modificamos la configuración de este contador dichas funciones no funcionarán correctamente. Por ello podemos modificar las salidas PWM asociadas a los contadores 1 y 2, esto es: D3, D9, D10 y D11. Por ejemplo para configurar estas cuatro últimas salidas PWM con una frecuencia de 31360Hz añadiremos las siguientes líneas en la configuración de nuestro programa:

TCCR1B =1;
TCCR2B =1;

Esto se contradice un poco con lo que pone aquí (habla de un PWM de 30769 Hz), http://www.arduino.cc/es/DCMotor/DCMotor pero creo que el problema es que la información no está actualizada.

Un saludo:

Eduardo

Hola Eduardo!!

Muy buena info. Gracias!
¿Donde esta en la web de arduino la información del hardware interno que se usa para implementar las funciones software?
Por ejemplo, has expuesto que las funciones de retardo usan el timer 0.

Gracias de antemano. :wink:

Igor R.

Yo lo he encontrado mirando directamente el código que se usa para implementar las distintas funciones. Lo tienes en la carpeta hardware\cores\arduino

GRACIAS!!

Ante todo muchisimas gracias por compartir estos conocimientos con todos.

Me surge una pregunta, en la etapa de potencia (p.e. L293D) ¿donde aplicas PWM... en los pines de Enable o en los pines de control del motor?...

Yo soy de los que dejan fijos los "Enable" y el PWM lo aplico en los pines de control pero iba a montar una nueva y he dudado si hacerla al contrario... ¿puede haber diferencia de rendimiento?

Gracias.
furri.

Yo creo que esta es la forma más correcta de hacerlo http://arduino.cc/es/L293D/L293D

Una cosa, el L293 usa tecnología bipolar (una caida de tensión importante en los transistores del puente en H). Hay opciones mucho más interesantes (Tecnología DMOS) como el L6202 o el L6203 pero bueno, también depende mucho del tamaño (consumo) del motor que quieras controlar.

Un saludo:

Eduardo