// IFMA - SISTEMAS EMBARCADOS
// HUGO FELIPE DOS SANTOS ROCHA
// UNIT04 - Cap. 05 a 08 - ATIVIDADE: TAREFA DE ENVIO - Clock e temporizador
/*TAREFA 2:
5. Modifique o exemplo de código apresentado na videoaula (reproduzido abaixo) para controlar os três LEDs RGB da placa BitDogLab usando o módulo PWM e interrupções, seguindo as orientações a seguir:
A. O LED vermelho deve ser acionado com um PWM de 1kHz.
B. O duty cycle deve ser iniciado em 5% e atualizado a cada 2 segundos em incrementos de 5%. Quando atingir o valor máximo, deve retornar a 5%.
‐ O LED azul deve ser acionado com um PWM de 10kHz.
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
// Definição dos pinos para os LEDs RGB
#define LED_RED 12 // Pino do LED vermelho
#define LED_BLUE 13 // Pino do LED azul
// Configuração do PWM
#define FREQ_RED 1000 // Frequência do PWM para o LED vermelho (1 kHz)
#define FREQ_BLUE 10000 // Frequência do PWM para o LED azul (10 kHz)
#define CLOCK 125000000 // Clock padrão do RP2040 (125 MHz)
#define STEP 5 // Incremento do duty cycle em %
#define MAX_DUTY 100 // Duty cycle máximo
uint16_t duty_red = 5; // Início do duty cycle do LED vermelho
void setup_pwm(uint pin, uint freq)
{
uint slice = pwm_gpio_to_slice_num(pin);
gpio_set_function(pin, GPIO_FUNC_PWM);
uint32_t wrap = CLOCK / freq;
pwm_set_wrap(slice, wrap);
pwm_set_clkdiv(slice, 1.0);
pwm_set_gpio_level(pin, (wrap * duty_red) / 100);
pwm_set_enabled(slice, true);
}
bool update_pwm_callback(struct repeating_timer *t)
{
uint slice = pwm_gpio_to_slice_num(LED_RED);
uint32_t wrap = pwm_hw->slice[slice].top;
duty_red += STEP;
if (duty_red > MAX_DUTY)
duty_red = 5;
pwm_set_gpio_level(LED_RED, (wrap * duty_red) / 100);
return true;
}
int main()
{
stdio_init_all();
setup_pwm(LED_RED, FREQ_RED);
setup_pwm(LED_BLUE, FREQ_BLUE);
struct repeating_timer timer;
add_repeating_timer_ms(2000, update_pwm_callback, NULL, &timer);
while (true)
{
sleep_ms(1000);
}
}