Fastbond体外测量——EEG脑电波测量
脑部活动的时候,会有微弱的电波产生,将这些生物电采集下来,可以用于脑部活动分析。目前已知δ(1-3Hz)、θ(4-7Hz)、α(8-13Hz)、β(14-30Hz)四种波形段的活动。不同的波段代表不同的活动
标签
嵌入式系统
测试
道之道
更新2021-10-28
1173

脑部活动的时候,会有微弱的电波产生,将这些生物电采集下来,可以用于脑部活动分析。目前已知δ(1-3Hz)、θ(4-7Hz)、α(8-13Hz)、β(14-30Hz)四种波形段的活动。不同的波段代表不同的活动

δ波:频率为1~3Hz,幅度为20~200μV。当人在婴儿期或智力发育不成熟、成年人在极度疲劳和昏睡或麻醉状态下,可在颞叶和顶叶记录到这种波段。

θ波:频率为4~7Hz,幅度为5~20μV。在成年人意愿受挫或者抑郁以及精神病患者中这种波极为显著。但此波为少年(10-17岁)的脑电图中的主要成分。

α波:频率为8~13Hz(平均数为10Hz),幅度为20~100μV。它是正常人脑电波的基本节律,如果没有外加的刺激,其频率是相当恒定的。人在清醒、安静并闭眼时该节律最为明显,睁开眼睛(受到光刺激)或接受其它刺激时,α波即刻消失。

β波:频率为14~30Hz,幅度为100~150μV。当精神紧张和情绪激动或亢奋时出现此波,当人从噩梦中惊醒时,原来的慢波节律可立即被该节律所替代。

核磁共振技术的出现导致EEG逐渐退出了辅助诊断,但是EEG可以配合现在的大数据技术,可以通过测试大量人群的脑电波活动,去发现更多的相关性特征

此工程主要是基于NXP的LPC55S69作为主控,通过SPI采集32Bit的ADC AD7177芯片的数据,将数据计算之后,通过USB FS模拟的串口,将数据发给上位机
使用ADI芯片有
高输入阻抗隔离芯片:AD8244BRMZ

FkYOX8bd72RtB5QeQJSHbPsA8UIN


高精度仪表放大器:AD8422
电源:ADM7151ARDZ、ADR4550BRZ
32Bit 高精度ADC :AD7177

使用Maxim的有
高输入阻抗运放:MAX9636AXT

Fvg_W6-qXxbj80WQHFVVNcMRd3Vp

 

原理图大致如下:

FrSVSdd3kmCN3_WKtnJmMxPnnb8U

 

做好PCB之后,撸捷配的免费做板羊毛做的PCBA如下

FkkmeR0nUep0Zk0aUwl1FXuo653O

 

ADC配置两通道,100Hz连续采样模式,代码:

void EEG_AD7175_Setup(void)
{
	ad717x_st_reg *ReadReg;
	AD717X_Init(&EEG_AD7177,EEG_ad7175_2_regs,27);
/**************** ADC MODE *****************/

	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_ADCMODE_REG);
	ReadReg->value=AD717X_ADCMODE_REG_REF_EN | AD717X_ADCMODE_REG_MODE(0) | AD717X_ADCMODE_REG_CLKSEL(3);
	AD717X_WriteRegister(EEG_AD7177,AD717X_ADCMODE_REG);
	
/**************Interface MODE******************/
	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_IFMODE_REG);
	ReadReg->value=AD717X_IFMODE_REG_DATA_WL32;
	AD717X_WriteRegister(EEG_AD7177,AD717X_IFMODE_REG);
	
/**************** CH 0 *****************/
	/********AD717X_Channel0_REG*********/ //
	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_CHMAP0_REG);//Setup 0;AIN0 +;AIN1 -
	ReadReg->value=AD717X_CHMAP_REG_CH_EN | AD717X_CHMAP_REG_SETUP_SEL(0) | AD717X_CHMAP_REG_AINPOS(0) | AD717X_CHMAP_REG_AINNEG(1);
	AD717X_WriteRegister(EEG_AD7177,AD717X_CHMAP0_REG);
	/********AD717X_SETUPCON0_REG*********/ //disable buff;ext Vref;
	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_SETUPCON0_REG);
	ReadReg->value=AD717X_SETUP_CONF_REG_BI_UNIPOLAR | AD717X_SETUP_CONF_REG_AIN_BUF(3) | AD717X_SETUP_CONF_REG_REF_SEL(0);
	AD717X_WriteRegister(EEG_AD7177,AD717X_SETUPCON0_REG);
	/**********AD717X_FILTCON0_REG**********/	//Sinc1+5;
	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_FILTCON0_REG);
//	ReadReg->value=AD717X_FILT_CONF_REG_ENHFILTEN | AD717X_FILT_CONF_REG_ENHFILT(5) | AD717X_FILT_CONF_REG_ODR(0x0a);//1000 SPS;
	ReadReg->value=AD717X_FILT_CONF_REG_ODR(0x0e);//100 SPS
	AD717X_WriteRegister(EEG_AD7177,AD717X_FILTCON0_REG);

	/**************** CH 1 *****************/
	/********AD717X_Channel1_REG*********/ //
	ReadReg=AD717X_GetReg(EEG_AD7177,AD717X_CHMAP1_REG);//Setup 1;AIN2 +;AIN3 -
	ReadReg->value=AD717X_CHMAP_REG_CH_EN | AD717X_CHMAP_REG_SETUP_SEL(0) | AD717X_CHMAP_REG_AINPOS(2) | AD717X_CHMAP_REG_AINNEG(3);
	AD717X_WriteRegister(EEG_AD7177,AD717X_CHMAP1_REG);


}

 

ADC采集的时候,不停的查询ADC转换是否完成,如果是,就判断是那个通道的数据,再将数据寄存器里的值通过SPI读取出来,并计算为浮点数

FtbvH6aVBOhwvYc4lkGcTpAP4b35

 

void AD7177_Voltage_Cal(int32_t *input,float *output)
{
	uint32_t *p;
	p=input;
	if(*p<0x80000000)
	{
		*output=(float)(*p)/2147483648*EEG_AD7177_Reference*1000/969.627;
	}
	else
	{
		*output=-(float)(*p-0x80000000)/2147483648*EEG_AD7177_Reference*1000/969.627;
	}

}
uint8_t AD7177_ReadNewDataStatus(void)
{
	ad717x_st_reg *adc_status;
	AD717X_ReadRegister(EEG_AD7177,AD717X_STATUS_REG);
	adc_status=AD717X_GetReg(EEG_AD7177,AD717X_STATUS_REG);
	if((adc_status->value & AD717X_STATUS_REG_RDY)==0x00)
	{
		if((adc_status->value & AD717X_STATUS_REG_CH(1))==AD717X_STATUS_REG_CH(1))
		{
			return 2;
		}
		else if((adc_status->value & AD717X_STATUS_REG_CH(2))==AD717X_STATUS_REG_CH(2))
		{
			return 3;
		}
		else if((adc_status->value & AD717X_STATUS_REG_CH(3))==AD717X_STATUS_REG_CH(3))
		{
			return 4;
		}
		else
		{
			return 1;
		}
	}
	else
	{
		return 0;
	}

}
void AD7177_Voltage_Read_Single(float *volt)
{
	int32_t data;
	AD717X_ReadData(EEG_AD7177,&data);
	AD7177_Voltage_Cal(&data,volt);
}
int main(void) {


    /* Init board hardware. */
	uint8_t Hello_World_CDC[]="Hello World,CDC\r\n";
//	uint32_t AD7177_ID;
	uint8_t ch;
	float volt;
    BOARD_InitBootPins();
    BOARD_InitBootClocks();
    BOARD_InitBootPeripherals();
#ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    /* Init FSL debug console. */
    BOARD_InitDebugConsole();
#endif
    if (SysTick_Config(SystemCoreClock / 1000U))
    {
    	while (1)
    	{
    	}
    }

    EEG_AD7175_Setup();
    PRINTF("Hello World\r\n");
    MessageSend("%s",Hello_World_CDC);

    /* Force the counter to be placed into memory. */
    volatile static int i = 0 ;

    /* Enter an infinite loop, just incrementing a counter. */
    while(1) {
        i++ ;
        GPIO_PortToggle(BOARD_INITLEDSPINS_LED_BULE_GPIO, BOARD_INITLEDSPINS_LED_BULE_PORT, 1<<BOARD_INITLEDSPINS_LED_BULE_PIN);
        /* 'Dummy' NOP to allow source level single stepping of
            tight while() loop */
        __asm volatile ("nop");
        //USB_DeviceInterface0CicVcomTask();
        ch=AD7177_ReadNewDataStatus();
        if(ch==1)
        {
        	AD7177_Voltage_Read_Single(&volt);
        	//MessageSend("Voltage(uV):%f,",volt);
        	MessageSend("%f,",volt);
        //	PRINTF("%FmV\r\n",volt);
        }
        if(ch==2)
        {
        	AD7177_Voltage_Read_Single(&volt);
        	MessageSend("%f\n",ch,volt);
        }
        /*
        AD7177_ID=AD7177_Read_ChipID();
        MessageSend("AD7177 ID:0x%X\r\n",AD7177_ID);

        SysTick_DelayTicks(1000U);
        */
    }
    return 0 ;
}

 

LPC55S69将数据读取之后,通过USB模拟串口,将数据传给电脑。我使用Vofa+来接受数据,并通过图像界面来显示波形,单位uV

FjVAWzsqfVEGmWXiosHJPLbIfVub

 

此次使用的ADI的AD8244和Maxim的MAX9363都是有高输入阻抗,低输入电流的运放。这种芯片有效的限制了通过人体的电流,保证人体测试时,被测试者的人生安全。非常适合人体测量方面的应用。不过它们的输出偏置就不太理想,后续需要再进行处理

附件下载
EEG.pdf
原理图
Hello_World.zip
团队介绍
道之道:一名爱玩的电子工程师
团队成员
道之道
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号