带PWM输出(ledcWrite)的时间AnalogRead()

时间:2020-05-25 01:16:56

标签: interrupt esp32

我正在使用ESP32生成1kHz方波。脉冲幅度由“客户端设备”(此问题的目的是黑框)“修改”。然后,ESP32读取修改后的幅度。脉冲的幅度决定了黑匣子的“状态”。我还应该提到,不必读取每个脉冲,十分可接受。

| ESP32 | -1kHz,0-3.3v-> |客户端设备| -1kHz,0-1 / 2 / 3.3v-> | ESP32 |

所以方波足够简单:

ledcAttachPin(CP_PWM, 0);
ledcWrite(0, Configuration::GetCpPwmDutyCycle());

但是analogRead并不是那么简单...我能想到的最好的是,非常可怕:

delayMicroseconds(300); //Delay a bit to get the analogRead timed with the "high" of the wave

intTimer = timerBegin(0, 80, true);

//Timer to read CP voltage every 10ms
timerAttachInterrupt(intTimer, &read_cp, true);
timerAlarmWrite(intTimer, 10000, true);
timerAlarmEnable(intTimer);

相关的ISR:

void IRAM_ATTR ControlPilot::read_cp(){
  portENTER_CRITICAL_ISR(&ControlPilot::cpLevelMux);
  ControlPilot::lastCpLevel = analogRead(CP_READ); 
  portEXIT_CRITICAL_ISR(&ControlPilot::cpLevelMux);
}

我知道现在有一些问题。

首先,使用delayanalogRead与脉冲“ highs”对齐,充其量是易碎的。

第二,在ISR中执行analogRead可能不是一个好主意。

所以我的问题是:我该如何计时一个引脚(analogRead)上的模拟值,使其与另一个引脚上生成的PWM的“高”值的开始相符?

我想到绕过ledc并安排自己的中断来驱动引脚HIGH和LOW,在 same 中断中,我可以执行analogRead。我不是所有的人都知道这是正确的方法。有什么想法吗?

0 个答案:

没有答案