#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);
}
Loading chip...chip-scope