完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目前我使用ESP32 WROVER IDF 参考官方例程i2s_adc_dac读取电压时,打印数据都是0。代码如下: void init_i2s() { i2s_config_t i2s_config; i2s_config.mode = I2S_MODE_MASTER | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN; i2s_config.sample_rate = I2S_SAMPLE_RATE; i2s_config.dma_buf_len = I2S_BUFFER; i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT; //i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT; i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT; i2s_config.use_apll = false; i2s_config.communication_format = I2S_COMM_FORMAT_PCM; i2s_config.intr_alloc_flags = 0; i2s_config.dma_buf_count = 5; // install and start i2s driver ESP_ERROR_CHECK( adc_gpio_init(ADC_UNIT_1, ADC_CHANNEL_0) ); ESP_ERROR_CHECK( i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL) ); ESP_ERROR_CHECK( i2s_set_adc_mode(ADC_UNIT_1, ADC1_CHANNEL_0) ); ESP_ERROR_CHECK( i2s_adc_enable(I2S_NUM_0) ); } void sample_i2s() { ESP_LOGI(TAG, "Task called."); //uint16_t i2s_buff[I2S_BUFFER]; int i2s_read_len = I2S_BUFFER; char* i2s_buff = (char*) calloc(i2s_read_len, sizeof(char)); size_t bytes_read = 0; //ESP_ERROR_CHECK( i2s_read(I2S_NUM_0, (void*) i2s_buff, i2s_read_len, &bytes_read, portMAX_DELAY) ); int error=i2s_read(I2S_NUM_0, (void*) i2s_buff, i2s_read_len, &bytes_read, portMAX_DELAY); printf("error=%d rn",error); //error=0 for(int i=0;i |
|
相关推荐
1个回答
|
|
首先,我们需要确保ESP32 WROVER IDF环境已经正确配置。接下来,我们将逐步分析和解决问题。
1. 检查硬件连接:确保ESP32 WROVER模块与ADC输入引脚正确连接,并且输入电压在允许的范围内。 2. 检查I2S配置:在`init_i2s()`函数中,确保I2S配置正确。根据您的代码,配置看起来是正确的,但我们还需要检查其他参数。 3. 初始化I2S:在`init_i2s()`函数中,调用`i2s_driver_install()`函数以安装I2S驱动。 ```c i2s_driver_install((i2s_port_t)I2S_NUM, &i2s_config, 0, NULL); ``` 4. 读取I2S数据:创建一个函数来读取I2S数据,并将其转换为电压值。 ```c float read_voltage() { int data = 0; if (i2s_read_bytes((i2s_port_t)I2S_NUM, (char *)&data, sizeof(data), portMAX_DELAY) != sizeof(data)) { return 0; } return (data * 3.3) / 32768; // 将ADC值转换为电压值 } ``` 5. 打印电压值:在主循环中,定期调用`read_voltage()`函数并打印电压值。 ```c void app_main() { init_i2s(); vTaskDelay(100 / portTICK_PERIOD_MS); // 等待I2S初始化完成 while (1) { float voltage = read_voltage(); printf("Voltage: %.3f Vn", voltage); vTaskDelay(1000 / portTICK_PERIOD_MS); // 每秒读取一次 } } ``` 6. 检查电源:确保ESP32 WROVER模块的电源稳定,因为电源不稳定可能导致ADC读取错误。 7. 检查I2S_SAMPLE_RATE和I2S_BUFFER:根据您的实际需求调整这些参数,以获得最佳性能。 通过以上步骤,您应该能够读取到正确的电压值。如果问题仍然存在,请检查硬件连接和电源,或者尝试使用其他ADC读取方法。 |
|
|
|
只有小组成员才能发言,加入小组>>
474浏览 6评论
397浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
378浏览 5评论
383浏览 4评论
354浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-28 18:06 , Processed in 0.773141 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号