小言_互联网的博客

ADS1292R的硬件电路和软件程序

390人阅读  评论(0)

       ADS1292R和ADS1292的区别好像就是R后缀带呼吸波的阻抗匹配(好像是这样吧,没有细研究。)?由于一开始买的就是1292R,也没有注意就按照手册设计了,后面主要到的时候电路都焊完了,而且芯片还很贵不想重新买芯片了,就先用着吧,内部的寄存器什么的是一样的,使用ADS1292的同学同样可以参考一下。
1.硬件电路

图1 ADS1292R的硬件电路图

       硬件电路部分主要是参考了TI官方的板子来设计的,使用内部参考,默认使用内部的时钟。

2.软件驱动程序部分

	Ads1292_Reset();
	delay_ms(10);
	id = Ads1292_Reg_Read(ADS1292_REG_ID);
	printf("ID=%#X\r\n", id);
	
	Ads1292_Reg_Write(ADS1292_REG_CONFIG1, 0x00);//Set sampling rate to 125 SPS
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_CONFIG2, 0xA0);//Lead-off comp off,0
	id = Ads1292_Reg_Read(ADS1292_REG_CONFIG2);
	printf("CFG2=%#X\r\n", id);
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_LOFF, 0x10);//Lead-off defaults
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_CH1SET, 0x00);//Ch 1 enabled, gain 1
	id = Ads1292_Reg_Read(ADS1292_REG_CH1SET);
	printf("CH1=%#X\r\n", id);
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_CH2SET, 0x00);	//Ch 2 enabled, gain 1
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_RLDSENS, 0x00);	//RLD settings: off
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_LOFFSENS, 0x00);		//LOFF settings: all disabled
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_RESP1, 0xc2);		//Respiration: MOD/DEMOD turned only, phase 0
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_RESP2, 0x03);		//Respiration: Calib OFF, respiration freq defaults
	delay_ms(10);
	Ads1292_Reg_Write(ADS1292_REG_GPIO, 0x0C);		//GPIO input
	delay_ms(10);
	Ads1292_Enable_Start();
	ADS1292R_SPI_SETSPEED(SPI_BaudRatePrescaler_4);

       上面的代码就是寄存器配置部分,主要就是读取ID寄存器,然后串口打印寄存器值,看看寄存器是否配置正常等。

/*
 * @description		: 写寄存器
 * @param 			: void
 * @return 			: void
 */
void Ads1292_Reg_Write(uint8_t reg, uint8_t data)
{
   
	ADS1292_CS = 0;
    switch (reg)
    {
   
        case 1:
          data = data & 0x87;
    	    break;
        case 2:
            data = data & 0xFB;
    	    data |= 0x80;
    	    break;
        case 3:
    	    data = data & 0xFD;
    	    data |= 0x10;
    	    break;
        case 7:
    	    data = data & 0x3F;
    	    break;
        case 8:
        	data = data & 0x5F;
    	    break;
        case 9:
    	    data |= 0x02;
    	    break;
        case 10:
    	    data = data & 0x87;
    	    data |= 0x01;
    	    break;
        case 11:
    	    data = data & 0x0F;
    	    break;
        default:
    	    break;
    }
	
	reg |= WREG; /* 写寄存器 */
	ADS1292R_SPI_READWRITEBYTE(reg); /* opcode1 */
	ADS1292R_SPI_READWRITEBYTE(0);	 /* opcode2 1byte */
	ADS1292R_SPI_READWRITEBYTE(data);	 /* data */
	delay_ms(1);
	ADS1292_CS = 1;
}

       上面这部分代码就是写寄存器的部分,根据数据手册里面提供的写寄存器步骤进行写寄存器,这里面有个问题需要注意的就是读写寄存器时SPI的时钟频率不能太快,不能超过芯片内部时钟的2倍。如果使用芯片内部时钟的话就是512K,SPI时钟不能超过1M,如果使用外部的2.048M时钟的话,那么SPI的速度不能超过4.096M。读写寄存器时SPI的速度太快会造成读写不正常。

/*
 * @description		: 读寄存器
 * @param 			: void
 * @return 			: void
 */
uint8_t Ads1292_Reg_Read(uint8_t reg)
{
   
	uint8_t data;
	ADS1292_CS = 0;
	ADS1292R_SPI_READWRITEBYTE(SDATAC);
	reg |= RREG;
	ADS1292R_SPI_READWRITEBYTE(reg); /* opcode1 */
	ADS1292R_SPI_READWRITEBYTE(0x00);	 /* opcode2 1byte */
	data = ADS1292R_SPI_READWRITEBYTE(0);
	ADS1292_CS = 1;
	return data;	 /* data */
}

       上面的代码块就是读寄存器的部分了,这部分代码主要也是根据手册里的步骤进行读取寄存器操作,区别在于每次读寄存器之前要发送SDATAC命令。

       需要具体的代码文件的朋友可以点击下面的链接进行下载。ads1292驱动文件


转载:https://blog.csdn.net/weixin_43980908/article/details/108856043
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场