Rust-Embebido «Arduino» PWM parte 4

Llegamos a la cuarta entrega de esta programación embebida de Arduino con Rust:

En esta ocasión hablaremos de la modulación por pulso que nos permite emular una salida analogica, OJO es una emulación pero no una salida analógica ya que nos dara valores 0V y 5V y emularíamos por ejemplo 3V pero si nuestro dispositivo conectado solo aguanta hasta 3V lo podríamos estropear ya que le entraría +5V.

La modulación por pulso (PWM) es una señal digital que se repite durante un periodo definido (ejemplo 1Hz que es aproximadamente un segundo) y se mantiene en alto un porcentaje de tiempo y el resto en bajo y así repetidamente. Al usar periodos cortos los cambios son tantos que no se aprecia el cero (apagado en un led) pero si una reducción de la velocidad en un motor o brillo en un LED. Se puede ver gráficamente en la figura.

La formula que nos permite el calculo es la siguiente:

Los pines PWM se vieron en la tabla presentada al hablar de las E/S Digitales y el ciclo se genera gracias a los timer, ponemos una tabla en la que vemos los Timer-Counter que utiliza cada entrada. La resolución es de 8bits (0-255) y la frecuencia del ciclo es de 490Hz y para los pines D5 y D6 es de 980Hz.

El código de este POST se encuentra en GitHub como siempre, en este caso tendremos dos LEDs que realizaran un FADE, utilizamos dos LEDs para usar dos contadores diferentes.

Lo primero que hacemos como siempre es recoger los pines para luego definirlos, en este caso antes definiremos el Timer-Count necesario del pin como se ve en el código.

// Definimos los TIMER
let timer0 = Timer0Pwm::new(dp.TC0, Prescaler::Prescale64);   // Timer para d5 y d6
let timer1 = Timer1Pwm::new(dp.TC1, Prescaler::Prescale64);   // Timer para d9 y d10
let timer2 = Timer2Pwm::new(dp.TC2, Prescaler::Prescale64);   // Timer para d3 y d11

Con los Timer necesarios definidos como siempre definiremos nuestros pines

let mut pwmled = pins.d5.into_output().into_pwm(timer0);  // Definimos D5 como PWM con el timer que le corresponde TC0
pwmled.enable();    // Lo habilitamos

Desde este momento podemos a utilizar nuestros PWM y los métodos disponibles son:

  • enable() Habilitamos el pin.
  • disable() Deshabilitamos el pin.
  • set_duty(valor) Ponemos un valor de 0 el mínimo y 255 el máximo en el pin PWM correspondiente.
  • get_duty() Nos permite recoger el valor actual configurado
  • get_max_duty() Valor máximo que podemos poner.
/ Ejemplo de FADE
for x in (0..=255).chain((0..=254).rev()) {
   pwmled.set_duty(x);
   arduino_hal::delay_ms(20);
}

Con esto terminamos esta cuarta entrega la próxima veremos un tema muy interesante que son las Interrupciones externas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Javier.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Hostinger.es que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad