當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]24bit高精度ADC,支持雙極性信號(hào),使用時(shí)如果需要使用內(nèi)部增益,不能將VIN-接GND。/*****************************************************

24bit高精度ADC,支持雙極性信號(hào),使用時(shí)如果需要使用內(nèi)部增益,不能將VIN-接GND。

/*************************************************************************************************************
?*?文件名		:	AD7799.c
?*?功能			:	AD7799驅(qū)動(dòng)
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時(shí)間		:	2017-04-21
?*?最后修改時(shí)間	:	2018-06-06
?*?詳細(xì)			:	AD7799驅(qū)動(dòng)
					AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果
					依賴系統(tǒng)ms延時(shí)函數(shù)
					如果需要使用內(nèi)部增益>2,那么VIN-不能接GND,必須接基準(zhǔn)源,并且輸入的差分信號(hào)需要在指定范圍內(nèi)。
*************************************************************************************************************/		
#include?"SYSTEM.H"
#include?"GPIO_INIT.H"
#include?"AD7799.H"


//調(diào)試開關(guān)
#define?AD7799_DBUG	1
#if?AD7799_DBUG
	#include?"system.h"
	#define?ad7799_debug(format,...)	uart_printf(format,##__VA_ARGS__)
#else
	#define?ad7799_debug(format,...)	/
/
#endif	//AD7799_DBUG


static?const?u8?AD7799_REG_LEN[8]?=?{1,2,2,3,1,1,3,3};	//AD7799寄存器長(zhǎng)度,單位字節(jié)



/*************************************************************************************************************************
*?函數(shù)		:	bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void))
*?功能		:	AD7799初始化
*?參數(shù)		:	pHandle:句柄;SetCLK:CLK輸出控制回調(diào);SetCS:CS輸出回調(diào);SetOutData:輸出輸出DOUT回調(diào);GetInData:數(shù)據(jù)輸入DIN回調(diào)
*?返回		:	TRUE:成功;FALSE:失敗
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2017-04-21
*?說明		:?	初始化檢測(cè)ID,ID不對(duì)會(huì)返回失敗
*************************************************************************************************************************/
bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void))
{
	u8?retry;
	u8?id;
	u8?temp;
	
	if(pHandle?==?NULL?||?SetCLK?==?NULL?||?SetCS?==?NULL?||?SetOutData==?NULL?||?GetInData?==?NULL)
	{
		DEBUG("AD7799?初始化句柄或接口無效!");
		SYS_DelayMS(100);
	}
	//初始化句柄
	pHandle->SetCLK?=?SetCLK;					//CLK輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	pHandle->SetCS?=?SetCS;						//CS輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	pHandle->SetOutData?=?SetOutData;			//DOUT輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	pHandle->GetInData?=?GetInData;				//DIN輸入回調(diào)(返回1:高電平;0:低電平)
	
	//開始初始化芯片
	pHandle->SetCS(1);							//CS默認(rèn)高電平
	pHandle->SetCLK(1);							//CLK默認(rèn)高電平
	pHandle->SetOutData(0);						//默認(rèn)輸出低電平
	
	SYS_DelayMS(10);							//延時(shí)10ms等待供電穩(wěn)定
	AD7799_SoftwareReset(pHandle);				//系統(tǒng)軟復(fù)位
	SYS_DelayMS(20);
	for(retry?=?0;retry?<?8;retry?++)			//循環(huán)讀取ID
	{
		id?=?AD7799_ReadReg(pHandle,?AD7799_REG_ID);
		if((id&0x0F)==0X9)
		{
			break;
		}
		SYS_DelayMS(100);
	}
	if((id&0x0F)!=0X9)
	{
		ad7799_debug("AD7799初始化失敗,未知的ID(%02X)rn",id);
		return?FALSE;
	}
	AD7799_SetConfig(pHandle,?FALSE,?TRUE,?AD7799_GAIN_1,?TRUE,?AD7799_CH_AIN1);
	SYS_DelayMS(10);
	temp?=?AD7799_ReadReg(pHandle,?AD7799_REG_STATUS);	//讀取狀態(tài)
	if(temp?&?BIT5)
	{
		ad7799_debug("AD7799參考故障,狀態(tài)(%02X)rn",temp);
	}
	
	ad7799_debug("AD7799初始化成功,ID(%02X)rn",id);
	return?TRUE;
}





/*************************************************************************************************************************
*?函數(shù)		:	u8?AD7799_ReadWriteByte(AD7799_HANDLE?*pHandle,?u8?data)
*?功能		:	AD7799讀寫一字節(jié)
*?參數(shù)		:	pHandle:句柄;data:需要寫入的數(shù)據(jù)
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	不帶片選,最底層寫入1B
*************************************************************************************************************************/
u8?AD7799_ReadWriteByte(AD7799_HANDLE?*pHandle,?u8?data)
{
	u8?i;

	for(i?=?0;i?<?8;i?++)
	{
		pHandle->SetCLK(0);				//CLK=0
		if(data?&?0x80)
		{
			pHandle->SetOutData(1);		//DOUT=1
		}
		else
		{
			pHandle->SetOutData(0);		//DOUT=0
		}
		nop;nop;nop;nop;nop;nop;
		pHandle->SetCLK(1);				//CLK=1
		data?<GetInData())		//DIN
		{
			data?|=?1;
		}
		nop;nop;nop;nop;nop;nop;		
	}
	
	return?data;
}




/*************************************************************************************************************************
*?函數(shù)		:	u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr)
*?功能		:	AD7799讀取一個(gè)寄存器
*?參數(shù)		:	pHandle:句柄;RegAddr:寄存器地址
*?返回		:	讀取的數(shù)據(jù)
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	會(huì)使能片選,會(huì)自動(dòng)判斷寄存器長(zhǎng)度,并進(jìn)行讀取
*************************************************************************************************************************/
u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr)
{
	u8?i;
	u32?data?=?0;
	
	if(RegAddr?>?7)?		return?0;				//寄存器地址0-7
	pHandle->SetCS(0);								//片選拉低,準(zhǔn)備讀寫數(shù)據(jù)
	nop;nop;
	data?|=?BIT6;									//R/W位為1,讀取數(shù)據(jù)
	data?|=?RegAddr?<<?3;							//寄存器地址
	AD7799_ReadWriteByte(pHandle,?data);			//寫入命令,讀取指定寄存器
	data?=?0;
	for(i?=?0;i<AD7799_REG_LEN[RegAddr];i?++)
	{
		data?<SetCS(1);								//片選恢復(fù)
	pHandle->SetOutData(0);							//DOUT=0?默認(rèn)輸出低電平
	
	return?data;
}

/*************************************************************************************************************************
*?函數(shù)		:	void?AD7799_WriteReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr,?u32?RegData)
*?功能		:	AD7799寫一個(gè)寄存器
*?參數(shù)		:	pHandle:句柄;RegAddr:寄存器地址;RegData:需要寫入的值
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	會(huì)使能片選,會(huì)自動(dòng)判斷寄存器長(zhǎng)度,并進(jìn)行寫入
*************************************************************************************************************************/
void?AD7799_WriteReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr,?u32?RegData)
{
	u8?i;
	u8?data?=?0;
	
	if(RegAddr?>?7)?		return;					//寄存器地址0-7
	pHandle->SetCS(0);								//片選拉低,準(zhǔn)備讀寫數(shù)據(jù)
	nop;nop;
	data?|=?RegAddr?<<?3;							//寄存器地址
	AD7799_ReadWriteByte(pHandle,?data);			//寫入命令,寫指定寄存器
	for(i?=?0;i>((AD7799_REG_LEN[RegAddr]-1-i)*8));	//寫入數(shù)據(jù)
	}

	pHandle->SetCS(1);								//片選恢復(fù)
	pHandle->SetOutData(0);							//DOUT=0?默認(rèn)輸出低電平
}


/*************************************************************************************************************************
*?函數(shù)		:	void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed)
*?功能		:	AD7799設(shè)置采集模式
*?參數(shù)		:	pHandle:句柄;mode:模式,見AD7799_MODE_TYPE;speed:采樣速度,見AD7799_SPEED_TYPE
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	設(shè)置采集模式
*************************************************************************************************************************/
void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed)
{
	u16?data?=?0;
	
	data?|=?mode?<<?13;					//模式設(shè)置
	data?|=?speed?&?0xf;				//轉(zhuǎn)換速度設(shè)置
	
	AD7799_WriteReg(pHandle,?AD7799_REG_MODE,?data);
}



/*************************************************************************************************************************
*?函數(shù)		:	void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle)
*?功能		:	AD7799軟件復(fù)位
*?參數(shù)		:	pHandle:句柄
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	連續(xù)發(fā)送32個(gè)1到AD7799會(huì)進(jìn)行復(fù)位,所有寄存器復(fù)位到原始值
*************************************************************************************************************************/
void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle)
{
	pHandle->SetCS(0);								//片選拉低,準(zhǔn)備讀寫數(shù)據(jù)
	nop;nop;
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個(gè)1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個(gè)1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個(gè)1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個(gè)1
	
	pHandle->SetCS(1);								//片選恢復(fù)
	pHandle->SetOutData(0);							//DOUT=0?默認(rèn)輸出低電平
}



/*************************************************************************************************************************
*?函數(shù)		:	void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable)
*?功能		:	AD7799快速讀取模式開關(guān)
*?參數(shù)		:	pHandle:句柄;Enable:TRUE:開啟快速讀取模式;FALSE:關(guān)閉快速讀取模式
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	開啟快速讀取模式后,可直接快速讀取采集的數(shù)據(jù),無效發(fā)送讀取命令
				使能連續(xù)可讀模式,必須在通信寄存器中寫入01011100;當(dāng)RDY變?yōu)榈蜁r(shí),向通信寄存器中寫入01011000,退出連續(xù)可讀模式。
				當(dāng)在連續(xù)可讀模式下,ADC檢測(cè)到DIN腳的有效活動(dòng),也會(huì)退出連續(xù)可讀模式。另外,如果在DIN管腳上連續(xù)輸入32位的高電平,AD被復(fù)位。
				因此,當(dāng)在連續(xù)讀模式下DIN腳應(yīng)被置為低電平直到一個(gè)新的命令寫入設(shè)備。
				警告:開啟連續(xù)讀取后必須在RDY變?yōu)榈碗娖胶蟀l(fā)送此命令(不能發(fā)送別的命令)
*************************************************************************************************************************/
void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable)
{
	pHandle->SetCS(0);								//片選拉低,準(zhǔn)備讀寫數(shù)據(jù)
	nop;nop;
	if(Enable)										//使能連續(xù)讀取模式
	{
		AD7799_ReadWriteByte(pHandle,?0x5C);		//開啟連續(xù)讀取模式
		AD7799_ReadWriteByte(pHandle,?0);			
		AD7799_ReadWriteByte(pHandle,?0);			
	}
	else
	{
		AD7799_ReadWriteByte(pHandle,?0x58);		//關(guān)閉連續(xù)讀取模式
		AD7799_ReadWriteByte(pHandle,?0XFF);			
		AD7799_ReadWriteByte(pHandle,?0XFF);			
	}
	
	pHandle->SetCS(1);								//片選恢復(fù)
	pHandle->SetOutData(0);							//DOUT=0?默認(rèn)輸出低電平
	
}


/*************************************************************************************************************************
*?函數(shù)		:	u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS)
*?功能		:	AD7799快速讀取采集結(jié)果
*?參數(shù)		:	pHandle:句柄;isCS:TRUE:需要控制片選;FALSE:無需控制片選
*?返回		:	24bit的采集結(jié)果
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	必須先開啟快速讀取模式,開啟后可以進(jìn)行快速讀取
*************************************************************************************************************************/
u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS)
{
	u32?data?=?0;
	u8?i;
	
	if(isCS)											//需要使能片選
	{
		pHandle->SetCS(0);								//片選拉低,準(zhǔn)備讀寫數(shù)據(jù)
		nop;nop;
	}
	
	for(i?=?0;i?<?3;i?++)
	{
		data?<SetCS(1);								//片選恢復(fù)
		pHandle->SetOutData(0);							//DOUT=0?默認(rèn)輸出低電平
	}
	
	return?data;
}


/*************************************************************************************************************************
*?函數(shù)		:	void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch)
*?功能		:	AD7799配置
*?參數(shù)		:	pHandle:句柄;isEnBurnout:是否開啟電流源;isUnipolar:是否使能單極性采集;Gain:增益設(shè)置,見AD7799_GAIN_TYPE;isEnBuff:是否開啟緩沖器
				ch:采集通道選擇,見AD7799_CH_TYPE
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	用于設(shè)置AD7799,默認(rèn)已經(jīng)開啟了參考保護(hù)
*************************************************************************************************************************/
void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch)
{
	u16?data?=?0;
	
	if(isEnBurnout)?	data|=BIT13;					//使能電流源
	if(isUnipolar)?		data|=BIT12;					//使能單極性采集
	data?|=?(Gain&0x07)?<<?8;							//增益設(shè)置
	data?|=?BIT5;										//參考保護(hù)開啟
	if(isEnBuff)		data?|=?BIT4;					//使能buff,緩沖器
	data?|=?ch&0x7;										//通道選擇
	
	AD7799_WriteReg(pHandle,?AD7799_REG_CONFIG,?data);	//寫入配置寄存器
}



/*************************************************************************************************************************
*?函數(shù)		:	bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed)
*?功能		:	AD7799校準(zhǔn)模式
*?參數(shù)		:	pHandle:句柄;speed:轉(zhuǎn)換速度
*?返回		:	FALSE:校準(zhǔn)失敗;TRUE:校準(zhǔn)成功
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-27
*?最后修改	:?	2018-06-06
*?說明		:?	校準(zhǔn)前需要先設(shè)置通道,使用的是內(nèi)部校準(zhǔn)模式
				片內(nèi)滿度校準(zhǔn)不能在增益為128的情況下進(jìn)行。為盡量減少滿度誤差,每次的通道的增益改變都需要進(jìn)行滿度校準(zhǔn)。
*************************************************************************************************************************/
bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed)
{
	u8?delay?=?0;
	
	AD7799_SetMode(pHandle,?AD7799_MODE_IDLE,?speed);		//先進(jìn)入空閑模式	
	AD7799_SetMode(pHandle,?AD7799_MODE_ZEROCALI,?speed);	//內(nèi)部零刻度校準(zhǔn)模式
	pHandle->SetCS(0);	
	if(pHandle->GetInData()==0)?
	{
		ad7799_debug("校準(zhǔn)失敗,提前有低電平!rn");
		pHandle->SetCS(1);	
		return?FALSE;
	}
	delay?=?0;
	while(pHandle->GetInData()==1)?
	{
		SYS_DelayMS(10);
		delay?++;
		if(delay?>?100)?
		{
			ad7799_debug("校準(zhǔn)失敗,等待校準(zhǔn)結(jié)束超時(shí)!rn");
			pHandle->SetCS(1);	
			return?FALSE;
		}
	}
	pHandle->SetCS(1);	
	
	AD7799_SetMode(pHandle,?AD7799_MODE_FULLCALI,?speed);	//內(nèi)部滿刻度校準(zhǔn)模式
	pHandle->SetCS(0);
	if(pHandle->GetInData()==0)?
	{
		ad7799_debug("校準(zhǔn)失敗1,提前有低電平!rn");
		pHandle->SetCS(1);
		return?FALSE;
	}
	delay?=?0;
	while(pHandle->GetInData()==1)?
	{
		SYS_DelayMS(10);
		delay?++;
		if(delay?>?100)?
		{
			ad7799_debug("校準(zhǔn)失敗1,等待校準(zhǔn)結(jié)束超時(shí)!rn");
			pHandle->SetCS(1);
			return?FALSE;
		}
	}
	pHandle->SetCS(1);
	
	return?TRUE;
}






/*************************************************************************************************************************
*?函數(shù)		:	u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt)
*?功能		:	AD7799采集數(shù)據(jù)
*?參數(shù)		:	pHandle:句柄;ch:通道0-2;CollCnt:采集次數(shù)(用于濾波)
*?返回		:	采集的結(jié)果HEX
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時(shí)間		:	2017-04-27
*?最后修改	:?	2018-06-07
*?說明		:?	
*************************************************************************************************************************/
u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt)
{
	u32?data;
	u32?temp;
	u32?ADC_Data;
	u8?i;
	

	
	if(ch?>?2)?return?0;
	if(CollCnt?<?1)?CollCnt?=?1;
	//采集
	AD7799_SetConfig(pHandle,?pHandle->Config[ch].isEnBurnout,?pHandle->Config[ch].isUnipolar,?pHandle->Config[ch].Gain,?pHandle->Config[ch].isEnBuff,?(AD7799_CH_TYPE)ch);		//切換通道
	AD7799_SetMode(pHandle,?AD7799_MODE_IDLE,?pHandle->Config[ch].speed);							//空閑模式
	//uart_printf("AD7799_REG_CONFIG:0x%Xrn",AD7799_ReadReg(AD7799_REG_CONFIG));
	AD7799_SetMode(pHandle,?AD7799_MODE_CONTINUOUS,?pHandle->Config[ch].speed);						//連續(xù)采集模式開啟
	//uart_printf("mode2:0x%Xrn",AD7799_ReadReg(AD7799_REG_MODE));
	//uart_printf("AD7799_REG_STATUS2:%Xrn",AD7799_ReadReg(AD7799_REG_STATUS));

	AD7799_SetCREAD(pHandle,?TRUE);																	//連續(xù)讀取模式使能
	pHandle->SetCS(0);	
	data?=?0;
	for(i?=?0;i?<?CollCnt;)																			//采集濾波
	{
		if(pHandle->GetInData()==0)
		{		
			temp?=?AD7799_CReadData(pHandle,?FALSE);
			data?+=?temp;
			i++;
		}
		SYS_DelayMS(5);
	}
	
	//退出連續(xù)讀取模式
	for(i?=?0;i?<?10;i++)
	{
		if(pHandle->GetInData()==0)
		{
			AD7799_SetCREAD(pHandle,?FALSE);												//連續(xù)讀取模式關(guān)閉
			break;
		}
		SYS_DelayMS(10);
	}
	
	pHandle->SetCS(1);
	
	data?/=?CollCnt;																		//取得平均值

	return?data;
}
/*************************************************************************************************************
?*?文件名		:	AD7799.h
?*?功能			:	AD7799驅(qū)動(dòng)
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時(shí)間		:	2017-04-21
?*?最后修改時(shí)間	:	2018-06-06
?*?詳細(xì)			:	AD7799驅(qū)動(dòng)
					AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果
					依賴系統(tǒng)ms延時(shí)函數(shù)
*************************************************************************************************************/		
#ifndef?__AD7799_H__
#define?__AD7799_H__
#include?"system.h"



//AD7799寄存器定義
typedef?enum
{
	AD7799_REG_STATUS	=	0,	//狀態(tài)寄存器,8位
	AD7799_REG_MODE		=	1,	//模式寄存器,16位
	AD7799_REG_CONFIG	=	2,	//配置寄存器,16位
	AD7799_REG_DATA		=	3,	//數(shù)據(jù)寄存器,24位
	AD7799_REG_ID		=	4,	//ID寄存器,8位
	AD7799_REG_IO		=	5,	//IO寄存器,8位
	AD7799_REG_ZERO		=	6,	//零刻度校準(zhǔn)寄存器,24位
	AD7799_REG_FULL		=	7,	//滿刻度校準(zhǔn)寄存器,24位
}AD7799_REG_TYPE;


//工作模式選擇
typedef?enum
{
	AD7799_MODE_CONTINUOUS		=	0,		//連續(xù)轉(zhuǎn)換模式
	AD7799_MODE_SINGLE			=	1,		//單次轉(zhuǎn)換模式
	AD7799_MODE_IDLE			=	2,		//空閑模式
	AD7799_MODE_POWERDOWN		=	3,		//掉電模式
	AD7799_MODE_ZEROCALI		=	4,		//內(nèi)部零刻度校準(zhǔn)模式
	AD7799_MODE_FULLCALI		=	5,		//內(nèi)部滿刻度校準(zhǔn)模式
	AD7799_MODE_SYSZEROCALI		=	6,		//系統(tǒng)零刻度校準(zhǔn)模式
	AD7799_MODE_SYSFULLCALI		=	7,		//系統(tǒng)滿刻度校準(zhǔn)模式
}AD7799_MODE_TYPE;

//轉(zhuǎn)換速度設(shè)置
typedef?enum
{
	AD7799_SPEED_500HZ			=	1,
	AD7799_SPEED_250HZ			=	2,
	AD7799_SPEED_125HZ			=	3,
	AD7799_SPEED_62HZ			=	4,
	AD7799_SPEED_50HZ			=	5,
	AD7799_SPEED_39HZ			=	6,
	AD7799_SPEED_33HZ			=	7,
	AD7799_SPEED_19HZ			=	8,
	AD7799_SPEED_16_1HZ			=	9,?	//16.7HZ?80db?50hz濾波
	AD7799_SPEED_16_2HZ			=	10,?//16.7HZ?65b
	AD7799_SPEED_12HZ			=	11,
	AD7799_SPEED_10HZ			=	12,
	AD7799_SPEED_8HZ			=	13,
	AD7799_SPEED_6HZ			=	14,
	AD7799_SPEED_4HZ			=	15,
}AD7799_SPEED_TYPE;


//增益選擇
typedef?enum?
{
	AD7799_GAIN_1	=	0,
	AD7799_GAIN_2	=	1,
	AD7799_GAIN_4	=	2,
	AD7799_GAIN_8	=	3,
	AD7799_GAIN_16	=	4,
	AD7799_GAIN_32	=	5,
	AD7799_GAIN_64	=	6,
	AD7799_GAIN_128	=	7,
}AD7799_GAIN_TYPE;

//通道選擇
typedef?enum?
{
	AD7799_CH_AIN1	=	0,
	AD7799_CH_AIN2	=	1,
	AD7799_CH_AIN3	=	2,
	AD7799_CH_AVDD	=	7,	//電源監(jiān)控
}AD7799_CH_TYPE;

//AD7799通道配置
typedef?struct
{
	AD7799_GAIN_TYPE?Gain;		//增益
	AD7799_SPEED_TYPE?speed;	//轉(zhuǎn)換速度
	bool?isEnBurnout;			//是否開啟電流源
	bool?isUnipolar;			//是否使能單極性采集
	bool?isEnBuff;				//輸出緩沖	
}AD7799_CH_CONFIG;	


//AD7799句柄
typedef?struct
{
	void?(*SetCLK)(u8?Level);			//CLK輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	void?(*SetCS)(u8?Level);			//CS輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	void?(*SetOutData)(u8?Level);		//DOUT輸出控制回調(diào)(參數(shù)1:輸出高電平;0:輸出低電平)
	u8?(*GetInData)(void);				//DIN輸入回調(diào)(返回1:高電平;0:低電平)
	AD7799_CH_CONFIG?Config[3];			//存放3個(gè)通道的配置信息
}AD7799_HANDLE;

//相關(guān)函數(shù)
bool?AD7799_Init(AD7799_HANDLE?*pHandle,?void?(*SetCLK)(u8?Level),?void?(*SetCS)(u8?Level),?void?(*SetOutData)(u8?Level),?u8?(*GetInData)(void));	//AD7799初始化
u32?AD7799_ReadReg(AD7799_HANDLE?*pHandle,?AD7799_REG_TYPE?RegAddr);																				//讀取指定寄存器
void?AD7799_SetMode(AD7799_HANDLE?*pHandle,?AD7799_MODE_TYPE?mode,?AD7799_SPEED_TYPE?speed);														//設(shè)置模式
void?AD7799_SoftwareReset(AD7799_HANDLE?*pHandle);																									//軟復(fù)位
void?AD7799_SetCREAD(AD7799_HANDLE?*pHandle,?bool?Enable);																							//設(shè)置連續(xù)讀取模式開關(guān)
u32?AD7799_CReadData(AD7799_HANDLE?*pHandle,?bool?isCS);																							//快速讀取模式下讀取24bit數(shù)據(jù)
void?AD7799_SetConfig(AD7799_HANDLE?*pHandle,?bool?isEnBurnout,?bool?isUnipolar,?AD7799_GAIN_TYPE?Gain,?bool?isEnBuff,?AD7799_CH_TYPE?ch);			//AD7799配置
bool?AD7799_Calibration(AD7799_HANDLE?*pHandle,?AD7799_SPEED_TYPE?speed);																			//校準(zhǔn)模式
u32?AD7799_Coll(AD7799_HANDLE?*pHandle,?u8?ch,?u8?CollCnt);																							//AD7799采集數(shù)據(jù)

#endif?//__AD7799_H__


測(cè)試

//底層接口

/////////////////////////////////////////////////////////////////////////////////////////////
//AD7799支持
__inline?void?AD7799_DIO_OUT(u8?level)		{PBout(6)=level;}		//接芯片DIN
__inline?u8?AD7799_DIO_IN(void)				{return?PBin(7);}		//接芯片DOUT
__inline?void?AD7799_CS(u8?level)			{PBout(5)=level;}		//片選
__inline?void?AD7799_CLK(u8?level)			{PBout(4)=level;}		//時(shí)鐘

//AD7799硬件IO初始化
__inline?void?AD7799_IO_INIT(void)
{
	DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOB時(shí)鐘*/
	GPIOx_Init(GPIOB,BIT4|BIT5|BIT6,?OUT_PP,?SPEED_10M);
	GPIOx_Init(GPIOB,BIT7,?IN_IPU,?IN_IN);
}

//初始化

AD7799_HANDLE?AD7799_Handle;	//ad7799句柄
AD7799_IO_INIT();	//AD7799?IO硬件初始化
//切換到通道1,校準(zhǔn)通道1
	AD7799_SetConfig(&g_SysFlag.AD7799_Handle,?FALSE,?TRUE,?AD7799_GAIN_2,?FALSE,?AD7799_CH_AIN1);					//AD7799配置
	g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isEnBurnout?=?FALSE;			//電流源關(guān)閉
	g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isUnipolar?=?TRUE;			//單極性信號(hào)使能
	g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].Gain??=AD7799_GAIN_2;		//增益2
	g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].isEnBuff?=?FALSE;			//輸出緩沖使能
	g_SysFlag.AD7799_Handle.Config[AD7799_CH_AIN1].speed?=?AD7799_SPEED_50HZ;	//轉(zhuǎn)換速度
	if(AD7799_Calibration(&g_SysFlag.AD7799_Handle,?AD7799_SPEED_50HZ)==FALSE)
	{
		uart_printf("AD7799校準(zhǔn)失??!rn");
	}

//采集

temp?=?AD7799_Coll(&g_SysFlag.AD7799_Handle,?AD7799_CH_AIN1,?3);	
		
		
		ftemp?=?temp;
		ftemp?/=?0XFFFFFF;		//計(jì)算比例
		ftemp?/=?2;				//放大倍數(shù)為2
		ftemp*=2500;




本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉