乐鑫技术交流
直播中

张伟

7年用户 1645经验值
私信 关注
[问答]

ESP32 WROVER IDF使用i2s_adc读取电压时,打印数据都是0,如何才能读到正确的电压值?


目前我使用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)

吴凡

2024-6-19 16:33:12
首先,我们需要确保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读取方法。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分