viernes, 11 de diciembre de 2015

FAQ: Configurar frecuencia PWM en Arduino

El PWM es una técnica de modulación por ancho de pulso que permite obtener una señal analógica (después de un filtro paso bajos) a partir de una señal digital (todo - nada), tal y como podemos ver en la siguiente imagen recogida de este buen blog. Recordar que la frecuencia es la inversa del periodo.



Los Arduinos tienen una frecuencia de PWM por defecto en torno a los 400 Hz. Esta frecuencia está muy bien cuando queremos cambiar la luminosidad de un led (ejemplo FADE de Arduino), pero no es apropiada cuando queremos controlar la velocidad de un motor.



Tenemos que aumentar la frecuencia del PWM, y la pregunta es:


  1. ¿Qué frecuencias están disponibles?
  2. ¿Qué instrucciones tenemos que poner en un Arduino UNO?
  3. ¿Qué instrucciones tenemos que poner en un Arduino MEGA 2650?


Contestar en los comentarios.

NOTA: los comentarios serán revisados antes de su publicación.

8 comentarios:

  1. Hola a todos la respuesta a la primera pregunta.

    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)

    La respuesta a la segunda pregunta
    /* señal PWM */

    int digPin = 10; // pin digital 10

    void setup()
    {
    pinMode(digPin, OUTPUT); // pin en modo salida

    }

    void loop() {
    digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin
    delay(500); // espera medio segundo
    digitalWrite(digPin, LOW); // asigna el valor LOW al pin
    delay(500); // espera medio segundo
    }
    Dependiendo de que arduino tengamos tendremos que configurar la salida PWM en el pin concreto del Uno (3,5,6,9,10,11) y del Mega (2 al 13)

    ResponderEliminar
    Respuestas
    1. ¿Y para el arduino UNO y el MEGA es igual?

      Eliminar
    2. ¿El que la programacion o las salida PWM?

      Eliminar
    3. El código que hay que poner, es diferente para el arduino UNO del MEGA, más que nada porque el procesador es distinto y, por tanto, también los timers ...

      Eliminar
  2. se puede programar para una frecuencia de 1000 Hz?

    ResponderEliminar
    Respuestas
    1. El problema es que dependes de unos registros que hacen de divisores de frecuencia del cristal, por lo que no dispones de cualquier frecuencia. Si cambiaras el cristal del Arduino de 16 MHz por otro que te proporcionara esa frecuencia, podrías conseguirlo.
      Un saludo.

      Eliminar
  3. Hola buenas noches les agradecería si alguien me pudiera pasar un diafragma de un pwm con entrada de 12v y salida de 12v con un amperaje de máximo 30 amp ajustable y una frecuencia ajustable des de 1khz asta 80 Hz si alguien me pudiera ayudar se los agradeceria mucho

    ResponderEliminar
  4. Hola buenas noches les agradecería si alguien me pudiera pasar un diafragma de un pwm con entrada de 12v y salida de 12v con un amperaje de máximo 30 amp ajustable y una frecuencia ajustable des de 1khz asta 80 Hz si alguien me pudiera ayudar se los agradeceria mucho

    ResponderEliminar