We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
已经经过Arduino验证,ADS1293可以工作并且可以记录心电了,后面下一步就是你们用MSP430实现配置控制、和读数的功能了。
主要需要注意的要点有如下:
可以直接用单片机给ADS芯片供电,注意要接__5V__和地线,千万不要接3V3,5v段没有电压可能会烧坏电源LDO芯片,单片机和ADS芯片__一定要共地__
剩下的只需要接SPI四根线,片选(CS),MOSI,MISO,SCLK(注意不要接到CLK上去了,那个是ADS输出时钟同步用的)
经过arduino验证,SPI关键参数设置如下可以工作
时钟极性 Clock Polarity (CPOL): 1
时钟相位 Clock Phase (CPHA): 0
输出边沿 Output Edge: 上升沿 Rising
数据捕获边沿Data Capture: 下降沿 Falling 这些对应Arduino SPI模式2,在Arduino上体现在这一句话SPI.setDataMode(SPI_MODE2);
时钟分频,在Arduino上设为了21,相当于4MHz的SPI时钟频率
字节输出顺序:MSBFIRST (most-significant bit first).
这块的意思大概是,最重要的字节先出去,意思就是从左往右的顺序输出01010这样,就是正常的顺序,貌似类似 big edian,这个设置非常重要,一定要设对!
这个是一个很重要的问题,我开始就是这块没弄对,因为默认SPI调用一次是发8位,你必须在这8位完成以后立马再来8位时钟才能实现读写,而且中间__片选信号千万不能断__
Arduino上的写入数据例子如下:
SPI.transfer(cs,addrToSend,SPI_CONTINUE); SPI.transfer(cs,thisValue);
也就是先送8位地址的信号出去addrToSend,然后立马写thisValue过去,注意这里面cs代表使用的片选端口,上面那句带的SPI_CONTINUE代表这两句中间片选不间断,到第二句完了以后才关片选。
读数据的例子是这样
const byte READ = 0b10000000; // read command 这一句放在最开始,是全局变量 byte addrToRead = thisRegister | READ; // 读的话,地址第一位必须是1,这个是一个读写输入输出的控制,一定要注意 SPI.transfer(cs,addrToRead,SPI_CONTINUE); // 先送8位地址,注意片选不能断 result=SPI.transfer(cs,0x00); //这个时候,sclk时钟继续着,送出0x00代表MOSI一直是低电平,result就是从SPI读出的数据
在Arduino里,我写了函数封装了基本的读写,比如像这样 void writeRegister(byte cs, byte thisRegister, byte thisValue) unsigned int readRegister(byte cs, byte thisRegister) 直接告诉函数你用哪个线片选,要读写什么地址啥的就好,建议你也这么做。
void writeRegister(byte cs, byte thisRegister, byte thisValue)
unsigned int readRegister(byte cs, byte thisRegister)
最关键的还是读取ECG数据!!这里用了一个steming的操作,需要额外注意下,手册38页一定要好好看下
在Arduino里我是这么操作的
while (SerialUSB.available() == 0) { SPI.transfer(4,0xD0,SPI_CONTINUE); //告诉ADS,我们要读0x50地址,注意这个0xD0地址是因为第一位是1,读写控制。紧接着一直打开片选,不能断SPI_CONTINUE,后面保持着片选,时钟一加,数据一直源源不断跟着你的时钟按顺序出来,这个不太方便封装,你一定要仔细看,看不懂问我。 receivedUpper = SPI.transfer(4,0x00,SPI_CONTINUE);//0x37 receivedMiddle = SPI.transfer(4,0x00,SPI_CONTINUE);//0x38 receivedLower = SPI.transfer(4,0x00,SPI_CONTINUE);//0x39 CH1EcgData=64*receivedUpper+8*receivedMiddle+receivedLower; receivedUpper = SPI.transfer(4,0x00,SPI_CONTINUE);//0x3A receivedMiddle = SPI.transfer(4,0x00,SPI_CONTINUE);//0x3B receivedLower = SPI.transfer(4,0x00,SPI_CONTINUE);//0x3C CH2EcgData=64*receivedUpper+8*receivedMiddle+receivedLower; receivedUpper = SPI.transfer(4,0x00,SPI_CONTINUE);//0x3D receivedMiddle = SPI.transfer(4,0x00,SPI_CONTINUE);//0x3E receivedLower = SPI.transfer(4,0x00);//0x3F CH3EcgData=64*receivedUpper+8*receivedMiddle+receivedLower; SerialUSB.print("ECG Channel 1 Data: "); SerialUSB.print(CH1EcgData); SerialUSB.print(" ECG Channel 2 Data: "); SerialUSB.print(CH2EcgData); SerialUSB.print(" ECG Channel 3 Data: "); SerialUSB.print(CH3EcgData); SerialUSB.print(" \n"); delay(100); }
writeRegister(4,0x01,0x11); writeRegister(4,0x02,0x19); writeRegister(4,0x03,0x2E); writeRegister(4,0x0A,0x07); writeRegister(4,0x0C,0x04); writeRegister(4,0x0D,0x01); writeRegister(4,0x0E,0x02); writeRegister(4,0x0F,0x03); writeRegister(4,0x10,0x01); writeRegister(4,0x12,0x04); writeRegister(4,0x21,0x02); writeRegister(4,0x22,0x02); writeRegister(4,0x23,0x02); writeRegister(4,0x24,0x02); writeRegister(4,0x27,0x08); writeRegister(4,0x2F,0x70);
writeRegister(4,0x00,0x01);//start conversion 这就是向0地址写一个
writeRegister(4,0x00,0x01);//start conversion
见前面讲steming的部分
writeRegister(4,0x00,0x00)//stop conversion
就今天记录的一段数据来看,貌似50Hz工频干扰有很显著的影响,一定要在MSP或者手机APP上做一个FIR或者IIR滤波,吧50Hz陷掉
主要就是这样,有问题问我,我ADS结束了赶紧弄AFE了
The text was updated successfully, but these errors were encountered:
TimothyZero
lijinmi
No branches or pull requests
已经经过Arduino验证,ADS1293可以工作并且可以记录心电了,后面下一步就是你们用MSP430实现配置控制、和读数的功能了。
主要需要注意的要点有如下:
连线问题
可以直接用单片机给ADS芯片供电,注意要接__5V__和地线,千万不要接3V3,5v段没有电压可能会烧坏电源LDO芯片,单片机和ADS芯片__一定要共地__
剩下的只需要接SPI四根线,片选(CS),MOSI,MISO,SCLK(注意不要接到CLK上去了,那个是ADS输出时钟同步用的)
SPI时钟设置以及时序问题
经过arduino验证,SPI关键参数设置如下可以工作
时钟极性 Clock Polarity (CPOL): 1
时钟相位 Clock Phase (CPHA): 0
输出边沿 Output Edge: 上升沿 Rising
数据捕获边沿Data Capture: 下降沿 Falling
这些对应Arduino SPI模式2,在Arduino上体现在这一句话SPI.setDataMode(SPI_MODE2);
时钟分频,在Arduino上设为了21,相当于4MHz的SPI时钟频率
字节输出顺序:MSBFIRST (most-significant bit first).
SPI位数以及片选问题
这个是一个很重要的问题,我开始就是这块没弄对,因为默认SPI调用一次是发8位,你必须在这8位完成以后立马再来8位时钟才能实现读写,而且中间__片选信号千万不能断__
Arduino上的写入数据例子如下:
也就是先送8位地址的信号出去addrToSend,然后立马写thisValue过去,注意这里面cs代表使用的片选端口,上面那句带的SPI_CONTINUE代表这两句中间片选不间断,到第二句完了以后才关片选。
读数据的例子是这样
在Arduino里,我写了函数封装了基本的读写,比如像这样
void writeRegister(byte cs, byte thisRegister, byte thisValue)
unsigned int readRegister(byte cs, byte thisRegister)
直接告诉函数你用哪个线片选,要读写什么地址啥的就好,建议你也这么做。
最关键的还是读取ECG数据!!这里用了一个steming的操作,需要额外注意下,手册38页一定要好好看下
在Arduino里我是这么操作的
对ADS的SPI操作主要是这么几大块了
初始化写各种控制字
打开数据记录
writeRegister(4,0x00,0x01);//start conversion
这就是向0地址写一个
开始通过steming读ECG各channel的数据
见前面讲steming的部分
关闭数据记录
writeRegister(4,0x00,0x00)//stop conversion
滤波问题
就今天记录的一段数据来看,貌似50Hz工频干扰有很显著的影响,一定要在MSP或者手机APP上做一个FIR或者IIR滤波,吧50Hz陷掉
主要就是这样,有问题问我,我ADS结束了赶紧弄AFE了
The text was updated successfully, but these errors were encountered: