// Bibliotecas
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/timer.h"
//Definir o pino do LED
#define LED_RED 13
#define LED_BLUE 12
#define LED_GREEN 11
//Calculo do wrap LED vermelho/azul para 1 kHz:
//wrap = (125*10^6*(1/10.10^3)/16 = 7812.5
const uint WRAP_RED = 7812;
const uint WRAP_BLUE = 7812;
//Calculo wrap para LED azul 10 kHz:
//wrap = (125*10^6*(1/10.10^3)/16 = 781.25
const uint WRAP_GREEN = 781;
const float DIVIDER_PWM = 16.0; //Divisor fracional do clock para o PWM
volatile uint16_t led_level_a = 390; //Nível inicial do PWM (duty cicle)
volatile uint16_t led_level_b = 39; //Nível inicial do PWM (duty cicle)
volatile uint16_t led_level_c = 78; //Nível inicial do PWM (duty cicle)
// Pino do botão
const uint BUTTON_PIN = 5;
// Tempo de debounce em us
const uint DEBOUNCE = 200000;
//Função de callback do temporizador
bool repeating_timer_callback(struct repeating_timer *t){
//Calculo do incremento: led_step_a = (7812*5)/100 = 390
if(led_level_a >= 3700){
// Verifica se o incremento ultrapassou o valor de wrap
//Caso o estouro tenha acontecido led_level_a recebe
//o valor de led_step_a = 390
led_level_a = 390;
}
pwm_set_gpio_level(LED_RED, led_level_a);
led_level_a = led_level_a + 390; //Incrementa o nível do LED vermelho em 5%
printf("Incrementando PWM led vermelho = %d\n", led_level_a);
if(led_level_b >= 370){
// Verifica se o incremento ultrapassou o valor de wrap
// Caso o estouro tenha acontecido led_level_a recebe
// o valor de led_step_b = 39
led_level_b = 39;
}
pwm_set_gpio_level(LED_GREEN, led_level_b);
led_level_b = led_level_b + 39; //Incrementa o nível do LED verde em 5%
printf("Incrementando PWM do LED verde = %d \n", led_level_b);
if(led_level_c >= 3700){
// Verifica se o incremento ultrapassou o valor de wrap
// Caso o estouro tenha acontecido led_level_a recebe
// o valor de led_step_b = 39
led_level_c = 78;
}
pwm_set_gpio_level(LED_BLUE, led_level_c);
led_level_c = led_level_c + 78; //Incrementa o nível do LED azul
printf("Incrementando PWM do LED azul = %d \n", led_level_c);
//Continuar o temporizador de repetição
return true;
}
void setup_pwm(){
uint slice;
gpio_set_function(LED_RED, GPIO_FUNC_PWM); //Configura o pino do LED vermelho para a função PWM
slice = pwm_gpio_to_slice_num(LED_RED); //Obtem o slice do PWM associado ao pino do LED
pwm_set_clkdiv(slice, DIVIDER_PWM); //Define o divisor de clock do PWM
pwm_set_wrap(slice, WRAP_RED); //Configura o valor máximo do contador (período dp PWM)
pwm_set_gpio_level(LED_RED, led_level_a); //Habilita o PWM no slice correspondente
pwm_set_enabled(slice, true); //Habilita o PWM no slice correspondente
gpio_set_function(LED_GREEN, GPIO_FUNC_PWM); //Configura o pino do LED verde para a função PWM
slice = pwm_gpio_to_slice_num(LED_GREEN); //Obtem o slice do PWM associado ao pino do LED
pwm_set_clkdiv(slice, DIVIDER_PWM); //Define o divisor de clock do PWM
pwm_set_wrap(slice, WRAP_GREEN); //Configura o valor máximo do contador (período dp PWM)
pwm_set_gpio_level(LED_GREEN, led_level_b); //Habilita o PWM no slice correspondente
pwm_set_enabled(slice, true); //Habilita o PWM no slice correspondente
gpio_set_function(LED_BLUE, GPIO_FUNC_PWM); //Configura o pino do LED vermelho para a função PWM
slice = pwm_gpio_to_slice_num(LED_BLUE); //Obtem o slice do PWM associado ao pino do LED
pwm_set_clkdiv(slice, DIVIDER_PWM); //Define o divisor de clock do PWM
pwm_set_wrap(slice, WRAP_BLUE); //Configura o valor máximo do contador (período dp PWM)
pwm_set_gpio_level(LED_GREEN, led_level_c); //Habilita o PWM no slice correspondente
pwm_set_enabled(slice, true); //Habilita o PWM no slice correspondente
}
int main(){
stdio_init_all(); // Inicializa o sistema
setup_pwm(); // Inicaliza a configuração do PWM
// uint16_t led_level_a = 0; //Nível inicial do PWM (duty cicle)
// uint16_t led_level_b = 0; //Nível inicial do PWM (duty cicle)
// uint16_t led_level_c = 0; //Nível inicial do PWM (duty cicle)
pwm_set_gpio_level(LED_RED, 390);
pwm_set_gpio_level(LED_GREEN, 39);
pwm_set_gpio_level(LED_BLUE, 78);
// Configurar o temporizador para verificar
struct repeating_timer timer;
add_repeating_timer_ms(2000, repeating_timer_callback, NULL, &timer);
while(true){
sleep_ms(10);
}
}