主题中讨论的其他部件: ADS1292
先生,我正在将ads1292r与Arduino一起用于获取ECG和呼吸信号的项目。我能够通过ads1292r数据表编写代码。我能够通过SPI获得72位数据流,其中前24位表示192-0-0 (每位8位) 根据 数据表,它可以正确转换为1100。所以我知道我正在通过SPI成功获得真实数据。但我接下来的48位,即24位ECG 和24位呼吸
显示恒定的输入电压值 ,而不考虑输入。附件是头文件,源文件和主要Arduino file.please。请查看并尽快回复。
ads1292r.h
#ifndef ads1292r_h
#define ads1292r_h
包含"Arduino。h"
//注册读取命令
#define RREG 0x20;//从地址rrrrrrrr开始读取n nnnn寄存器
//第一个字节001R rrrrrr (2xh)(2)-第二个字节000n nnnnnn(2)
#define WREG 0x40;//写入n nnnn寄存器,从地址rrrrrr开始
//第一字节010r rrrrrr (2xh)(2)-第二字节000n nnnn (2)
#define start 0x08 //开始/重新启动(同步)转换
#define stop 0x0A //停止转换
#define RDATAC 0x10 //启用读取数据连续模式。
//此模式是开机时的默认模式。
#define SDATAC 0x11 //停止连续读取数据模式
#define RDATA 0x12 //通过命令读取数据;支持多个回读。
//引脚声明您需要的另一个声明由SPI库控制
Const int ADS1292_DRDY_PIN = 6;
const int ADS1292_CS_PIN =7;
const int ADS1292_start_PIN =5;
Const int ADS1292_PWDN_PIN =4;
//注册地址
#define ADS1292_REG_ID 0x00
#define ADS1292_REG_config1 0x01
#define ADS1292_REG_CONFIIG2 0x02
#define ADS1292_REG_LoFF 0x03
#define ADS1292_REG_CH1SET 0x04
#define ADS1292_REG_CH2SET 0x05
#define ADS1292_REG_RLDSENS 0x06
#define ADS1292_REG_LOFFSENS 0x07
#define ADS1292_REG_LOFFSTAT 0x08
#define ADS1292_REG_RESP1 0x09
#define ADS1292_REG_RESP2 0x0A
类ads1292r.
{
公开:
静态无效ads1292_Init (void);
静态void ads1292_Reset(void);
静态void ads1292_ReG_Write (无符号char read_write_address,无符号char数据);
静态void ads1292_ReG_Read (无符号char read_write_address);
静态空ADs1292_SPI_Command_Data(unsigned char data_in);
静态空地址1292_Disable_Start(void);
静态空地址1292_Enable_Start (空);
静态空地址1292_Hard_Stop (void);
静态空地址1292_Start_Data_Conv_Command (void);
静态void ads1292_soft_stop (void);
静态空地址1292_Start_Read_Data_Continuous (void);
静态空地址1292_Stop_Read_Data_Continuous (void);
静态void read_ads(void);
};
#endif
ads1292r.c
#include <inuino.h>
#include <ads1292r.h>
#include <SPI.h>
void ads1292r::ads1292_Init()</s>1292
{
Serial.begin(5.76万);
//启动SPI库:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
//CPOL = 0,CPHA = 1
SPI.setDataMode(SPI_MODE1);
//为SPI选择1MHz时钟
SPI.setClockDivider(SPI_CLOCK_DIV16);
ads1292_Reset();
延迟(100);
ads1292_Disable_Start();
延迟(100);
ads1292_Stop_Read_Data_Continuous ();// SDATAC命令
延迟(300);
ads1292_Reg_Write(ADS1292_REG_config1, 0x00)1292 0x00);//将采样率设置为125 SPS
延迟(10);
ads1292_ReG_Write (ADS1292_REG_CONFIIG2,0x80);//导联脱落补偿关闭,测试信号禁用
延迟(10);
ads1292_ReG_Write(ADS1292_REG_LoFF, 0x10)1292 0x10);//导联脱落默认值
延迟(10);
ads1292_Reg_Write (ADS1292_REG_CH1SET,0x00);//已启用通道1,增益6,连接到电极IN
延迟(10);
ads1292_Reg_Write (ADS1292_REG_CH2SET,0x00);//Ch 2已启用,增益6,连接至电极IN
延迟(10);
ADs1292_ReG_Write (ADS1292_REG_RLDSENS,0b10.11万);//RLD设置:FMod/16,启用RLD,仅从通道2输入RLD
延迟(10);
ads1292_ReG_Write(ADS1292_REG_LOFFSENS, 0x00)1292 0x00);//LoFF设置:全部禁用
延迟(10);
//跳过寄存器8,LoFF设置默认值
ads1292_ReG_Write (ADS1292_REG_RESP1,0b1100.001万);//呼吸:仅修改/DEMOD,相位0
延迟(10);
ads1292_ReG_Write (ADS1292_REG_RESP2,0b1000.0011万);//呼吸:校准关闭,呼吸频率默认值
延迟(10);
ads1292_Start_Data_Conv_Command();
延迟(100);
ads1292_Start_Read_Data_Continuous ();
延迟(10);
}
void ads1292r::ads1292_Reset()</s>1292
{
DigitalWrite (ADS1292_PWDN_PIN,高);
DELAY (100);//等待100毫秒
DigitalWrite (ADS1292_PWDN_PIN,低);
延迟(100);
DigitalWrite (ADS1292_PWDN_PIN,高);
延迟(100);
}
void ads1292r::ads1292_Disable_Start()</s>1292
{
DigitalWrite (ADS1292_START_PIN,低);
延迟(20);
}
void ads1292r::ads1292_Enable_Start()</s>1292
{
DigitalWrite (ADS1292_START_PIN,高);
延迟(20);
}
void ads1292r::ads1292_Hard_Stop (void)1292 (void)
{
DigitalWrite (ADS1292_START_PIN,低);
延迟(100);
}
void ads1292r::ads1292_Start_Data_Conv_Command (void)1292 (void)
{
ads1292_SPI_Command_Data(start);//将0x08发送到ADS1x9x
}
void ads1292r::ads1292_soft_stop (void)1292 (void)
{
ads1292_SPI_Command_Data(stop);//向ADS1x9x发送0x0A
}
void ads1292r::ads1292_Start_Read_Data_Continuous (void)1292 (void)
{
ads1292_SPI_Command_Data(RDATAC);//将0x10发送到ADS1x9x
}
void ads1292r::ads1292_Stop_Read_Data_Continuous (void)1292 (void)
{
ads1292_SPI_Command_Data(SDATAC);//将0x11发送到ADS1x9x
}
void ads1292r::ads1292_SPI_Command_Data (1292 (unsigned char data_in)
{
字节数据[1];
//data[0]= data_in;
DigitalWrite (ADS1292_CS_PIN,低);
延迟(2);
DigitalWrite (ADS1292_CS_PIN,高);
延迟(2);
DigitalWrite (ADS1292_CS_PIN,低);
延迟(2);
SPI.transfer (data_in);
延迟(2);
DigitalWrite (ADS1292_CS_PIN,高);
}
void ads1292r::ads1292_ReG_Write (1292 (unsigned char read_write_address,unsigned char数据)
{
开关(读写地址)
{
案例1:
数据=数据和0x87;
中断;
案例2:
数据=数据和0xFB;
数据|=0x80;
中断;
案例3:
数据=数据和0xFD;
数据|= 0x10;
中断;
案例7:
数据=数据和0x3F;
中断;
案例8:
数据=数据和0x5F;
中断;
案例9:
数据|= 0x02;
中断;
案例10:
数据=数据和0x87;
数据|=0x01;
中断;
案例11:
数据=数据和0x0F;
中断;
默认:
中断;
}
//现在将寄存器地址和命令合并为一个字节:
字节DataToSend = READ_WRITE地址| WREG;
DigitalWrite (ADS1292_CS_PIN,低);
延迟(2);
DigitalWrite (ADS1292_CS_PIN,高);
延迟(2);
//将芯片选择降低以选择设备:
DigitalWrite (ADS1292_CS_PIN,低);
延迟(2);
SPI.transfer (dataToSend);//发送寄存器位置
SPI.transfer (0x00);//要wr的寄存器数
SPI.transfer (data);//发送值以记录到寄存器中
延迟(2);
//将芯片选择设置为高以取消选择:
DigitalWrite (ADS1292_CS_PIN,高);
}
void ads1292r::read_ads(void)
{
uINT32_t数据轴,日期;
int i;
DigitalWrite (ADS1292_CS_PIN,低);
volatile int Data1 = SPI.transfer (0x00);
volatile int Data2=SPI.transfer (0x00);
volatile int Data3=SPI.transfer (0x00);
volatile int Data4 =SPI.transfer (0x00);
volatile int Data5=SPI.transfer (0x00);
volatile int Data6 = SPI.transfer (0x00);
volatile int Data7=SPI.transfer (0x00);
volatile int Data8=SPI.transfer (0x00);
volatile int Data9 = SPI.transfer (0x00);
serial.println (数据1,bin);
datax=(Data4<16)|(Data5<8)|(Data6);
const int cons否 者1 =(日期轴和(1 < 23))!= 0;
如果(被否决1)
datax = datax |~(1 << 24)- 1);
double voltage1 =数据轴*(datax/1亿); 4.81
//Serial.println (voltage1);
datay=(数据7<16)|(数据8<8)|(数据9);
const int cons否2 =(日期和(1 < 24))!= 0;
如果(被否决2)
datay = datay |~(1 << 24)- 1);
double voltage2 =日期*(datay/1亿); 4.81
serial.println (voltage2);
digitalWrite (ADS1292_CS_PIN,高);//释放芯片,信号端传输
返回0;
}
ecgsketch.ino
#include <ads1292r.h>
#include <SPI.h>
ads1292r ADS1292;
易失性无符号int ECG=0;
void setup()
{
//初始化数据就绪和芯片选择引脚:
PinMode (ADS1292_DRDY_PIN,输入);//6
PinMode (ADS1292_CS_PIN,输出);//7
PinMode (ADS1292_START_PIN,输出);//5
PinMode (ADS1292_PWDN_PIN,输出);//4.
//初始化ADS1292从属设备
ADS1292.ads1292_Init();1292;
}
void循环()
{
IF ((digitalRead (ADS1292_DRDY_PIN))== LOW)
ADS1292.READ_ADs();
}