/*
Unidade 4 - Tarefa 2
Lara Gardenia
Questão 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ções de pinos para o LED RGB
#define LED_R_PIN 2 // Canal Vermelho do LED RGB
#define LED_B_PIN 3 // Canal Azul do LED RGB
#define LED_G_PIN 4 // Canal Verde do LED RGB
// Função para configurar o PWM
void setup_pwm(uint gpio, uint freq, uint duty_cycle) {
gpio_set_function(gpio, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(gpio);
// Calcula o divisor do clock para obter a frequência desejada
uint32_t clock_div = 125000000 / (freq * 100);
pwm_set_clkdiv(slice_num, clock_div);
// Define a resolução do duty cycle em 100 para facilitar o cálculo em porcentagem
pwm_set_wrap(slice_num, 100);
// Configura o duty cycle inicial
pwm_set_chan_level(slice_num, pwm_gpio_to_channel(gpio), duty_cycle);
// Habilita o PWM
pwm_set_enabled(slice_num, true);
}
int main() {
stdio_init_all();
printf("Controle de LED RGB com PWM iniciado.\n");
// Configuração dos LEDs RGB
setup_pwm(LED_R_PIN, 1000, 0); // Vermelho inicia apagado
setup_pwm(LED_B_PIN, 10000, 0); // Azul inicia apagado
setup_pwm(LED_G_PIN, 500, 0); // Verde inicia apagado
uint slice_r = pwm_gpio_to_slice_num(LED_R_PIN);
uint slice_b = pwm_gpio_to_slice_num(LED_B_PIN);
uint slice_g = pwm_gpio_to_slice_num(LED_G_PIN);
uint duty_cycle_r = 5; // Duty cycle inicial para o canal vermelho
int state = 0; // Estado atual: 0 = vermelho, 1 = azul, 2 = verde
while (true) {
// Desliga todos os LEDs antes de ativar o próximo
pwm_set_chan_level(slice_r, pwm_gpio_to_channel(LED_R_PIN), 0);
pwm_set_chan_level(slice_b, pwm_gpio_to_channel(LED_B_PIN), 0);
pwm_set_chan_level(slice_g, pwm_gpio_to_channel(LED_G_PIN), 0);
switch (state) {
case 0: // Controle do LED vermelho
pwm_set_chan_level(slice_r, pwm_gpio_to_channel(LED_R_PIN), duty_cycle_r);
printf("Estado: Vermelho - Duty Cycle: %d%%\n", duty_cycle_r);
duty_cycle_r += 5;
if (duty_cycle_r > 100) {
duty_cycle_r = 5;
state = 1; // Muda para o azul
}
break;
case 1: // Controle do LED azul
pwm_set_chan_level(slice_b, pwm_gpio_to_channel(LED_B_PIN), 50); // Duty cycle fixo
printf("Estado: Azul - Duty Cycle: 50%%\n");
state = 2; // Muda para o verde após 2 segundos
break;
case 2: // Controle do LED verde
pwm_set_chan_level(slice_g, pwm_gpio_to_channel(LED_G_PIN), 75); // Duty cycle fixo
printf("Estado: Verde - Duty Cycle: 75%%\n");
state = 0; // Volta para o vermelho após 2 segundos
break;
}
sleep_ms(2000); // Espera 2 segundos antes de mudar de estado
}
return 0;
}