You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:05:04