来源:http://blog.csdn.net/devintt/article/details/72639993
随着人们越来越重视医疗健康,相对应的产品也随之推出。TI就很好的走在前面,对于生理信号采集方面不仅推出了ADS124x系列和ADS129x系列,也推出了集成了光传感器AFE系列。
AFE4400 是一款非常适合于脉冲血氧仪应用的完全集成模拟前端 (AFE)。 此器件包含一个具有集成模数转换器 (ADC) 的低噪声接收器通道、一个 LED 发射部件和针对传感器以及 LED 故障检测的诊断功能。
数据手册介绍到此结束。不废话,接下来介绍电路原理图。原理图也是根据数据手册的典型应用得到的。两个红光和红外LED选用的是DCM05(或者DCM03)
NRST为芯片复位,低电平有效,复位后需要重新配置寄存器。
PD_ALM为光电传感器断开信号,LED_ALM为LED断开信号,DIAG_END是检测终了信号,这3个信号可连接单片机,用于检测器件的连接情况。
AFE_PDN为低功耗引脚,低电平有效。
ADC_RDY为信号采集并转换完成,此时可通过SPI读取转换结果。
PCB布局也非常简单,左边芯片为AFE4400,右边的芯片是stm8L151.
程序方面主要讲一下寄存器配置和数据读取。
-
void AFE4404_Set_Value(void)
-
{
-
//AFE4400_Set_Register(CONTROL0, 0x04);
-
AFE4400_Set_Register(LED2STC, 6050);
-
AFE4400_Set_Register(LED2ENDC, 7998);
-
AFE4400_Set_Register(LED2LEDSTC, 6000);
-
AFE4400_Set_Register(LED2LEDENDC, 7999);
-
AFE4400_Set_Register(ALED2STC, 50);
-
AFE4400_Set_Register(ALED2ENDC, 1998);
-
AFE4400_Set_Register(LED1STC, 2050);
-
AFE4400_Set_Register(LED1ENDC, 3998);
-
AFE4400_Set_Register(LED1LEDSTC, 2000);
-
AFE4400_Set_Register(LED1LEDENDC, 3999);
-
AFE4400_Set_Register(ALED1STC, 4050);
-
AFE4400_Set_Register(ALED1ENDC, 5998);
-
AFE4400_Set_Register(LED2CONVST, 4);
-
AFE4400_Set_Register(LED2CONVEND, 1999);
-
AFE4400_Set_Register(ALED2CONVST, 2004);
-
AFE4400_Set_Register(ALED2CONVEND, 3999);
-
AFE4400_Set_Register(LED1CONVST, 4004);
-
AFE4400_Set_Register(LED1CONVEND, 5999);
-
AFE4400_Set_Register(ALED1CONVST, 6004);
-
AFE4400_Set_Register(ALED1CONVEND, 7999);
-
-
AFE4400_Set_Register(ADCRSTSTCT0, 0);
-
AFE4400_Set_Register(ADCRSTENDCT0, 3);
-
AFE4400_Set_Register(ADCRSTSTCT1, 2000);
-
AFE4400_Set_Register(ADCRSTENDCT1, 2003);
-
AFE4400_Set_Register(ADCRSTSTCT2, 4000);
-
AFE4400_Set_Register(ADCRSTENDCT2, 4003);
-
AFE4400_Set_Register(ADCRSTSTCT3, 6000);
-
AFE4400_Set_Register(ADCRSTENDCT3, 6003);
-
-
AFE4400_Set_Register(PRPCOUNT, 7999);
-
-
AFE4400_Set_Register(CONTROL1, 0x100);
单片机用郭天祥的买个锐志单片机开发板,他们的程序写的很好,但是也要用郭天祥的教程,学半年左右,到了i2c之后,再就是液晶显示之后就可以开始嵌入式学习了。可以用韦山东的嵌入式开发板学习。
-
// AFE4400_Set_Register(TIA_AMB_GAIN, 0x004481);
-
AFE4400_Set_Register(TIA_AMB_GAIN, 0x004141);
-
AFE4400_Set_Register(LEDCNTRL, 0x8F8F);
-
AFE4400_Set_Register(CONTROL2, 0x100);
-
}
前面的寄存器是配置芯片的时序的,这里的配置使用的是官方手册给的数值,这里不做讨论,详细意思在手册上能查阅。由于我们使用的是8M的晶振,寄存器PRPCOUNT的值为7999,意味着一个周期为1ms,这里采样率为1000Hz,对于采集血氧饱和度足矣。
AFE4400读取寄存器的方式有些特别,根据手册所述需要设置CONTROL0的读写位之后才能读取数据。
-
void AFE4400_Set_READABLE(u8 isReadable)
-
{
-
SPI_WriteByte(CONTROL0); //写入寄存器地址
-
SPI_WriteByte(0x00);
-
SPI_WriteByte(0x00);
-
SPI_WriteByte(isReadable);
-
}
-
-
u32 AFE4400_Read_Register(u8 reg_address)
-
{
-
u32 temp0=0, temp1=0, temp2=0;
-
u32 temp=0;
-
-
AFE_CS_L;
-
AFE4400_Set_READABLE(1);
-
-
SPI_WriteByte(reg_address); //写入寄存器地址
-
temp0 = SPI_ReadByte();
-
temp1 = SPI_ReadByte();
-
temp2 = SPI_ReadByte();
-
AFE_CS_H;
-
-
temp = temp0<<16 | temp1<<8 | temp2;
-
return temp;
-
}
-
-
void AFE4400_Set_Register(u8 reg_address, u32 data)
-
{
-
AFE_CS_L;
-
AFE4400_Set_READABLE(0);
-
-
SPI_WriteByte(reg_address); //写入寄存器地址
-
SPI_WriteByte((data>>16)&0xFF);
-
SPI_WriteByte((data>>8)&0xFF);
-
SPI_WriteByte((data)&0xFF);
-
AFE_CS_H;
-
}
数据读取通过ADC_RDY信号的下降沿触发之后使用SPI读取。
通过蓝牙发送到手机编写的APP中,画图显示波形。
最后附上驱动代码:http://download.csdn.net/detail/devintt/9849976
确定后,我们就可以单击下载了。说了这么多,主要是有好些朋友依然没有试过下载到真正的单片机中测试,希望看完之后,自己尝试下,会发现,仿真和现实还是不一样的。