基于ADS1292芯片的解决方案之源码解析

接口解析
 A 该芯片和主控使用的是SPI接口通信的。
SPI接口一般有四根线,确保四根线准确连接是对的。
B 该芯片可以有中断模式数据触发,所以,主控mcu需要有外部中断处理流程。
       //DRDY中断初始化
      EXTI_ClearITPendingBit(EXTI_Line8);//清除中断标志
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8);//选择管脚
      EXTI_InitStructure.EXTI_Line=EXTI_Line8;                         //选择中断线路
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     //设置为中断请求,非事件请求
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;                         //外部中断使能
      EXTI_Init(&EXTI_InitStructure);     
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                    //选择中断通道
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //抢占优先级 
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //使能外部中断通道
      NVIC_Init(&NVIC_InitStructure); 
配置解析
 A 硬件配置ok之后,就剩下软件了。接下来就是接口的配置信息下发了。上电流程如下所示:
void ADS1292_PowerOnInit(void)
{    

    
//        ADS_CLKSEL=1;//启用内部时钟
//        ADS_START=0; //停止数据输出    
//        ADS_RESET=0; //复位
//        delay_ms(1000);
//        ADS_RESET=1;//芯片上电,可以使用    
//        delay_ms(100);    //等待稳定
    
        ADS1292_Send_CMD(SDATAC);//发送停止连续读取数据命令
        delay_ms(100);    
        ADS1292_Send_CMD(RESET);//复位
        delay_s(1);        
        ADS1292_Send_CMD(SDATAC);//发送停止连续读取数据命令
        delay_ms(100);        
        //ADS1292_Send_CMD(STANDBY);//进入待机模式
}

B 初始化完成之后,就可以进行数据读取和解析了。这部分的数据如下所示:

        while(Set_ADS1292_Collect(0))//0 正常采集  //1 1mV1Hz内部侧试信号 //2 内部短接噪声测试
        {    
//                printf("ADS1292寄存器设置失败\r\n");//串口打印调试使用
                delay_s(1);
                DS3 =!DS3;//PC13端口接LED,用于指示ADS1292 初始化状态
        }

C 该adc有三种数据采集模式,具体如下所示,三种模式,对应的不同调试信息。

//配置ads1292采集方式
u8 Set_ADS1292_Collect(u8 mode)
{
        u8 res;
        
        delay_ms(10);
        switch(mode)//设置采集方式
        {
                case 0:
                    res =ADS1292_Single_Read();
                break;
                case 1:
                    res =ADS1292_Single_Test();
                break;
                case 2:
                    res =ADS1292_Noise_Test();
                break;
        }
        if(res)return 1;            //寄存器设置失败
        ADS1292_Send_CMD(RDATAC);     //启动连续模式
        delay_ms(10);
        ADS1292_Send_CMD(START);    //发送开始数据转换(等效于拉高START引脚)
        delay_ms(10);
        return 0;
}
算法解析
   A 采集到的数据一般需要进行滤波和算法处理,
这里一般需要用到fir滤波器,过滤掉数据过来的噪声信号。
                        //使能FIR带通滤波
                        ecg_fir_res = ecg_fir_tilter(ecg_avr);        //FIR带通滤波    
                        ecg_avr_long=filter1(ecg_fir_res);  //滤除50Hz,1秒滑窗内的平均值,作为去直流的基线
                        ecg_fir_res = ecg_fir_res - ecg_avr_long; //去直流
总结备忘
A 采集到的数据其实需要多种算法滤波处理的。根据不同的应用,需要使用不同的算法的。这个后面根据实际需求再进行分析和解析。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章