基于stm32的心电呼吸波型信号采集方案解析

一 概述

  在生物电信号采集领域,心电和呼吸信号是一个非常重要的参数。团队在作该类方案的时候,针对ads1292的心电呼吸信号采集作了很多研究。也踩坑无数。这里做一个总结和备忘。

二 硬件设计

  1.ads1292的硬件原理图网上资料比较多。这个要谨慎区分,最好是看官方的手册,笔者所整理的原理图如下所示:

  2.注意事项:

  A. 为了尽量减少干扰,模拟地和数字地尽量解耦。

  B. reset不用的时候不要悬空,否则会出现读不到ID的情况。

  C.start信号不用的情况下接到GND。不要悬空,否则会出现无中断产生。

三 软件解析

 1.该部分的软件一般是分为两个部分,一个是读取状态信息,源码如下:


void ads1292_init(void)
{
	uint8_t id;

	Ads1292_Reset();
	osDelay(10);
    mprintf("aa ads_rx_irq_cnt is: %d \n\r", ads_rx_irq_cnt);

	ADS1292_poweron_init();
	osDelay(10);

    mprintf("ss ads_rx_irq_cnt is: %d \n\r", ads_rx_irq_cnt);

	// 0 is 125 sps 1 is 250 sps 2 is 500 sps 3 is 1k sps 4 is 2k sps 5 is 4k sps 6 is 8k sps
	ADS_1292_WREG(ADS1292_REG_CONFIG1, 0x00);//Set sampling rate to 125 SPS
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_CONFIG2, 0xA0);//Lead-off comp off,0
	id = ADS_1292_RREG(ADS1292_REG_CONFIG2);
	mprintf("ads1292 CFG2=%#X\r\n", id);
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_LOFF, 0x10);//Lead-off defaults
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_CH1SET, 0x00);//Ch 1 enabled, gain 1
	id = ADS_1292_RREG(ADS1292_REG_CH1SET);
	mprintf("ads1292 CH1SET is=%#X\r\n", id);
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_CH2SET, 0x00);    //Ch 2 enabled, gain 1
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_RLDSENS, 0x00);   //RLD settings: off
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_LOFFSENS, 0x00);          //LOFF settings: all disabled
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_RESP1, 0xc2);             //Respiration: MOD/DEMOD turned only, phase 0
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_RESP2, 0x03);             //Respiration: Calib OFF, respiration freq defaults
	osDelay(10);
	ADS_1292_WREG(ADS1292_REG_GPIO, 0x0C);              //GPIO input
	osDelay(10);


	id = ADS_1292_RREG(ADS1292_REG_ID);
	mprintf("ads1292r ID=0x%x\r\n", id);
	mprintf("ads1292 (01 is ads1292 10 is ads1291 11 is ads1292 or ads1292r)ID=0x%x\r\n", id & 0x03);


	for (uint32_t i = 0; i < 10; i++)
	{
		/* code */
		uint8_t temp_val = ADS_1292_RREG(i);
		mprintf("ads read addr is:0x%x val is:0x%x \n\r",i,temp_val);

	}

	// hardware controller 
	//Ads1292_Enable_Start();

	ads1292_data_start();

}

  2.另外一个是数据获取的源码,如下所示:

/**
  * @brief This function handles EXTI line1 interrupt.
  */
void EXTI1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI1_IRQn 0 */

	HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
	if(HAL_SPI_TransmitReceive_DMA(&hspi1, ADS1299_Txbuffer, ADS1299_Rxbuffer, 3+RX_ADS_NUM)!=HAL_OK)
	{
	  __set_FAULTMASK(1);
	  HAL_NVIC_SystemReset();
	}
	 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);

  /* USER CODE END EXTI1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI1_IRQn 1 */

  /* USER CODE END EXTI1_IRQn 1 */
}

四 总结展望

    其实,生理信号采集有着一整套的逻辑和次序,任何一个环节出错,采集到的数据可能会出现异常。这个无他方法,唯手熟尔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值