国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

64kSPS、低功耗、多通道同步、24 位ADC生物電勢測量的模擬前端AFE9XX

這篇具有很好參考價值的文章主要介紹了64kSPS、低功耗、多通道同步、24 位ADC生物電勢測量的模擬前端AFE9XX。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

AFE94X多通道同步采集,64KSPS,24bit SD_ADC AFE94X
驗證驅動,阻塞等待DRDY(僅驗證驅動使用),兼容-類比芯片STM32HAL庫SPI
https://blog.csdn.net/hhhhwdnmd/article/details/135774192?spm=1001.2014.3001.5501


一、AFE94X是什么?

AFE94X是多通道同步采樣 24 位 Δ-Σ 模數轉換器(ADC)系列,內置有可編程增益放大器(PGA)、內部基準以及板載振蕩器。AFE94x 包含醫(yī)療心電圖(ECG)和腦電圖(EEG)應用中通
常所需的全部功能。憑借高集成度和出色性能,AFE94x能夠以大幅縮小的尺寸、顯著降低的功耗和整體成本開發(fā)可擴展的醫(yī)療儀器系統(tǒng)。

二、使用步驟

1.AFE94X.h

/*
    Analogysemi xutong
    2023/02/15
*/
#ifndef __AFE94X_H
#define __AFE94X_H
 
#include "bsp_lpspi.h"
#include "stm32f4xx.h"
 
#define AFE94x_START_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_PWDN_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_DRDY_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOA_CLK_ENABLE()
#define AFE94x_REST_GPIO_CLK_ENABLE()        __HAL_RCC_GPIOB_CLK_ENABLE()
 
/* Definition for AFE94x Pins */
#define AFE94x_START_PIN                     GPIO_PIN_8
#define AFE94x_START_GPIO_PORT               GPIOA
#define AFE94x_DRDY_PIN                    	 GPIO_PIN_12
#define AFE94x_DRDY_GPIO_PORT                GPIOA
#define AFE94x_PWDN_PIN                      GPIO_PIN_11
#define AFE94x_PWDN_GPIO_PORT                GPIOA
#define AFE94x_REST_PIN                      GPIO_PIN_1
#define AFE94x_REST_GPIO_PORT                GPIOB
 
/*command define*/
 
#define AFE94X_WAKEUP  0x02
#define AFE94X_STANDBY 0x04
#define AFE94X_RESET   0x06
#define AFE94X_START   0x08
#define AFE94X_STOP    0x0A

#define AFE94X_RDATAC  0x10
#define AFE94X_SDATAC  0x11
#define AFE94X_RDATA   0x12
#define AFE94X_OFFSETCAL  0x1A

#define AFE94X_RREG    0X20
#define AFE94X_WREG    0X40
#define AFE94X_RREGX   0xE4
#define AFE94X_WREGX   0xE8
//RREG Read n nnnn registers starting at address r rrrr 
//First Byte 001r rrrr (2xh)
//Second Byte 000n nnnn 
//n nnnn = number of registers to be read or written – 1. For example, to read or write three registers, set n nnnn = 0 (0010). r rrrr = the
//starting register address for read and write commands
//WREG 同上
//WREG First Byte (4xh)
/*
    寄存器地址
*/
#define AFE94X_ID           0x00
#define AFE94X_CONFIG1      0x01
#define AFE94X_CONFIG2      0x02
#define AFE94X_CONFIG3      0x03
#define AFE94X_LOFF         0x04

#define AFE94X_CH1SET      0X05
#define AFE94X_CH2SET      0X06
#define AFE94X_CH3SET      0X07
#define AFE94X_CH4SET      0X08
#define AFE94X_CH5SET      0X09
#define AFE94X_CH6SET      0X0A
#define AFE94X_CH7SET      0X0B
#define AFE94X_CH8SET      0X0C
#define AFE94X_RLD_SENSP   0X0D
#define AFE94X_RLD_SENSN   0X0E
#define AFE94X_LOFF_SENSP  0X0F
#define AFE94X_LOFF_SENSN  0X10
#define AFE94X_LOFF_FLIP   0X11

#define LOFF_STATP_Status   0X12
#define LOFF_STATN_Status   0X13

#define AFE94X_GPIO        0X14 
#define AFE94X_PACE        0X15
#define AFE94X_RESV        0X16
#define AFE94X_CONFIG4     0X17
#define AFE94X_WCT1        0X18
#define AFE94X_WCT2        0X19

#define AFE94X_WCT3        0X1A
#define AFE94X_CONFIG5     0X1C
#define AFE94X_CONFIG6     0X1D
#define AFE94X_CONFIG7     0X1E
#define AFE94X_CONFIG8     0X1F
#define AFE94X_CONFIG9     0X20
#define AFE94X_LOFF_CFCG1  0X21
#define AFE94X_LOFF_CFCG2  0X22
#define AFE94X_LOFF_ACLO1  0X23
#define AFE94X_LOFF_ACLO2  0X24
#define AFE94X_REDR2P      0X25
#define AFE94X_CHMUX_MSB   0X26
#define AFE94X_LOFF_CMP_FLIP 0X27
#define AFE94X_LOFF_SENSN1 0X28
#define AFE94X_LOFF_SENSP1 0X29
#define AFE94X_SRB1_COFIG  0X2A
#define AFE94X_BIAS_DAC    0X2B
#define AFE94X_XOSC_CFG    0X2C
#define AFE94X_LOW_NOISE   0X2E
#define AFE94X_MISC_ANA    0X34
#define AFE94X_MOD_STAT    0X35
#define AFE94X_CMD_STAT    0X36
#define AFE94X_PGAP_OOR    0X37
#define AFE94X_PGAN_OOR    0X28

/*
    寄存器設置
*/
//CONFIG2
#define	EXT_TEST_ON	       0X00	//關閉內部測試信號,外部(默認)
#define	INT_TEST_ON		   0X10
//CONFIG3
#define INT_REF_EN         0X80   //內部基準(default)
#define EXT_REF_EN         0X00   //外部基準
#define AFE94X_REF_2_4V    0X00   //default
#define AFE94X_REF_4V      0X20
#define RLD_REF_PD_EN      0X04   //default
#define RLD_REF_PD_DIS     0X00
#define AFE94X_RLDREF_INT  0X08
#define AFE94X_RLDREF_EXT  0X00   //default
#define AFE94X_RLD_BUF_EN  0X04
#define AFE94X_RLD_BUF_DIS 0X00   //default
#define RLD_LOFF_SENS_EN   0X02
#define RLD_LOFF_SENS_DIS  0X00   //default 
#define RLD_STAT_EN        0X00   //default
#define RLD_STAT_DIS       0X01
//LOFF
#define AFE94X_COMP_95_5   0X00
#define AFE94X_COMP_92_7   0X20
#define AFE94X_COMP_90_8   0X40
#define AFE94X_COMP_87_12  0X60
#define AFE94X_COMP_85_15  0X80
#define AFE94X_COMP_80_20  0XA0
#define AFE94X_COMP_75_25  0XC0
#define AFE94X_COMP_70_30  0XE0
#define LEAD_CURRENT_9NA   0X00
#define LEAD_CURRENT_18NA  0X03
#define LEAD_CURRENT_27NA  0X04
#define LEAD_CURRENT_40NA  0X0C
#define FLEAD_AC_LEAD      0X01
#define FLEAD_DC_LEAD      0X03
//CHXSET
#define AFE94X_CH_PD       0X80  //Channel power-down
#define AFE94X_CH_EN       0X00  //Normal operation
#define AFE94X_PGA_1       0X10
#define AFE94X_PGA_2       0X20
#define AFE94X_PGA_3       0X30
#define AFE94X_PGA_4       0X40
#define AFE94X_PGA_6       0X00 //default
#define AFE94X_PGA_8       0X40
#define AFE94X_PGA_12      0X60
#define AFE94X_PGA_24      0X70
#define	MUX_Normal_input   0X00	//普通電極輸入(默認)
#define	MUX_Input_shorted  0X01	//輸入短路
#define MUX_RLD_Test       0x02
#define	MUX_Test_signal    0X05	//測試信號輸入
#define	MUX_RLD_DRP		   0X06		
#define	MUX_RLD_DRN		   0X07			
#define	MUX_RLD_DRPM	   0X00	//CHX_MUX_MSB must set	CHX_MUX_MSB|MUXn = 1000	
#define	MUX_RSP_RESP       0X01 //CHX_MUX_MSB must set  CHX_MUX_MSB|MUXn = 1001
#define MUX_AFE_BYPASS     0X02 //CHX_MUX_MSB must set  CHX_MUX_MSB|MUXn = 1010
//CONFIG4
#define AFE94X_SHOT_MODE   0X20
#define AFE94X_CONT_MODE   0X00 //default
#define AFE94X_COMP_PDEN   0X02 
#define AFE94X_COMP_PDDIS  0X00 //default
#define WCT_RLD_CONNECT    0X01 
//WCT1
#define PD_WCTA_DIS        0X00 //default
#define PD_WCTA_EN         0X08
#define WCTA_AIN1P_Amp     0X00
#define WCTA_AIN1N_Amp     0X01
#define WCTA_AIN2P_Amp     0X02
#define WCTA_AIN2N_Amp     0X03
#define WCTA_AIN3P_Amp     0X04
#define WCTA_AIN3N_Amp     0X05
#define WCTA_AIN4P_Amp     0X06
#define WCTA_AIN4N_Amp     0X07
//WCT2
#define PD_WCTC_DIS        0X00 //default
#define PD_WCTC_EN         0X80
#define PD_WCTB_DIS        0X00
#define PD_WCTB_EN         0X40 //default
#define WCTB_AIN1P_Amp     0X00
#define WCTB_AIN1N_Amp     0X08
#define WCTB_AIN2P_Amp     0X10
#define WCTB_AIN2N_Amp     0X18
#define WCTB_AIN3P_Amp     0X20
#define WCTB_AIN3N_Amp     0X28
#define WCTB_AIN4P_Amp     0X30
#define WCTB_AIN4N_Amp     0X38
#define WCTC_AIN1P_Amp     0X00
#define WCTC_AIN1N_Amp     0X01
#define WCTC_AIN2P_Amp     0X02
#define WCTC_AIN2N_Amp     0X03
#define WCTC_AIN3P_Amp     0X04
#define WCTC_AIN3N_Amp     0X05
#define WCTC_AIN4P_Amp     0X06
#define WCTC_AIN4N_Amp     0X07
//WCT3
#define WCT_SW7_OFF        0X00 //default
#define WCT_SW7_ON         0X80
#define WCT_SW6_OFF        0X00 //default
#define WCT_SW6_ON         0X40 
#define WCT_SW5_OFF        0X00 //default
#define WCT_SW5_ON         0X20
#define WCT_SW4_OFF        0X00 //default
#define WCT_SW4_ON         0X10
#define WCT_SW4_EN         0X08
#define WCT_SW4_DIS        0X00 //default
#define WCT_BUF_LOW        0X04 //default
#define WCT_BUF_HIGH       0X00
#define WCT_BYPASS_BUF     0X01
//CONFIG5
#define INT_OSC_2M         0X00 //default Internal OSC frequency 2M
#define INT_OSC_1M         0X40 //Internal OSC frequency 1M
#define INT_OSC_0_5M       0X80 //Internal OSC frequency 512K
#define INT_OSC_0_2M       0XC0 //Internal OSC frequency 216K
#define AFE94X_HS_MODE     0X02
#define AFE94X_LP_MODE     0X01
//L0FF_CGF2
#define RLD_COMP_95_5      0X00 //default
#define RLD_COMP_92_7      0X04
#define RLD_COMP_90_8      0X08
#define RLD_COMP_87_12     0X0C
#define RLD_COMP_85_15     0X10
#define RLD_COMP_80_20     0X14
#define RLD_COMP_75_25     0X18
#define RLD_COMP_70_30     0X38
#define LEAD_Debounce_DIS  0X00 //default
#define LEDA_Debounce_117  0x01
//CHMUX_MSB
#define CH8_MUX_MSB        0X80
#define CH7_MUX_MSB   	   0X40
#define CH6_MUX_MSB   	   0X20
#define CH5_MUX_MSB        0X10
#define CH4_MUX_MSB    	   0X08
#define CH3_MUX_MSB        0X04
#define CH2_MUX_MSB        0X02
#define CH1_MUX_MSB        0X01

//GPIO
#define GPIOD_GPIO1        0X10
#define GPIOD_GPIO2        0X20
#define GPIOD_GPIO3        0X40
#define GPIOD_GPIO4        0X80
#define GPIO_IN_GPIO1      0X01
#define GPIO_IN_GPIO2      0X02
#define GPIO_IN_GPIO3      0X04
#define GPIO_IN_GPIO4      0X08
#define GPIO_OUT_GPIO1     0X00
#define GPIO_OUT_GPIO2     0X00
#define GPIO_OUT_GPIO3     0X00
#define GPIO_OUT_GPIO4     0X00
//LOFF_CFG1
#define RLD_COMP_EN
#define CUR_LEVEL

//RLD_DAC
#define RLD_DAC_EN         0X80
#define RLD_DAC_DIS        0X00
#define RLD_REF_AVDD       0X00
#define RLD_REF_AREEP      0X40
/*
  通道選擇
  channel select
*/
#define AFE94X_AIN1        0
#define AFE94X_AIN2        1
#define AFE94X_AIN3        2
#define AFE94X_AIN4        3
#define AFE94X_AIN5        4
#define AFE94X_AIN6        5
#define AFE94X_AIN7        6
#define AFE94X_AIN8        7

//寫命令
void AFE9XX_Command(uint8_t Com);
//獲取芯片的ID號
uint8_t AFE9XX_GetChipID(void);
 
//獲取寄存器值
uint8_t AFE9XX_GetReg(uint8_t Rreg);
//獲取多個寄存器值
void AFE9XX_ReadMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data);
//寫入寄存器值
void AFE9XX_WriteReg(uint8_t Wreg,uint8_t Data);
//寫多個寄存器的值
void AFE9XX_WriteMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data);
//獲取所有寄存器值
void AFE9XX_GetAllReg(void);
//設定通道并且獲取ADC的值
// CH設置為 0或者設通道0/1
void AFE9XX_GetADC_Value(uint8_t AIN_P,uint8_t AIN_N,uint8_t *Rxdata);
//初始化AFE9XX
void AFE9XX_Init(void);
//獲取通道ADC值
float AFE9xx_GetValue(uint8_t AIN_CH,uint8_t AFE94X_REF,uint8_t *Rxdata);
//獲取所有通道ADC值
void AFE94X_GetAllValue(uint8_t AFE94X_REF,uint8_t *Rxdata,float *Voltage);
//獲取內部溫度傳感器值
float AFE9XX_GetTempture(uint8_t *Rxdata);
//獲取設備噪聲值
float AFE9XX_Noise_Test(uint8_t *Rxdata);
//電源測試
float AFE9XX_PWR_Test(uint8_t *Rxdata);
//直流導聯(lián)脫落
void AFE9XX_DCLEAD_OFF(uint8_t *Rxdata);
//內部信號測試
void AFE9XX_SINGLE_TEST(uint8_t *Rxdata);
void TEST_RLD_SINGLE(uint8_t *Rxdata);
#endif

2.AFE94X.c

代碼如下(示例):文章來源地址http://www.zghlxwxcb.cn/news/detail-858026.html

#include "AFE94X.h"
//初始化AF94X
void AFE9XX_Init(void)
{
  //拉PWDN和RST
	GPIO_InitTypeDef GPIO_Initure;
    AFE94x_START_GPIO_CLK_ENABLE();           //開啟START時鐘
	AFE94x_PWDN_GPIO_CLK_ENABLE();            //開啟PWDN時鐘
	AFE94x_DRDY_GPIO_CLK_ENABLE();            //開啟DRDY時鐘
	AFE94x_REST_GPIO_CLK_ENABLE();            //開啟REST時鐘
	
    GPIO_Initure.Pin=AFE94x_DRDY_PIN;         //DRDY
    GPIO_Initure.Mode=GPIO_MODE_INPUT;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_DRDY_GPIO_PORT,&GPIO_Initure);
	
	GPIO_Initure.Pin=AFE94x_PWDN_PIN;          //PWDN
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_PWDN_GPIO_PORT,&GPIO_Initure);
	
	GPIO_Initure.Pin=AFE94x_START_PIN;         //START
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_START_GPIO_PORT,&GPIO_Initure);
	
    GPIO_Initure.Pin=AFE94x_REST_PIN;           //REST
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  
    GPIO_Initure.Pull=GPIO_PULLUP;          
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     
    HAL_GPIO_Init(AFE94x_REST_GPIO_PORT,&GPIO_Initure);
	
	HAL_GPIO_WritePin(AFE94x_PWDN_GPIO_PORT,AFE94x_PWDN_PIN,1);  //拉高PWDN
	HAL_GPIO_WritePin(AFE94x_REST_GPIO_PORT,AFE94x_REST_PIN,0);  //拉低REST
	HAL_Delay(1);
	HAL_GPIO_WritePin(AFE94x_REST_GPIO_PORT,AFE94x_REST_PIN,1);  //拉低REST
	HAL_GPIO_WritePin(AFE94x_START_GPIO_PORT,AFE94x_START_PIN,0);//START
	
	AFE9XX_Command(AFE94X_RESET);

}
//獲取芯片的ID號
uint8_t AFE9XX_GetChipID(void)
{
    uint8_t ID;
    ID=AFE9XX_GetReg(AFE94X_ID);
    return ID;
}
//獲取芯片寄存器值
uint8_t AFE9XX_GetReg(uint8_t Rreg)
{
   uint8_t TxData[3];
   uint8_t RxData[3];
   uint8_t Reg_Val=0;
	//寄存器地址小于0X1F
   if(Rreg <= 0X1F)
   {
		//讀取命令,選擇要讀取的寄存器
		TxData[0]=AFE94X_RREG|Rreg;
		//讀取單個寄存器
		TxData[1]=0x00;
		Lpspi_Read(3,TxData,RxData);
		//返回寄存器值
   }
   //寄存器地址大于0X1F
   else
   {
	   //獲取CONFIG8寄存器Value
		Reg_Val=AFE9XX_GetReg(AFE94X_CONFIG8);
		//寫入CONFIG8寄存器地址偏移命令,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Reg_Val|0x80;  //SET ADDR_OFFSET
		Lpspi_Write(3,TxData);
	   
	   //讀取命令,
		TxData[0]=AFE94X_RREG|Rreg;
		//選擇要讀取的寄存器
		TxData[1]=0x00;
		//開始讀取
		Lpspi_Read(3,TxData,RxData);
		//返回寄存器值
	   
	   //清除CONFIG8寄存器地址偏移位,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Reg_Val&0X7F;  //Clear ADDR_OFFSET
		Lpspi_Write(3,TxData);  
   }
    return RxData[2];
}
//寫單個芯片寄存器值
void AFE9XX_WriteReg(uint8_t Wreg,uint8_t Data)
{
    uint8_t TxData[3];
	uint8_t Reg_Val=0;
	//寄存器地址小于0X1F
	if(Wreg<=0x1F)
	{
		//寫入命令,
		TxData[0]=AFE94X_WREG|Wreg;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Data;
		Lpspi_Write(3,TxData);
	}
	//寄存器地址大于0X1F
	else
	{
		//獲取CONFIG8寄存器Value
		Reg_Val=AFE9XX_GetReg(AFE94X_CONFIG8);
		//寫入CONFIG8寄存器地址偏移命令,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Reg_Val|0x80;  //SET ADDR_OFFSET
		Lpspi_Write(3,TxData);
		//寫入命令,
		TxData[0]=AFE94X_WREG|Wreg;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Data;
		Lpspi_Write(3,TxData);
		
		//清除MISC_ANA寄存器地址偏移位,
		TxData[0]=AFE94X_WREG|AFE94X_CONFIG8;
		//選擇要寫入的的寄存器
		TxData[1]=0x00;
		//讀取寫入寄存器
		TxData[2]=Reg_Val&0X7F;  //Clear ADDR_OFFSET
		Lpspi_Write(3,TxData);
	}
    
}
//寫多個芯片寄存器值
//StartReg 起始寄存器地址
//RegNum 要寫的寄存器數量
//*Data  寄存器參數傳入
void AFE9XX_WriteMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data)
{
    uint8_t TxData[52];
    uint8_t i;
    //寫入命令,
    TxData[0]=AFE94X_WREGX;
	TxData[1]=StartReg;
    //選擇要寫入的的寄存器
    TxData[2]=RegNum-1;
    for(i=1;i<=RegNum;i++)
    {
       //將指針數據賦值給Txdata
       TxData[2+i]=*Data;
       //指向下個數據地址
       Data++;
    }
    //最終發(fā)送多少個數據
    Lpspi_Write(3+RegNum,TxData);
}
//讀多個芯片寄存器值
//StartReg 起始寄存器地址
//RegNum 要寫的寄存器數量
//*Data  寄存器參數傳出
void AFE9XX_ReadMultiReg(uint8_t StartReg,uint8_t RegNum,uint8_t *Data)
{
    //讀取寄存器
    uint8_t TxData[24]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    //讀取命令,
    TxData[0]=AFE94X_RREGX;
	TxData[1]=StartReg;
    //選擇要寫入的的寄存器
    TxData[2]=RegNum-1;
    //最終接收多少個數據
    Lpspi_Read(3+RegNum,TxData,Data);
}
//發(fā)送AFE9XX 數據指令 如SDATAC或者RDATAC
//詳情見頭文件command define部分
void AFE9XX_Command(uint8_t Com)
{
    uint8_t TxData[1];
	TxData[0]=Com;
    Lpspi_Write(1,TxData);
}
//測量固有噪聲
//返回噪聲值
float AFE9XX_Noise_Test(uint8_t *Rxdata)
{
	//set->pga=1 and Input shorted (for offset or noise measurements) 
	uint8_t Chset[]={0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11,0X11};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,Chset);
	//singel shot mode
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//SET 250SPS
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//設置內部基準默認基準2.4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	//MSB=1->采集數據為負數
	if((AD_Value>>16)&0X80)        
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	Voltage = (AD_Value*(2.4/8388607))*1000;
	return Voltage;
	
}	
//測量內部測試信號1mv(VREF->2.4V)
void AFE9XX_SINGLE_TEST(uint8_t *Rxdata)
{
	//Select Test sigle
	uint8_t Chset[]={0X05,0X05,0015,0X05,0X05,0X05,0X05,0X05,0X05,0X05};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	//停止連續(xù)數據傳輸
	AFE9XX_Command(AFE94X_SDATAC);
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,Chset);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x10);
	//設置內部基準
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}
//電源測量
float AFE9XX_PWR_Test(uint8_t *Rxdata)
{
	//SET PGA=1 AND 
	uint8_t CHSET[]={0X13,0X13,0X13,0X13,0X13,0X13,0X13,0X13};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,CHSET);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//設置內部基準4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_4V);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	if((AD_Value>>16)&0X80)        //MSB=1->采集數據為負數
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	Voltage = (AD_Value*(4.0/8388607))*1000;
	return Voltage;
}
void AFE9XX_DCLEAD_OFF(uint8_t *Rxdata)
{
	//Select loff channel
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	//停止連續(xù)數據傳輸
	AFE9XX_Command(AFE94X_SDATAC);
	//使能直流導聯(lián)脫落,設置比較閾值
	AFE9XX_WriteReg(AFE94X_LOFF,AFE94X_COMP_70_30|FLEAD_DC_LEAD);
	//內部比較器上電
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_COMP_PDEN);
	//選擇使能導聯(lián)脫離通道
	AFE9XX_WriteReg(AFE94X_LOFF_SENSN,0XFF);
	AFE9XX_WriteReg(AFE94X_LOFF_SENSP,0XFF);
	//設置內部基準
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_4V);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}
//讀溫度傳感器
//返回溫度值℃
float AFE9XX_GetTempture(uint8_t *Rxdata)
{
	uint8_t PGA_Gain[]={0X14,0X14,0X14,0X14,0X14,0X14,0X14,0X14};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Temp_Value;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
		
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//設置內部基準
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3]<<16|Rxdata[4]<<8|Rxdata[5]);
	if((AD_Value>>16)&0X80)        //MSB=1->采集數據為負數
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
		
	}
	Temp_Value = (((AD_Value*(2.4/8388607))*1000000-143200)/481)+25;
	return Temp_Value;
}	
//讀單個ADC通道電壓值(PGA=1)
//AIN_Channel 要讀ADC通道
//AFE94X_REF 內部基準選擇
//返回單通道ADC電壓值(mv)
float AFE9xx_GetValue(uint8_t AIN_CH,uint8_t AFE94X_REF,uint8_t *Rxdata)
{
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	float Voltage;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	AFE9XX_WriteReg(AFE94X_CONFIG2,0x00);
	//設置內部基準4V
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	//select single Channel Value
	AD_Value = (Rxdata[3+(AIN_CH*3)]<<16|Rxdata[4+(AIN_CH*3)]<<8|Rxdata[5+(AIN_CH*3)]);
	//MSB=1->采集數據為負數
	if((AD_Value>>16)&0X80)        
	{
		AD_Value = ~AD_Value;
		AD_Value = AD_Value&0X7FFFFF;
	}
	//內部基準選擇2.4V
	if(AFE94X_REF==AFE94X_REF_2_4V)
	{
		Voltage = (AD_Value*(2.4/8388607))*1000;
	}
	//內部基準選擇4V
	else if(AFE94X_REF==AFE94X_REF_4V)
	{
		Voltage = (AD_Value*(4.0/8388607))*1000;
	}
	//外部基準
	else if(AFE94X_REF == EXT_REF_EN)
	{
		//Voltage = (AD_Value*(LSB)*1000;
	}
	return Voltage;
}
//讀多通道ADC電壓值(PGA=1)
//AFE94X_REF 基準選擇
// * AFE94X_REF_2_4V 
// * AFE94X_REF_4V 
// * AFE94X_EXT_REF
//Voltage 返回多通道ADC電壓值(mv)
void AFE94X_GetAllValue(uint8_t AFE94X_REF,uint8_t *Rxdata,float *Voltage)
{
	uint8_t PGA_Gain[]={0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10};
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//PGA_Gain set 1,MUX Normal input
	AFE9XX_WriteMultiReg(AFE94X_CH1SET,8,PGA_Gain);
	//單次模式
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//設置采樣率
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	//設置內部基準
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF);
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
	for(int i=0;i<8;i++)
	{
		AD_Value = (Rxdata[3+(i*3)]<<16|Rxdata[4+(i*3)]<<8|Rxdata[5+(i*3)]);
		 //MSB=1->采集數據為負數
		if((AD_Value>>16)&0X80)       
		{
			AD_Value = ~AD_Value;
			AD_Value = AD_Value&0X7FFFFF;
		}
		//內部基準選擇2.4V
		if(AFE94X_REF==AFE94X_REF_2_4V)
		{
			Voltage[i] = (AD_Value*(2.4/8388607))*1000;
		}
		//內部基準選擇4V
		else if(AFE94X_REF==AFE94X_REF_4V)
		{
			Voltage[i] = (AD_Value*(4.0/8388607))*1000;
		}
		//外部基準
		else if(AFE94X_REF==EXT_REF_EN)
		{
			//Voltage[i] = (AD_Value*(LSB)*1000;
		}
	}
}
//右腿驅動
void TEST_RLD_SINGLE(uint8_t *Rxdata)
{
	uint8_t Txdata[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	uint32_t AD_Value=0;
	//停止連續(xù)讀數據
	AFE9XX_Command(AFE94X_SDATAC);
	//channel 1-3 PGA_Gain set 1,MUX Normal input
	AFE9XX_WriteReg(AFE94X_CH1SET,AFE94X_PGA_1|MUX_Normal_input);
	AFE9XX_WriteReg(AFE94X_CH2SET,AFE94X_PGA_1|MUX_Normal_input);
	AFE9XX_WriteReg(AFE94X_CH3SET,AFE94X_PGA_1|MUX_Normal_input);
	//channel 1-3 connect RLD
	AFE9XX_WriteReg(AFE94X_RLD_SENSP,0X07);
	AFE9XX_WriteReg(AFE94X_RLD_SENSN,0X07);
	AFE9XX_WriteReg(AFE94X_CONFIG3,0X1C);
	//set channel 4-5
	AFE9XX_WriteReg(AFE94X_CH4SET,AFE94X_CH_PD|AFE94X_PGA_1|MUX_RLD_DRN);
	AFE9XX_WriteReg(AFE94X_CH5SET,AFE94X_CH_PD|AFE94X_PGA_1|MUX_RLD_Test);
	//單次模式
	AFE9XX_WriteReg(AFE94X_CONFIG4,AFE94X_SHOT_MODE);
	//設置采樣率
	AFE9XX_WriteReg(AFE94X_CONFIG1,0x06);
	//設置內部基準
	AFE9XX_WriteReg(AFE94X_CONFIG3,INT_REF_EN|AFE94X_REF_2_4V );
	//啟動轉換
	AFE9XX_Command(AFE94X_START);
	//連續(xù)讀數據
	AFE9XX_Command(AFE94X_RDATAC);
	//等待DRDY
	while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12));
	Lpspi_Read(27,Txdata,Rxdata);
}

到了這里,關于64kSPS、低功耗、多通道同步、24 位ADC生物電勢測量的模擬前端AFE9XX的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • STM32入門筆記08_ADC模數轉換器+案例: ADC單通道&ADC多通道

    STM32入門筆記08_ADC模數轉換器+案例: ADC單通道&ADC多通道

    ADC(Analog-Digtal Converter) 模擬-數字轉換器 ADC可以將引腳上連續(xù)變化的模擬電壓轉換為內存中存儲的數字變量, 建立模擬電路到數字電路的橋梁 12位逐次逼近型ADC, 1us轉換時間 輸入電壓范圍: 0~3.3V, 轉換結果范圍: 0~4095 18個輸入通道, 可測量16個外部和2個內部信號源 規(guī)則組和注入組

    2024年02月04日
    瀏覽(55)
  • ADC噪聲全面分析 -02- ADC 噪聲測量方法和相關參數

    ADC噪聲全面分析 -02- ADC 噪聲測量方法和相關參數

    在解釋如何測量 ADC 噪聲之前,重要的是要了解,當您查看 ADC 數據表規(guī)格時,相關指標參數表征對象是 ADC,而不是設計的電子系統(tǒng)。因此,ADC 制造商測試 ADC 噪聲的方式和測試系統(tǒng)本身應該展示 ADC 的能力,而不是測試系統(tǒng)的限制。 因此,在不同系統(tǒng)或不同條件下使用 ADC

    2024年02月07日
    瀏覽(26)
  • STM32雙路ADC注入通道和規(guī)則通道采樣

    電機控制使用四路注入通道采集,參考ST官方庫,使用定時器10us觸發(fā)一次,使用ADC1和ADC2各2路注入通道。 需要一路ADC進行規(guī)則采樣油門信號,使用中斷的話會和注入通道中斷放在同一個函數里面 ,我不喜歡,所以使用了DMA中斷。 PreKnowledge: 規(guī)則通道:最多16個規(guī)則通道,采樣

    2024年04月14日
    瀏覽(29)
  • STM32ADC單通道轉換

    ADC功能初始化主要分三部分,GPIO初始化、ADC模式初始化與NVIC初始化。 1.1初始化GPIO 1.2 初始化ADC模式 1.3 初始化NVIC 中斷函數命名為ADC1_2_IRQHandler即可,換ADC通道的話名字也要換。

    2024年03月09日
    瀏覽(23)
  • 如何使用ADC測量我們設備的鋰電池電壓

    如何使用ADC測量我們設備的鋰電池電壓

    電路設計: 首先當我們想知道設備還有多少電的時候,我們就需要有一個電壓監(jiān)測電路 ?通常我們會想到通過兩個電阻分壓的方式來獲取電壓,通過兩個電阻分壓,連接到單片機的ADC引腳。ADC測到的電壓,就是鋰電池電壓的一半 因為鋰電池的電壓范圍大概在2.7V到4.2V之間,所

    2024年02月01日
    瀏覽(20)
  • stm32_ADC電源、通道、工作模式

    stm32_ADC電源、通道、工作模式

    0、ADC功能框圖 1、ADC的電源 1.1、工作電源 VSSA=VSS,VDDA=VDD,簡單來說,通常stm32是3.3V,ADC的工作電源也是3.3V; 1.2、參考電壓 VREF+和VREF-并不一定引出,取決于封裝,如果沒有引出則VREF+連接到VDDA、VREF-連接到VSSA。 在不要求精度的情況下,VREF+可直接接到VDDA,想要精確測量,

    2024年02月12日
    瀏覽(20)
  • STM32 hal庫使用筆記(五)ADC—單通道/雙通道DMA傳輸

    STM32 hal庫使用筆記(五)ADC—單通道/雙通道DMA傳輸

    實現目的:利用ADC采集光敏傳感器/煙霧傳感器的值,并利用串口打印 實驗平臺:正點原子精英版 一、簡介 1.DMA的介紹 參考:STM32 hal庫使用筆記(四)DMA—內存到內存/內存到外設_亂碼小伙的博客-CSDN博客 2.ADC簡介 ? ? ?ADC(Analog-Digital Converter)模擬-數字轉換器 ADC可以將引腳

    2024年02月03日
    瀏覽(22)
  • ES7210 高性能四通道音頻ADC

    ES7210 高性能四通道音頻ADC

    ?ES7210? 是一款用于麥克風陣列應用的高性能、低功耗 4 通道音頻模數轉換器,同時具備聲學回聲消除 (AEC) 功能,非常適合音樂和語音應用。 該設備支持標準音頻時鐘(64Fs, 128Fs, 256Fs, 384Fs, 512Fs等),USB時鐘 (12/24 MHz),以及一些常見的非標準音頻時鐘(25mhz, 26mhz等)。 根據串行音

    2024年01月18日
    瀏覽(35)
  • 實驗(六):ADC應用:獨立模式單通道采集實驗

    實驗(六):ADC應用:獨立模式單通道采集實驗

    實驗目的: 1. 學習對ADC基礎功能的使用; 2. 掌握KEIL5的仿真與調試。 任務: 1.?? 根據要求編寫程序,并寫出原理性注釋; 2. 將檢查程序運行的結果,分析一下是否正確; 3. 完成所建工程的驗證調試。 貼片滑動變阻器的動觸點通過連接至STM32 芯片的ADC 通道引腳。當我們使

    2024年02月15日
    瀏覽(23)
  • STM32 ADC單/多通道采樣+DMA搬運

    STM32 ADC單/多通道采樣+DMA搬運

    通過介紹我們可以了解到,ADC是12位的轉換器,所以采樣值范圍是0~4095。18個通道可同時進行轉換,也可以單獨轉換某個通道。 使用ADC的流程應為: 初始化IO口。 我這里使用的是PA1進行采樣,也就是ADC1的通道1 初始化ADC。 轉換、獲取采樣值。 多通道的時候我們一般用DMA來搬

    2024年02月14日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包