www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

/*************************************************************************************************************
?*?文件名		:	AD7799.c
?*?功能			:	AD7799驅(qū)動
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時間		:	2017-04-21
?*?最后修改時間	:	2018-06-06
?*?詳細(xì)			:	AD7799驅(qū)動
					AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果
					依賴系統(tǒng)ms延時函數(shù)
					如果需要使用內(nèi)部增益>2,那么VIN-不能接GND,必須接基準(zhǔn)源,并且輸入的差分信號需要在指定范圍內(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寄存器長度,單位字節(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
*?時間		:	2017-04-21
*?最后修改	:?	2017-04-21
*?說明		:?	初始化檢測ID,ID不對會返回失敗
*************************************************************************************************************************/
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);							//延時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
*?時間		:	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讀取一個寄存器
*?參數(shù)		:	pHandle:句柄;RegAddr:寄存器地址
*?返回		:	讀取的數(shù)據(jù)
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	會使能片選,會自動判斷寄存器長度,并進(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寫一個寄存器
*?參數(shù)		:	pHandle:句柄;RegAddr:寄存器地址;RegData:需要寫入的值
*?返回		:	無
*?依賴		:	底層宏定義
*?作者		:	cp1300@139.com
*?時間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	會使能片選,會自動判斷寄存器長度,并進(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
*?時間		:	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
*?時間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	連續(xù)發(fā)送32個1到AD7799會進(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個1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個1
	AD7799_ReadWriteByte(pHandle,?0XFF);			//發(fā)送32個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
*?時間		:	2017-04-21
*?最后修改	:?	2018-06-06
*?說明		:?	開啟快速讀取模式后,可直接快速讀取采集的數(shù)據(jù),無效發(fā)送讀取命令
				使能連續(xù)可讀模式,必須在通信寄存器中寫入01011100;當(dāng)RDY變?yōu)榈蜁r,向通信寄存器中寫入01011000,退出連續(xù)可讀模式。
				當(dāng)在連續(xù)可讀模式下,ADC檢測到DIN腳的有效活動,也會退出連續(xù)可讀模式。另外,如果在DIN管腳上連續(xù)輸入32位的高電平,AD被復(fù)位。
				因此,當(dāng)在連續(xù)讀模式下DIN腳應(yīng)被置為低電平直到一個新的命令寫入設(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
*?時間		:	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
*?時間		:	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
*?時間		:	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é)束超時!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é)束超時!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
*?時間		:	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ū)動
?*?作者			:	cp1300@139.com
?*?創(chuàng)建時間		:	2017-04-21
?*?最后修改時間	:	2018-06-06
?*?詳細(xì)			:	AD7799驅(qū)動
					AD7799的輸入腳需要保持低電平,連續(xù)采集模式下必須片選有效,否則不產(chǎn)生RDY結(jié)果
					依賴系統(tǒng)ms延時函數(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個通道的配置信息
}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__


測試

//底層接口

/////////////////////////////////////////////////////////////////////////////////////////////
//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;}		//時鐘

//AD7799硬件IO初始化
__inline?void?AD7799_IO_INIT(void)
{
	DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOB時鐘*/
	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;			//單極性信號使能
	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)失?。n");
	}

//采集

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




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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉