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

ESP32-C6基于ESP-IDF驱动ADS1292R 250Hz采样数据异常求助

ESP32-C6 + ADS1292R 250Hz采样率数据错位问题求助

我正在使用ESP32-C6与ADS1292R采集ECG数据,已通过SPI成功建立通信,可读写ADS1292R寄存器,并采用GPIO中断接收采样数据。当采样率设置为125Hz时,未连接人体也能稳定接收数据;但设置为250Hz时,无法获取稳定数据,接收的数据出现错位错误。

相关代码如下:

static void IRAM_ATTR gpio_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

static void gpio_task(void *arg)
{
    uint32_t io_num;
    uint8_t val[9] = {0};
    for (;;)
    {
        if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY))
        {
            for (int i = 0; i < 9; i++)
            {
                val[i] = ads1292r_receive_data(spi_handle);
            }
            printf("%x %x %x %x %x %x %x %x %x\n", val[0], val[1], val[2],
                   val[3], val[4], val[5],
                   val[6], val[7], val[8]);
            usleep(3000);
        }
    }
}

void app_main(void)
{
    // gpio config
    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_INTR_DISABLE;
    io_conf.mode = GPIO_MODE_OUTPUT;
    io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 0;
    gpio_config(&io_conf);
    io_conf.mode = GPIO_MODE_INPUT;
    io_conf.pin_bit_mask = BIT64(GPIO_DRDY);
    io_conf.pull_down_en = 0;
    io_conf.pull_up_en = 1;
    io_conf.intr_type = GPIO_INTR_NEGEDGE;
    gpio_config(&io_conf);

    // gpio isr
    gpio_evt_queue = xQueueCreate(100, sizeof(uint32_t));
    xTaskCreate(gpio_task, "gpio_task", 4096, NULL, 15, NULL);
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
    gpio_isr_handler_add(GPIO_DRDY, gpio_isr_handler, (void *)GPIO_DRDY);

    // uart config
    uart_config_t uart_config = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_DEFAULT,
    };
    uart_driver_install(UART_NUM_0, 512 * 2, 0, 0, NULL, 0);
    uart_param_config(UART_NUM_0, &uart_config);
    uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    // spi config
    spi_bus_config_t spi_bus_cfg = {
        .mosi_io_num = GPIO_MOSI,
        .miso_io_num = GPIO_MISO,
        .sclk_io_num = GPIO_SCLK,
        .quadhd_io_num = -1,
        .quadwp_io_num = -1,
    };
    spi_bus_initialize(SPI2_HOST, &spi_bus_cfg, SPI_DMA_CH_AUTO);
    spi_device_interface_config_t dev_cfg = {
        .clock_speed_hz = 1 * 1000 * 1000,
        .mode = 1,
        .spics_io_num = -1,
        .queue_size = 1,
    };
    spi_bus_add_device(SPI2_HOST, &dev_cfg, &spi_handle);

    ads1292r_init(spi_handle);
}

数据表现

  • 125Hz采样率:数据输出稳定,无错位
  • 250Hz采样率:数据出现错位,无法稳定获取有效数据

我怀疑这可能与FreeRTOS任务调度有关,但不确定具体原因,也不知道如何解决。希望能实现250Hz下获取正确数据,恳请各位提供帮助!

内容的提问来源于stack exchange,提问作者WeiShx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:20:31