一 概述
在生物电信号采集领域,心电和呼吸信号是一个非常重要的参数。团队在作该类方案的时候,针对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 */
}
四 总结展望
其实,生理信号采集有着一整套的逻辑和次序,任何一个环节出错,采集到的数据可能会出现异常。这个无他方法,唯手熟尔。