#include "main.h"
#define DEBUG false // Flag usada para debug
#define PINO_POT_DUTY GPIO_NUM_27 // Define o pino de ajuste da largura de pulso
#define PINO_POT_FREQ GPIO_NUM_14 // Define o pino de ajuste da frequência
#define PINO_PWM_1 GPIO_NUM_26 // Define o pino de saída do PWM
#define PINO_LED GPIO_NUM_25 // Define o pino de saída do LED
#define PWM_CHANNEL 0 // Canal PWM
#define PWM_RESOLUTION 8 // Resolução do duty cycle em bits
#define PWM_FREQUENCY_MIN 500 // Frequência mínima do PWM em Hz
#define PWM_FREQUENCY_MAX 5000 // Frequência máxima do PWM em Hz
uint32_t analogPotDuty = 0;
uint32_t analogPotFreq = 0;
uint16_t digitalPWM = 0;
void setup()
{
#if DEBUG
Serial.begin(115200); // Inicia o serial com taxa de atualização de 115200
#endif
// Configura porta de inicialização
pinMode(PINO_POT_DUTY, INPUT);
pinMode(PINO_POT_FREQ, INPUT);
// Configura porta de sinalização
pinMode(PINO_LED, OUTPUT);
digitalWrite(PINO_LED, LOW);
// Configura o canal PWM e associa os pinos de PWM
ledcSetup(PWM_CHANNEL, PWM_FREQUENCY_MIN, PWM_RESOLUTION);
ledcAttachPin(PINO_PWM_1, PWM_CHANNEL);
ledcAttachPin(PINO_LED, PWM_CHANNEL); // Usa o mesmo canal PWM para o LED
// Configura a resolução do ADC para 12 bits
analogReadResolution(12);
/* A atenuação do ADC permite que você leia uma gama mais ampla de tensões.
O ESP32 permite as seguintes configurações de atenuação para ADCs:
ADC_ATTEN_DB_0 para uma faixa de aproximadamente 0 a 1.1V
ADC_ATTEN_DB_2_5 para uma faixa de aproximadamente 0 a 1.5V
ADC_ATTEN_DB_6 para uma faixa de aproximadamente 0 a 2.2V
ADC_ATTEN_DB_11 para uma faixa de aproximadamente 0 a 3.9V */
// Configura a atenuação para ADC1_CHANNEL_6 (GPIO34)
adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
}
void loop()
{
verificaDutyCycle();
verificaFrequency();
processaPWM();
}
void verificaDutyCycle()
{
analogPotDuty = analogRead(PINO_POT_DUTY);
digitalPWM = map(analogPotDuty, 0, 4095, 0, 255); // ESP32 ADC range é 0-4095
#if DEBUG
Serial.print("Duty Cycle: ");
Serial.println(digitalPWM);
#endif
}
void verificaFrequency()
{
analogPotFreq = analogRead(PINO_POT_FREQ);
// Ajuste conforme a necessidade
uint32_t freq = map(analogPotFreq, 0, 4095, PWM_FREQUENCY_MIN, PWM_FREQUENCY_MAX);
ledcSetup(PWM_CHANNEL, freq, PWM_RESOLUTION);
#if DEBUG
Serial.print(" Frequency: ");
Serial.println(freq);
#endif
}
void processaPWM()
{
ledcWrite(PWM_CHANNEL, digitalPWM);
}