#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/adc.h"

#define LedRojo 13
#define LedVerde 14
#define LedAzul 15
#define AdcPin 26
#define AdcPin2 27
#define AdcPin3 28

void config_pwm(uint slice_num, uint slice_num2, uint slice_num3, float freq, uint duty_cycle_percentage){
    uint32_t clk_freq = 133000000;
    float divider = (float)clk_freq / (freq*4096);

    pwm_set_clkdiv(slice_num, divider);
    pwm_set_clkdiv(slice_num2, divider);
    pwm_set_clkdiv(slice_num3, divider);

    uint16_t level = (uint16_t)((duty_cycle_percentage/100.0)*4096);
    pwm_set_gpio_level(LedRojo, level);
    pwm_set_gpio_level(LedVerde, level);
    pwm_set_gpio_level(LedAzul, level);
    pwm_set_enabled(slice_num, true);
    pwm_set_enabled(slice_num2, true);
    pwm_set_enabled(slice_num3, true);
}

void init_adc(uint32_t sample_freq) {
// Inicializa el ADC
adc_init();
// Inicializa el pin GPIO26 como entrada ADC (canal 0)
adc_gpio_init(AdcPin);
adc_gpio_init(AdcPin2);
adc_gpio_init(AdcPin3);
// Configura la frecuencia de muestreo del ADC (divisor del reloj)
uint32_t clk_div = 48000000 / sample_freq; // Calcula el divisor basado en la frecuencia
adc_set_clkdiv((float)clk_div);
}

uint16_t read_adc(int canal) {
// Selecciona el canal ADC (0 en este caso)
adc_select_input(canal);
// Lee el valor del ADC (12 bits: 0 a 4095)
return adc_read();
}

void control_led(uint16_t adc_value, uint led)
{
    uint16_t pwm_valor = adc_value * 4096 / 4095;
    pwm_set_gpio_level(led, adc_value);
}

int main()
{
    gpio_set_function(LedRojo, GPIO_FUNC_PWM);
    gpio_set_function(LedAzul, GPIO_FUNC_PWM);
    gpio_set_function(LedVerde, GPIO_FUNC_PWM);
    uint slice_num = pwm_gpio_to_slice_num(LedRojo);
    uint slice_num2 = pwm_gpio_to_slice_num(LedVerde);
    uint slice_num3 = pwm_gpio_to_slice_num(LedAzul);

    uint32_t sample_freq = 500000; // Frecuencia de muestreo de 500 ksps
// Inicializa el ADC con la frecuencia especificada
    init_adc(sample_freq);


    float pwm_freq = 1000.0;
    uint duty_cycle = 50;
    config_pwm(slice_num, slice_num2, slice_num3, pwm_freq, duty_cycle);

    while(true){
        uint16_t adc_value = read_adc(0);
        control_led(adc_value, LedRojo);
        sleep_ms(50);

        uint16_t adc_value2 = read_adc(1);
        control_led(adc_value2, LedVerde);
        sleep_ms(50);

        uint16_t adc_value3 = read_adc(2);
        control_led(adc_value3, LedAzul);
        sleep_ms(50);
    }
    return 0;
}
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT