如何用AutoAnalogAudio录制ADC1_channel_5并读取ADC1_channel_0及解决相关问题
解决方案:ESP32使用AutoAnalogAudio库的问题处理
1. 同时录制ADC1_CH5并读取ADC1_CH0(引脚36)
AutoAnalogAudio库录制时会独占ADC资源,直接混用analogRead会引发冲突,正确操作流程如下:
- 初始化库时仅指定录制通道(ADC1_CH5),不包含通道0
- 在录制间隙手动切换ADC复用模式,读取通道0后切回录制状态
- 示例代码片段:
#include <AutoAnalogAudio.h> AutoAnalogAudio recorder(AUTO_ANALOG_AUDIO_ADC1_CH5); // 仅初始化录制通道 void setup() { Serial.begin(115200); recorder.begin(); } void loop() { // 暂停录制,释放ADC资源 recorder.end(); // 读取引脚36(ADC1_CH0) int ch0Value = analogRead(36); Serial.print("ADC1_CH0 value: "); Serial.println(ch0Value); // 重新启动录制 recorder.begin(); // 录制一段数据(按需调整时长) delay(100); }
2. 修复disableAdcChannel()编译错误
错误根源是库代码未正确引入ESP32的ADC驱动头文件,导致ADC对象未在作用域中,可通过两种方式解决:
- 临时绕过:放弃调用
disableAdcChannel(),改用recorder.end()终止录制,此时ADC会自动释放,可正常调用analogRead - 永久修复库文件:打开
AutoAnalogAudio.cpp,在文件顶部添加头文件引用:
#include "driver/adc.h"
3. 解决analogRead导致设备冻结问题
冻结由AutoAnalogAudio与ESP32原生ADC驱动的资源竞争导致,需严格遵循资源互斥规则:
- 录制过程中绝对不能调用
analogRead,必须先调用recorder.end()释放ADC - 读取普通ADC通道后,必须重新调用
recorder.begin()恢复录制 - 禁止在中断函数中调用
analogRead或录制相关方法,避免资源冲突
内容的提问来源于stack exchange,提问作者Jester48
相关产品推荐
相关产品推荐

