我正在使用 esp32-c6 和 ads1292r 来获取心电图数据。我已通过 SPI 成功与 ADS1292R 建立通信,并且能够写入和读取 ADS1292R 寄存器。我还使用 gpio 中断从 ads1292r 接收示例数据。
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时,我可以在不连接机身的情况下从ads1292r接收稳定的数据。但是,当我将采样率设置为250Hz时,我无法获得稳定的数据,并且接收到的数据未对齐且错误。以下是 125Hz 和 250Hz 的图像: 250Hz且数据不稳定 125Hz,数据稳定
我认为这可能是由于 FreeRTOS 任务调度问题造成的,但我不确定也不知道如何解决这个问题。我想实现在 250Hz 下获取正确的数据。如果有人可以提供,我将不胜感激给我一些帮助!
我假设你的 gpio_task 需要很长时间,你正在以 1125200 bps 传输 29 字节 = 290 位(包括开始位 + 停止位),这需要 ~623ms + 3ms 延迟 + 任务切换 +... 我想你的时间已经不多了。为了证明或反驳我的假设,请减少 printf 字符串,例如删除空格。