#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
// Constantes para os LEDs
const uint LED_RED = 12; // Pino do LED vermelho
const uint LED_BLUE = 13; // Pino do LED azul
// Constantes para o PWM
const float PWM_CLKDIV = 16.0; // Divisor de clock (comum para ambos os LEDs)
const uint32_t FREQ_LED_RED = 1000; // Frequência do LED vermelho (1kHz)
const uint32_t FREQ_LED_BLUE = 10000; // Frequência do LED azul (10kHz)
const uint16_t LED_RED_STEP = 5; // Incremento do duty cycle para o LED vermelho (5%)
uint16_t red_duty_cycle = 5; // Duty cycle inicial do LED vermelho (%)
uint16_t wrap_red; // Valor máximo do contador do LED vermelho
uint16_t wrap_blue; // Valor máximo do contador do LED azul
// Variável para controlar os duty cycles
bool increase_red = true; // Controla se o duty cycle do LED vermelho aumenta ou reseta
// Configura o PWM para um LED
void setup_pwm(uint gpio, uint32_t freq, float clkdiv, uint16_t *wrap) {
gpio_set_function(gpio, GPIO_FUNC_PWM); // Configura o pino como saída PWM
uint slice = pwm_gpio_to_slice_num(gpio); // Obtém o slice associado ao pino
*wrap = (uint16_t)((125000000 / clkdiv) / freq - 1); // Calcula o valor máximo do contador
pwm_set_clkdiv(slice, clkdiv); // Define o divisor de clock
pwm_set_wrap(slice, *wrap); // Define o valor máximo do contador
pwm_set_gpio_level(gpio, 0); // Inicializa o nível do PWM
pwm_set_enabled(slice, true); // Habilita o PWM
}
// Configura as interrupções para o temporizador
bool update_red_pwm(struct repeating_timer *t) {
uint slice_red = pwm_gpio_to_slice_num(LED_RED);
// Atualiza o duty cycle do LED vermelho
uint16_t new_level = (red_duty_cycle * wrap_red) / 100;
pwm_set_gpio_level(LED_RED, new_level);
// Incrementa ou reseta o duty cycle
red_duty_cycle += LED_RED_STEP;
if (red_duty_cycle > 100) {
red_duty_cycle = LED_RED_STEP; // Reseta para 5% quando atinge 100%
}
return true; // Continua a repetição do timer
}
int main() {
stdio_init_all(); // Inicializa o sistema padrão de I/O
printf("Iniciando controle dos LEDs RGB com PWM...\n");
// Configura o PWM para os LEDs
setup_pwm(LED_RED, FREQ_LED_RED, PWM_CLKDIV, &wrap_red);
setup_pwm(LED_BLUE, FREQ_LED_BLUE, PWM_CLKDIV, &wrap_blue);
// Inicializa o duty cycle do LED azul
pwm_set_gpio_level(LED_BLUE, (50 * wrap_blue) / 100); // Duty cycle fixo de 50% para o LED azul
// Configura um temporizador para atualizar o duty cycle do LED vermelho a cada 2 segundos
struct repeating_timer timer;
add_repeating_timer_ms(2000, update_red_pwm, NULL, &timer);
// Loop principal
while (true) {
tight_loop_contents(); // Aguarda interrupções
}
return 0;
}