TI的ECG集成模拟前端ADS119x开发心得(AS1194/6/8)
2012-06-21 11:02
267 查看
这是从TI支持社区发现的一篇文章,自己最近正好学习,这方面的资料很少,于是把它转过来,大家一起学习。文中的时钟设置我用STM32测试ADS119x的手册推荐设置是没问题的,可能和具体的MCU有关吧。
ADS119x初始化使用原作者时序很好,我刚开始的时候没有初始化好,结果SPI读出的数据全部为零,学习的同胞们注意一下。
ADS1198/ADS1298开发设计心得与遗留问题总结
首先非常感谢TI公司的支持,自己手里面的6片ADS1198全部是从TI公司申请到的,并且遇到问题后能TI的技术支持工程师能及时给出解答,所以写这篇文章,一是对自己这几个月工作的总结,二是也算是对TI公司的感谢,也希望能帮助到以后使用ADS1198/1298的朋友。
本人使用MSP430F5418与ADS1198设计12导心电监测仪,其实就是个低档的HOLTER,在HOLTER的基础上加了几个操作按键和LCD显示屏。历时3个多月,前几天算是能比较满意的用ADS1198采集到ECG信号了!现在简单说下开发过程以及遇到的一些问题。
先说下MSP430单片机,本人01年开始使用(那是还是大四),先后使用过1100,135,149,2418等型号,这次选用了5418,因为信价比高,等开始实际调试使用时,才发现5418与之前的型号有很多升级。增加了几个功能模块同时也整合了一些功能模块。比如SYS模块,PMM模块,UCS模块等(还有一些功能由于没用上也没研究),这几个模块我看了很长时间英文资料(英文水平不咋地)后,发现SYS和PMM模块对我根本就没有用,并且把PMM模块关掉了,增加了这些模块视乎能提高430的安全性,但我觉得430这种单片机由于设计宗旨是低功耗3V供电。所以一般都是采用电池供电的,加上这2个模块似乎意义不大。反而与之前的型号兼容性不好了!
本人在做这款12导心电监测仪之前搞过1年多心电,只用运放做过9导心电监测仪,所以在ECG方面的经验还是很少的,发现这款ADS1198芯片还是在电源网上看到的,申请到样片后,手册和开发指南看了不下七八遍才基本理解明白,现在说说自己曾经迷糊而后来解决以及仍没解决的问题列出来:
1.ADS1198有16位AD,可是PGA增益最大只有12,没有二级放大,对于ECG信号最大幅值在5mV左右,经过12倍放大为60MV, 60/2400*65536=1638,即只要用12位就能标示出ECG信号了,也就是说浪费掉了4位AD,如果用ADS1298也会同样出现这种情况,只是会比1198精确些而已,如果用ADS1198/1298测量EEG信号,EEG信号是uV级的,真不能能不能用啊!
2. 请看手册第12页,这里的这幅图下面的NOTE写着SPI CPOL=0,CPHA=1,但是实际在调试程序时我发现这里应该设置为CKPH=0,CKPL=0.
3.册20页的公共点参考电压的公式似乎也由点问题,这里是AVDD-0.2V我觉得不对,应该是VREF+,因为如果按以上公式计算出的公共参考电压,有可能最大幅值超过VREF+,也就是AD不能正确的采集出实际数值。
4.手册第19页中设置CHNSET[2:0]=011时,1,2,5,6,7,8是用来测量AVDD/2,而3,4是用来测量DVDD/2,我设计的电路板是AVDD与DVDD电压相同,通过磁珠连接,结果测试出来的数据1,2,5,6,7,8 比我计算的理论数据差了10000多,而3.4比理论数据差了1000多,这两组之间也差了10000多,这个问题我现在也没搞明白,请TI的工程师和使用过的朋友解答一下吧。
5.当我用心电模拟仪输入信号时,(我的设计中1,2,3,4,5,6,7,8分别对应II,III,V1,V2,V3,V4,V5,V6),发现但我设置8个通道检测导联脱落时(即设置LOFF_SENSP=0XFF, LOFF_SENSN=0XFF),II,III的基线与V1,V2,V3,V4,V5,V6相差10000多,如果设置LOFF_SENSP=0X00, LOFF_SENSN=0X00时,即不检测导联脱落时,II,III,V1,-V6就在同一基线上了。这个也没搞明白。有待朋友们解答。
6.当心电模拟仪测试信号好用后,我实测人体信号,发现各路信号基线都不一致,我调试了半个月也没调出来,(我的设计基本上是抄TI的设计指南里的原理图的,我也明白为什么TI设计指南里为什么没有给出实测人体信号!,估计它的板子也一样有这个问题),后来请教TI的技术支持工程师JHL老师,他说要加高通滤波器,后来我在输入进ADS1198前加了各种高通滤波器,发现最实用的竟然是用0.1UF加10M电阻,这样这8路信号基本上在一条直线上了,(V1偏差大一点与其他的基线差100左右),但加了电阻电容滤波后,用心电模拟仪再测量时,原本一致的基线现在反而有偏差了,我是搞糊涂了!另外今天刚看到JHL老师的回复,说他说的加高通滤波实际上是软件滤波,如果是这样的话,看来我用430就不行了,应该改DSP做FFT变换吧!
总结一下,ADS1198/1298的确集成了很多ECG电路,比如8路仪表放大,威尔逊网络,内部测试信号,导联脱落检测(我用着不好使,呵呵)等等,而且也降低了功耗,节省了成本。是做便携式设备很好的选择,但问题也很大,内部只有前级放大,没有加二级放大,同时由于集成度太高,仪表放大后直接进AD,不能加高通,低通,以及抗肌电干扰等电路。这些工作恐怕全部要留给上位机用软件来解决,至于能解决到什么程度,我就不知道了!
以上就是个人使用ADS1198/1298的一些心得,能解决的问题以及遗留的问题,由于本人能力有限,估计会有很多错误和误解。以上所写,仅供大家参考,谢谢!
作者:liangzuolin
一下附上我用430开发的程序,已经调试通过,仅供参考!
#define ADS1198_CS0 P3OUT &= ~BIT0
#define ADS1198_CS1 P3OUT |= BIT0
#define ADS1198_START0 P2OUT &= ~BIT5
#define ADS1198_START1 P2OUT |= BIT5
#define ADS1198_RST0 P2OUT &= ~BIT6
#define ADS1198_RST1 P2OUT |= BIT6
#define ADS1198_PWDN0 P2OUT &= ~BIT4
#define ADS1198_PWDN1 P2OUT |= BIT4
#define ADS1198_READY (P2IN&0x40)
#define RDATAC 0x10
#define SDATAC 0x11
#define FALSE 0
#define TRUE 1
#define Addr_ID 0x00
#define Addr_CONFIG1 0x01
#define Addr_CONFIG2 0x02
#define Addr_CONFIG3 0x03
#define Addr_LOFF 0x04
#define Addr_CH1SET 0x05
#define Addr_CH2SET 0x06
#define Addr_CH3SET 0x07
#define Addr_CH4SET 0x08
#define Addr_CH5SET 0x09
#define Addr_CH6SET 0x0A
#define Addr_CH7SET 0x0B
#define Addr_CH8SET 0x0C
#define Addr_RLD_SENSP 0x0D
#define Addr_RLD_SENSN 0x0E
#define Addr_LOFF_SENSP 0x0F
#define Addr_LOFF_SENSN 0x10
#define Addr_LOFF_FLIP 0x11
#define Addr_LOFF_STATP 0x12
#define Addr_LOFF_STATN 0x13
#define Addr_GPIO 0x14
#define Addr_PACE 0x15
#define Addr_CONFIG4 0x17
#define Addr_WCT1 0x18
#define Addr_WCT2 0x19
//-------------------------------------------------------------------------
// ADS1198 spi 接口初始化
//-------------------------------------------------------------------------
void ADS1198_Spi_Init(void)
{
P3SEL |= 0x0E; // P3.1,P3.2,P3.3复用功能
UCB0CTL1 |= UCSWRST; // Put state machine in reset
UCB0CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI Master,MSB first,Mode 0(ucckpl=0,ucckph=1)
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x04; // /4
UCB0BR1 = 0; //
UCB0CTL1 &= ~UCSWRST; // 开启SPI
}
//-------------------------------------------------------------------------
// 发送ADS1198单字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_One(uchar cmd)
{
while (!(UCB0IFG&UCTXIFG)); // USCI_B0 TX buffer ready?
UCB0TXBUF = cmd; // Transmit data
}
//-------------------------------------------------------------------------
// 传输ADS1198多字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_Muti(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送第一字节命令+地址
ADS1198_Send_CMD_One(len-1); // 发送第二字节命令,发送数据长度
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(dat[i]); // 发送多字节数据
}
}
//-------------------------------------------------------------------------
// 接收ADS1198多字节命令
//-------------------------------------------------------------------------
uchar ADS1198_Recive_Data(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送接收命令第一字节+地址
ADS1198_Send_CMD_One(len-1); // 发送接收第二字节命令,接收数据长度
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(0); // 发送SPI时钟,DOUT=0
SomeNOP();SomeNOP();SomeNOP();SomeNOP(); // 延时
SomeNOP();SomeNOP();SomeNOP();SomeNOP();
if(UCB0IFG&UCRXIFG) // 判断接收标志
{
dat[i] = UCB0RXBUF; // 接收数据字节
}
else
{
return FALSE;
}
}
return TRUE;
}
//-------------------------------------------------------------------------
// 连续采集模式下接收数据
//-------------------------------------------------------------------------
uchar ADS1198_ReadData_Continue(uchar dat[],uchar len)
{
uchar i;
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(0); // 发送SPI时钟,DOUT=0
SomeNOP();SomeNOP();SomeNOP();SomeNOP(); // 延时
SomeNOP();SomeNOP();SomeNOP();SomeNOP();
if(UCB0IFG&UCRXIFG) // 判断接收标志
{
dat[i] = UCB0RXBUF; // 接收数据字节
}
else
{
return FALSE;
}
}
return TRUE;
}
//-------------------------------------------------------------------------
void ADS1198_Init(void)
{
uchar d[8];
P2DIR |= 0x60; // ads1198 RST,READY管脚输出
P3DIR |= 0x01; // ADS1198 CS 管脚输出
ADS1198_CS0; // 选中ADS1198
ADS1198_PWDN1; // 禁止进入低功耗模式
ADS1198_START0; // 禁止采集
ADS1198_RST1; // 复位置高
delayMS(1000); // 延时1S
ADS1198_RST0; // 复位1198
delayMS(100); // 延时100MS
ADS1198_RST1; // 复位清除
delayMS(1);
ADS1198_Send_CMD_One(SDATAC); // 发送停止命令
ADS1198_Recive_Data(0x20+Addr_ID,1,d); // 读ADS1198 ID号
if(d[0]==0xB6) // 判断是否为ADS1198 ID
{
d[0] = 0xCC; // 内部参考+2.4V+RLDREF(AVDD-AVSS)/2+RLD buffer允许+RLD检测允许
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG3,1,d); // 配置寄存器
d[0] = 0x45; // Multiple readback+250SPS
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG1,1,d); // 配置寄存器
d[0] = 0x34; // INT_TEST内部测试信号+(-2X测试信号)+Fclk/2.048M
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG2,1,d); // 配置寄存器
d[0] = 0x33; // (7.5%/92.5%)+Pull-up/pull-down mode+DC lead-off detection turned on
ADS1198_Send_CMD_Muti(0x40+Addr_LOFF,1,d);
d[0]=0x60;d[1]=0x60;d[2]=0x60;d[3]=0x60;d[4]=0x60;d[5]=0x60;d[6]=0x60;d[7]=0x60;// 12倍增益+正常导联输入
//d[0]=0x65;d[1]=0x65;d[2]=0x65;d[3]=0x65;d[4]=0x65;d[5]=0x65;d[6]=0x65;d[7]=0x65;// 12倍增益+测试信号输入
ADS1198_Send_CMD_Muti(0x40+Addr_CH1SET,8,d);
d[0] = 0x01;d[1] = 0x03; // RLD1P,RLD1N,RLD2N对应R,L,F,为右腿驱动源
ADS1198_Send_CMD_Muti(0x40+Addr_RLD_SENSP,2,d); // 配置寄存器
d[0] = 0x00;d[1] = 0x00; // 8个通道不检测测导联脱落
ADS1198_Send_CMD_Muti(0x40+Addr_LOFF_SENSP,2,d); // 配置寄存器
d[0] = 0x01; // 通道1,通道2作为起搏检测通道,开启起搏检测缓冲器
ADS1198_Send_CMD_Muti(0x40+Addr_PACE,1,d); // 配置寄存器
d[0] = 0x02; // 持续转换模式+Lead-off comparators enabled
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG4,1,d);
d[0] = 0x08;d[1] = 0xCB; // power on WCTA+WCTB+WCTC,RLD1P,RLD1N,RLD2N为威尔逊中心信号源
ADS1198_Send_CMD_Muti(0x40+Addr_WCT1,2,d);
ADS1198_Send_CMD_One(RDATAC); // 连续读命令
ADS1198_START1; // 开始数据采集
}
}
//--------------------------------------------------------------------------
ADS119x初始化使用原作者时序很好,我刚开始的时候没有初始化好,结果SPI读出的数据全部为零,学习的同胞们注意一下。
ADS1198/ADS1298开发设计心得与遗留问题总结
首先非常感谢TI公司的支持,自己手里面的6片ADS1198全部是从TI公司申请到的,并且遇到问题后能TI的技术支持工程师能及时给出解答,所以写这篇文章,一是对自己这几个月工作的总结,二是也算是对TI公司的感谢,也希望能帮助到以后使用ADS1198/1298的朋友。
本人使用MSP430F5418与ADS1198设计12导心电监测仪,其实就是个低档的HOLTER,在HOLTER的基础上加了几个操作按键和LCD显示屏。历时3个多月,前几天算是能比较满意的用ADS1198采集到ECG信号了!现在简单说下开发过程以及遇到的一些问题。
先说下MSP430单片机,本人01年开始使用(那是还是大四),先后使用过1100,135,149,2418等型号,这次选用了5418,因为信价比高,等开始实际调试使用时,才发现5418与之前的型号有很多升级。增加了几个功能模块同时也整合了一些功能模块。比如SYS模块,PMM模块,UCS模块等(还有一些功能由于没用上也没研究),这几个模块我看了很长时间英文资料(英文水平不咋地)后,发现SYS和PMM模块对我根本就没有用,并且把PMM模块关掉了,增加了这些模块视乎能提高430的安全性,但我觉得430这种单片机由于设计宗旨是低功耗3V供电。所以一般都是采用电池供电的,加上这2个模块似乎意义不大。反而与之前的型号兼容性不好了!
本人在做这款12导心电监测仪之前搞过1年多心电,只用运放做过9导心电监测仪,所以在ECG方面的经验还是很少的,发现这款ADS1198芯片还是在电源网上看到的,申请到样片后,手册和开发指南看了不下七八遍才基本理解明白,现在说说自己曾经迷糊而后来解决以及仍没解决的问题列出来:
1.ADS1198有16位AD,可是PGA增益最大只有12,没有二级放大,对于ECG信号最大幅值在5mV左右,经过12倍放大为60MV, 60/2400*65536=1638,即只要用12位就能标示出ECG信号了,也就是说浪费掉了4位AD,如果用ADS1298也会同样出现这种情况,只是会比1198精确些而已,如果用ADS1198/1298测量EEG信号,EEG信号是uV级的,真不能能不能用啊!
2. 请看手册第12页,这里的这幅图下面的NOTE写着SPI CPOL=0,CPHA=1,但是实际在调试程序时我发现这里应该设置为CKPH=0,CKPL=0.
3.册20页的公共点参考电压的公式似乎也由点问题,这里是AVDD-0.2V我觉得不对,应该是VREF+,因为如果按以上公式计算出的公共参考电压,有可能最大幅值超过VREF+,也就是AD不能正确的采集出实际数值。
4.手册第19页中设置CHNSET[2:0]=011时,1,2,5,6,7,8是用来测量AVDD/2,而3,4是用来测量DVDD/2,我设计的电路板是AVDD与DVDD电压相同,通过磁珠连接,结果测试出来的数据1,2,5,6,7,8 比我计算的理论数据差了10000多,而3.4比理论数据差了1000多,这两组之间也差了10000多,这个问题我现在也没搞明白,请TI的工程师和使用过的朋友解答一下吧。
5.当我用心电模拟仪输入信号时,(我的设计中1,2,3,4,5,6,7,8分别对应II,III,V1,V2,V3,V4,V5,V6),发现但我设置8个通道检测导联脱落时(即设置LOFF_SENSP=0XFF, LOFF_SENSN=0XFF),II,III的基线与V1,V2,V3,V4,V5,V6相差10000多,如果设置LOFF_SENSP=0X00, LOFF_SENSN=0X00时,即不检测导联脱落时,II,III,V1,-V6就在同一基线上了。这个也没搞明白。有待朋友们解答。
6.当心电模拟仪测试信号好用后,我实测人体信号,发现各路信号基线都不一致,我调试了半个月也没调出来,(我的设计基本上是抄TI的设计指南里的原理图的,我也明白为什么TI设计指南里为什么没有给出实测人体信号!,估计它的板子也一样有这个问题),后来请教TI的技术支持工程师JHL老师,他说要加高通滤波器,后来我在输入进ADS1198前加了各种高通滤波器,发现最实用的竟然是用0.1UF加10M电阻,这样这8路信号基本上在一条直线上了,(V1偏差大一点与其他的基线差100左右),但加了电阻电容滤波后,用心电模拟仪再测量时,原本一致的基线现在反而有偏差了,我是搞糊涂了!另外今天刚看到JHL老师的回复,说他说的加高通滤波实际上是软件滤波,如果是这样的话,看来我用430就不行了,应该改DSP做FFT变换吧!
总结一下,ADS1198/1298的确集成了很多ECG电路,比如8路仪表放大,威尔逊网络,内部测试信号,导联脱落检测(我用着不好使,呵呵)等等,而且也降低了功耗,节省了成本。是做便携式设备很好的选择,但问题也很大,内部只有前级放大,没有加二级放大,同时由于集成度太高,仪表放大后直接进AD,不能加高通,低通,以及抗肌电干扰等电路。这些工作恐怕全部要留给上位机用软件来解决,至于能解决到什么程度,我就不知道了!
以上就是个人使用ADS1198/1298的一些心得,能解决的问题以及遗留的问题,由于本人能力有限,估计会有很多错误和误解。以上所写,仅供大家参考,谢谢!
作者:liangzuolin
一下附上我用430开发的程序,已经调试通过,仅供参考!
#define ADS1198_CS0 P3OUT &= ~BIT0
#define ADS1198_CS1 P3OUT |= BIT0
#define ADS1198_START0 P2OUT &= ~BIT5
#define ADS1198_START1 P2OUT |= BIT5
#define ADS1198_RST0 P2OUT &= ~BIT6
#define ADS1198_RST1 P2OUT |= BIT6
#define ADS1198_PWDN0 P2OUT &= ~BIT4
#define ADS1198_PWDN1 P2OUT |= BIT4
#define ADS1198_READY (P2IN&0x40)
#define RDATAC 0x10
#define SDATAC 0x11
#define FALSE 0
#define TRUE 1
#define Addr_ID 0x00
#define Addr_CONFIG1 0x01
#define Addr_CONFIG2 0x02
#define Addr_CONFIG3 0x03
#define Addr_LOFF 0x04
#define Addr_CH1SET 0x05
#define Addr_CH2SET 0x06
#define Addr_CH3SET 0x07
#define Addr_CH4SET 0x08
#define Addr_CH5SET 0x09
#define Addr_CH6SET 0x0A
#define Addr_CH7SET 0x0B
#define Addr_CH8SET 0x0C
#define Addr_RLD_SENSP 0x0D
#define Addr_RLD_SENSN 0x0E
#define Addr_LOFF_SENSP 0x0F
#define Addr_LOFF_SENSN 0x10
#define Addr_LOFF_FLIP 0x11
#define Addr_LOFF_STATP 0x12
#define Addr_LOFF_STATN 0x13
#define Addr_GPIO 0x14
#define Addr_PACE 0x15
#define Addr_CONFIG4 0x17
#define Addr_WCT1 0x18
#define Addr_WCT2 0x19
//-------------------------------------------------------------------------
// ADS1198 spi 接口初始化
//-------------------------------------------------------------------------
void ADS1198_Spi_Init(void)
{
P3SEL |= 0x0E; // P3.1,P3.2,P3.3复用功能
UCB0CTL1 |= UCSWRST; // Put state machine in reset
UCB0CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI Master,MSB first,Mode 0(ucckpl=0,ucckph=1)
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x04; // /4
UCB0BR1 = 0; //
UCB0CTL1 &= ~UCSWRST; // 开启SPI
}
//-------------------------------------------------------------------------
// 发送ADS1198单字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_One(uchar cmd)
{
while (!(UCB0IFG&UCTXIFG)); // USCI_B0 TX buffer ready?
UCB0TXBUF = cmd; // Transmit data
}
//-------------------------------------------------------------------------
// 传输ADS1198多字节命令
//-------------------------------------------------------------------------
void ADS1198_Send_CMD_Muti(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送第一字节命令+地址
ADS1198_Send_CMD_One(len-1); // 发送第二字节命令,发送数据长度
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(dat[i]); // 发送多字节数据
}
}
//-------------------------------------------------------------------------
// 接收ADS1198多字节命令
//-------------------------------------------------------------------------
uchar ADS1198_Recive_Data(uchar cmd,uchar len,uchar dat[])
{
uchar i;
ADS1198_Send_CMD_One(cmd); // 发送接收命令第一字节+地址
ADS1198_Send_CMD_One(len-1); // 发送接收第二字节命令,接收数据长度
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(0); // 发送SPI时钟,DOUT=0
SomeNOP();SomeNOP();SomeNOP();SomeNOP(); // 延时
SomeNOP();SomeNOP();SomeNOP();SomeNOP();
if(UCB0IFG&UCRXIFG) // 判断接收标志
{
dat[i] = UCB0RXBUF; // 接收数据字节
}
else
{
return FALSE;
}
}
return TRUE;
}
//-------------------------------------------------------------------------
// 连续采集模式下接收数据
//-------------------------------------------------------------------------
uchar ADS1198_ReadData_Continue(uchar dat[],uchar len)
{
uchar i;
for(i=0;i<len;i++)
{
ADS1198_Send_CMD_One(0); // 发送SPI时钟,DOUT=0
SomeNOP();SomeNOP();SomeNOP();SomeNOP(); // 延时
SomeNOP();SomeNOP();SomeNOP();SomeNOP();
if(UCB0IFG&UCRXIFG) // 判断接收标志
{
dat[i] = UCB0RXBUF; // 接收数据字节
}
else
{
return FALSE;
}
}
return TRUE;
}
//-------------------------------------------------------------------------
void ADS1198_Init(void)
{
uchar d[8];
P2DIR |= 0x60; // ads1198 RST,READY管脚输出
P3DIR |= 0x01; // ADS1198 CS 管脚输出
ADS1198_CS0; // 选中ADS1198
ADS1198_PWDN1; // 禁止进入低功耗模式
ADS1198_START0; // 禁止采集
ADS1198_RST1; // 复位置高
delayMS(1000); // 延时1S
ADS1198_RST0; // 复位1198
delayMS(100); // 延时100MS
ADS1198_RST1; // 复位清除
delayMS(1);
ADS1198_Send_CMD_One(SDATAC); // 发送停止命令
ADS1198_Recive_Data(0x20+Addr_ID,1,d); // 读ADS1198 ID号
if(d[0]==0xB6) // 判断是否为ADS1198 ID
{
d[0] = 0xCC; // 内部参考+2.4V+RLDREF(AVDD-AVSS)/2+RLD buffer允许+RLD检测允许
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG3,1,d); // 配置寄存器
d[0] = 0x45; // Multiple readback+250SPS
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG1,1,d); // 配置寄存器
d[0] = 0x34; // INT_TEST内部测试信号+(-2X测试信号)+Fclk/2.048M
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG2,1,d); // 配置寄存器
d[0] = 0x33; // (7.5%/92.5%)+Pull-up/pull-down mode+DC lead-off detection turned on
ADS1198_Send_CMD_Muti(0x40+Addr_LOFF,1,d);
d[0]=0x60;d[1]=0x60;d[2]=0x60;d[3]=0x60;d[4]=0x60;d[5]=0x60;d[6]=0x60;d[7]=0x60;// 12倍增益+正常导联输入
//d[0]=0x65;d[1]=0x65;d[2]=0x65;d[3]=0x65;d[4]=0x65;d[5]=0x65;d[6]=0x65;d[7]=0x65;// 12倍增益+测试信号输入
ADS1198_Send_CMD_Muti(0x40+Addr_CH1SET,8,d);
d[0] = 0x01;d[1] = 0x03; // RLD1P,RLD1N,RLD2N对应R,L,F,为右腿驱动源
ADS1198_Send_CMD_Muti(0x40+Addr_RLD_SENSP,2,d); // 配置寄存器
d[0] = 0x00;d[1] = 0x00; // 8个通道不检测测导联脱落
ADS1198_Send_CMD_Muti(0x40+Addr_LOFF_SENSP,2,d); // 配置寄存器
d[0] = 0x01; // 通道1,通道2作为起搏检测通道,开启起搏检测缓冲器
ADS1198_Send_CMD_Muti(0x40+Addr_PACE,1,d); // 配置寄存器
d[0] = 0x02; // 持续转换模式+Lead-off comparators enabled
ADS1198_Send_CMD_Muti(0x40+Addr_CONFIG4,1,d);
d[0] = 0x08;d[1] = 0xCB; // power on WCTA+WCTB+WCTC,RLD1P,RLD1N,RLD2N为威尔逊中心信号源
ADS1198_Send_CMD_Muti(0x40+Addr_WCT1,2,d);
ADS1198_Send_CMD_One(RDATAC); // 连续读命令
ADS1198_START1; // 开始数据采集
}
}
//--------------------------------------------------------------------------
相关文章推荐
- 纷享逍客前端开发面试心得
- webpack4.0.1_vue脚手架的项目与json-server结合,vue开发前端时用json-server模拟数据
- 关于前端开发模拟慢网速、404那些事
- 关于前端的一些开发心得
- 关于做android系统集成开发的一点心得
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
- 基于Eclipse的TI集成开发环境IDE-CCSv5使用教程
- 模拟浏览器自动化测试工具Selenium之一eclipse集成开发部署篇
- 网站开发,从需求到前端到后端到部署到申请第三方各种接口,开发下来的心得
- 前端开发入门心得
- 个人心得:前端开发中注意不要乱放结束标签
- 自学前端开发:模拟Array功能 不是扩展子类
- 集成产品开发(IPD)理论学习心得(2):战略愿景下的产品战略
- 最近在新公司开始 TI OMAP5912平台的开发,主要是C55XX 的底层。 不过问题很多,过不久应该有心得出来。
- 基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源
- 前端学习心得-javascript设计模式与开发实践-命令封装模式
- 集成产品开发(IPD)理论学习心得(3):产品开发管理的时代变迁
- 前端开发如何模拟后端返回json数据
- jsFiddle – 前端集成开发环境
- Spring集成React用来开发前端----SpringMVC + react 开发实时测试