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.
![](https://www.pinguytaz.net/wp-content/uploads/2024/06/image-5.png)
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.
![](https://www.pinguytaz.net/wp-content/uploads/2024/06/image-6.png)
La formula que nos permite el calculo es la siguiente:
![](https://www.pinguytaz.net/wp-content/uploads/2024/06/image-7.png)
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.