#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;
}