esp32c3 使用esp now 发送数据干扰adc采集的数据
Posted: Sat Aug 26, 2023 8:58 pm
你好,
我正在尝试使用esp32c3测试同时使用adc和esp now功能,使用adc1 + continuous dma 循环采集麦克风数据,每次采集后通过esp now发送出去。
核心逻辑代码如下:
发现的问题是如果每次采集后通过esp now广播数据,那么采集的adc数据就会有部分数据异常,如果每次循环只采集数据不发送,那么adc采集的音频数据就正常。目测是无线功能对adc造成了干扰。
进行过尝试:
在broadcast函数前后加一定时间的延时,任然观测到干扰,
使用一定时间延时代替broadcast函数,任然观测到干扰,
broadcast函数之前停止adc采集,并且在发送后再次开启,任然团测到干扰。
可视化数据如下,图中包含前8000个采样点,采样频率8khz,每次dma采集完200采样点后触发回调函数,可明显观察到每组采样点里都有少量异常点,如图中红圈所示。将所有采样点通过i2s进行播放,会有嘟嘟嘟的噪声几乎掩盖掉人声。
原始数据: 编译环境: Windows + VSCode + PlatformIO + IDF. (PlatformIO version: Core 6.1.10·Home 3.4.4, Espressif 32 version: 6.3.2)
开发板: ESP32-C3-DevKitM-1
麦克风: MAX4466模块
扬声器: MAX98357A模块
工程文件链接:https://github.com/xiaochutan123l/DetectiveBadge
硬件图:
我想问一下无线传输对adc采集的干扰是正常的吗,如果是,那么有什么办法可以避免干扰吗?非常感谢!
我正在尝试使用esp32c3测试同时使用adc和esp now功能,使用adc1 + continuous dma 循环采集麦克风数据,每次采集后通过esp now发送出去。
核心逻辑代码如下:
Code: Select all
while(count < sample_size) {
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
memset(read_buf, '\0', read_buf_len);
uint32_t ret_num = mic_adc_read_continuous(read_buf, read_buf_len);
//mic_adc_continuous_stop();
for (int i = 0; i < ret_num; i += SOC_ADC_DIGI_RESULT_BYTES) {
adc_digi_output_data_t *p = (adc_digi_output_data_t*)&read_buf[i];
// TODO: check channel infos if needed.(i.e. multiple adc channel are used.)
play_buf[count] = p->type2.data >> 4;
count++;
}
//ets_delay_us(100);
broadcast(play_buf + count - 200, 200);
//ets_delay_us(100);
//mic_adc_continuous_start();
}
进行过尝试:
在broadcast函数前后加一定时间的延时,任然观测到干扰,
使用一定时间延时代替broadcast函数,任然观测到干扰,
broadcast函数之前停止adc采集,并且在发送后再次开启,任然团测到干扰。
可视化数据如下,图中包含前8000个采样点,采样频率8khz,每次dma采集完200采样点后触发回调函数,可明显观察到每组采样点里都有少量异常点,如图中红圈所示。将所有采样点通过i2s进行播放,会有嘟嘟嘟的噪声几乎掩盖掉人声。
原始数据: 编译环境: Windows + VSCode + PlatformIO + IDF. (PlatformIO version: Core 6.1.10·Home 3.4.4, Espressif 32 version: 6.3.2)
开发板: ESP32-C3-DevKitM-1
麦克风: MAX4466模块
扬声器: MAX98357A模块
工程文件链接:https://github.com/xiaochutan123l/DetectiveBadge
硬件图:
我想问一下无线传输对adc采集的干扰是正常的吗,如果是,那么有什么办法可以避免干扰吗?非常感谢!