我正在使用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);
}
我知道现在有一些问题。
首先,使用delay
将analogRead
与脉冲“ highs”对齐,充其量是易碎的。
第二,在ISR中执行analogRead
可能不是一个好主意。
所以我的问题是:我该如何计时一个引脚(analogRead
)上的模拟值,使其与另一个引脚上生成的PWM的“高”值的开始相符?
我想到绕过ledc
并安排自己的中断来驱动引脚HIGH和LOW,在 same 中断中,我可以执行analogRead
。我不是所有的人都知道这是正确的方法。有什么想法吗?