当前位置:首页 > 芯闻号 > 充电吧
[导读]24bit高精度ADC,支持双极性信号,使用时如果需要使用内部增益,不能将VIN-接GND。/*****************************************************

24bit高精度ADC,支持双极性信号,使用时如果需要使用内部增益,不能将VIN-接GND。

/*************************************************************************************************************
 * 文件名		:	AD7799.c
 * 功能			:	AD7799驱动
 * 作者			:	cp1300@139.com
 * 创建时间		:	2017-04-21
 * 最后修改时间	:	2018-06-06
 * 详细			:	AD7799驱动
					AD7799的输入脚需要保持低电平,连续采集模式下必须片选有效,否则不产生RDY结果
					依赖系统ms延时函数
					如果需要使用内部增益>2,那么VIN-不能接GND,必须接基准源,并且输入的差分信号需要在指定范围内。
*************************************************************************************************************/		
#include "SYSTEM.H"
#include "GPIO_INIT.H"
#include "AD7799.H"


//调试开关
#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寄存器长度,单位字节



/*************************************************************************************************************************
* 函数		:	bool AD7799_Init(AD7799_HANDLE *pHandle, void (*SetCLK)(u8 Level), void (*SetCS)(u8 Level), void (*SetOutData)(u8 Level), u8 (*GetInData)(void))
* 功能		:	AD7799初始化
* 参数		:	pHandle:句柄;SetCLK:CLK输出控制回调;SetCS:CS输出回调;SetOutData:输出输出DOUT回调;GetInData:数据输入DIN回调
* 返回		:	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输出控制回调(参数1:输出高电平;0:输出低电平)
	pHandle->SetCS = SetCS;						//CS输出控制回调(参数1:输出高电平;0:输出低电平)
	pHandle->SetOutData = SetOutData;			//DOUT输出控制回调(参数1:输出高电平;0:输出低电平)
	pHandle->GetInData = GetInData;				//DIN输入回调(返回1:高电平;0:低电平)
	
	//开始初始化芯片
	pHandle->SetCS(1);							//CS默认高电平
	pHandle->SetCLK(1);							//CLK默认高电平
	pHandle->SetOutData(0);						//默认输出低电平
	
	SYS_DelayMS(10);							//延时10ms等待供电稳定
	AD7799_SoftwareReset(pHandle);				//系统软复位
	SYS_DelayMS(20);
	for(retry = 0;retry < 8;retry ++)			//循环读取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);	//读取状态
	if(temp & BIT5)
	{
		ad7799_debug("AD7799参考故障,状态(%02X)rn",temp);
	}
	
	ad7799_debug("AD7799初始化成功,ID(%02X)rn",id);
	return TRUE;
}





/*************************************************************************************************************************
* 函数		:	u8 AD7799_ReadWriteByte(AD7799_HANDLE *pHandle, u8 data)
* 功能		:	AD7799读写一字节
* 参数		:	pHandle:句柄;data:需要写入的数据
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	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;
}




/*************************************************************************************************************************
* 函数		:	u32 AD7799_ReadReg(AD7799_HANDLE *pHandle, AD7799_REG_TYPE RegAddr)
* 功能		:	AD7799读取一个寄存器
* 参数		:	pHandle:句柄;RegAddr:寄存器地址
* 返回		:	读取的数据
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	会使能片选,会自动判断寄存器长度,并进行读取
*************************************************************************************************************************/
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);								//片选拉低,准备读写数据
	nop;nop;
	data |= BIT6;									//R/W位为1,读取数据
	data |= RegAddr << 3;							//寄存器地址
	AD7799_ReadWriteByte(pHandle, data);			//写入命令,读取指定寄存器
	data = 0;
	for(i = 0;i<AD7799_REG_LEN[RegAddr];i ++)
	{
		data <SetCS(1);								//片选恢复
	pHandle->SetOutData(0);							//DOUT=0 默认输出低电平
	
	return data;
}

/*************************************************************************************************************************
* 函数		:	void AD7799_WriteReg(AD7799_HANDLE *pHandle, AD7799_REG_TYPE RegAddr, u32 RegData)
* 功能		:	AD7799写一个寄存器
* 参数		:	pHandle:句柄;RegAddr:寄存器地址;RegData:需要写入的值
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	会使能片选,会自动判断寄存器长度,并进行写入
*************************************************************************************************************************/
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);								//片选拉低,准备读写数据
	nop;nop;
	data |= RegAddr << 3;							//寄存器地址
	AD7799_ReadWriteByte(pHandle, data);			//写入命令,写指定寄存器
	for(i = 0;i>((AD7799_REG_LEN[RegAddr]-1-i)*8));	//写入数据
	}

	pHandle->SetCS(1);								//片选恢复
	pHandle->SetOutData(0);							//DOUT=0 默认输出低电平
}


/*************************************************************************************************************************
* 函数		:	void AD7799_SetMode(AD7799_HANDLE *pHandle, AD7799_MODE_TYPE mode, AD7799_SPEED_TYPE speed)
* 功能		:	AD7799设置采集模式
* 参数		:	pHandle:句柄;mode:模式,见AD7799_MODE_TYPE;speed:采样速度,见AD7799_SPEED_TYPE
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	设置采集模式
*************************************************************************************************************************/
void AD7799_SetMode(AD7799_HANDLE *pHandle, AD7799_MODE_TYPE mode, AD7799_SPEED_TYPE speed)
{
	u16 data = 0;
	
	data |= mode << 13;					//模式设置
	data |= speed & 0xf;				//转换速度设置
	
	AD7799_WriteReg(pHandle, AD7799_REG_MODE, data);
}



/*************************************************************************************************************************
* 函数		:	void AD7799_SoftwareReset(AD7799_HANDLE *pHandle)
* 功能		:	AD7799软件复位
* 参数		:	pHandle:句柄
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	连续发送32个1到AD7799会进行复位,所有寄存器复位到原始值
*************************************************************************************************************************/
void AD7799_SoftwareReset(AD7799_HANDLE *pHandle)
{
	pHandle->SetCS(0);								//片选拉低,准备读写数据
	nop;nop;
	AD7799_ReadWriteByte(pHandle, 0XFF);			//发送32个1
	AD7799_ReadWriteByte(pHandle, 0XFF);			//发送32个1
	AD7799_ReadWriteByte(pHandle, 0XFF);			//发送32个1
	AD7799_ReadWriteByte(pHandle, 0XFF);			//发送32个1
	
	pHandle->SetCS(1);								//片选恢复
	pHandle->SetOutData(0);							//DOUT=0 默认输出低电平
}



/*************************************************************************************************************************
* 函数		:	void AD7799_SetCREAD(AD7799_HANDLE *pHandle, bool Enable)
* 功能		:	AD7799快速读取模式开关
* 参数		:	pHandle:句柄;Enable:TRUE:开启快速读取模式;FALSE:关闭快速读取模式
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	开启快速读取模式后,可直接快速读取采集的数据,无效发送读取命令
				使能连续可读模式,必须在通信寄存器中写入01011100;当RDY变为低时,向通信寄存器中写入01011000,退出连续可读模式。
				当在连续可读模式下,ADC检测到DIN脚的有效活动,也会退出连续可读模式。另外,如果在DIN管脚上连续输入32位的高电平,AD被复位。
				因此,当在连续读模式下DIN脚应被置为低电平直到一个新的命令写入设备。
				警告:开启连续读取后必须在RDY变为低电平后发送此命令(不能发送别的命令)
*************************************************************************************************************************/
void AD7799_SetCREAD(AD7799_HANDLE *pHandle, bool Enable)
{
	pHandle->SetCS(0);								//片选拉低,准备读写数据
	nop;nop;
	if(Enable)										//使能连续读取模式
	{
		AD7799_ReadWriteByte(pHandle, 0x5C);		//开启连续读取模式
		AD7799_ReadWriteByte(pHandle, 0);			
		AD7799_ReadWriteByte(pHandle, 0);			
	}
	else
	{
		AD7799_ReadWriteByte(pHandle, 0x58);		//关闭连续读取模式
		AD7799_ReadWriteByte(pHandle, 0XFF);			
		AD7799_ReadWriteByte(pHandle, 0XFF);			
	}
	
	pHandle->SetCS(1);								//片选恢复
	pHandle->SetOutData(0);							//DOUT=0 默认输出低电平
	
}


/*************************************************************************************************************************
* 函数		:	u32 AD7799_CReadData(AD7799_HANDLE *pHandle, bool isCS)
* 功能		:	AD7799快速读取采集结果
* 参数		:	pHandle:句柄;isCS:TRUE:需要控制片选;FALSE:无需控制片选
* 返回		:	24bit的采集结果
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	必须先开启快速读取模式,开启后可以进行快速读取
*************************************************************************************************************************/
u32 AD7799_CReadData(AD7799_HANDLE *pHandle, bool isCS)
{
	u32 data = 0;
	u8 i;
	
	if(isCS)											//需要使能片选
	{
		pHandle->SetCS(0);								//片选拉低,准备读写数据
		nop;nop;
	}
	
	for(i = 0;i < 3;i ++)
	{
		data <SetCS(1);								//片选恢复
		pHandle->SetOutData(0);							//DOUT=0 默认输出低电平
	}
	
	return data;
}


/*************************************************************************************************************************
* 函数		:	void AD7799_SetConfig(AD7799_HANDLE *pHandle, bool isEnBurnout, bool isUnipolar, AD7799_GAIN_TYPE Gain, bool isEnBuff, AD7799_CH_TYPE ch)
* 功能		:	AD7799配置
* 参数		:	pHandle:句柄;isEnBurnout:是否开启电流源;isUnipolar:是否使能单极性采集;Gain:增益设置,见AD7799_GAIN_TYPE;isEnBuff:是否开启缓冲器
				ch:采集通道选择,见AD7799_CH_TYPE
* 返回		:	无
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-21
* 最后修改	: 	2018-06-06
* 说明		: 	用于设置AD7799,默认已经开启了参考保护
*************************************************************************************************************************/
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;							//增益设置
	data |= BIT5;										//参考保护开启
	if(isEnBuff)		data |= BIT4;					//使能buff,缓冲器
	data |= ch&0x7;										//通道选择
	
	AD7799_WriteReg(pHandle, AD7799_REG_CONFIG, data);	//写入配置寄存器
}



/*************************************************************************************************************************
* 函数		:	bool AD7799_Calibration(AD7799_HANDLE *pHandle, AD7799_SPEED_TYPE speed)
* 功能		:	AD7799校准模式
* 参数		:	pHandle:句柄;speed:转换速度
* 返回		:	FALSE:校准失败;TRUE:校准成功
* 依赖		:	底层宏定义
* 作者		:	cp1300@139.com
* 时间		:	2017-04-27
* 最后修改	: 	2018-06-06
* 说明		: 	校准前需要先设置通道,使用的是内部校准模式
				片内满度校准不能在增益为128的情况下进行。为尽量减少满度误差,每次的通道的增益改变都需要进行满度校准。
*************************************************************************************************************************/
bool AD7799_Calibration(AD7799_HANDLE *pHandle, AD7799_SPEED_TYPE speed)
{
	u8 delay = 0;
	
	AD7799_SetMode(pHandle, AD7799_MODE_IDLE, speed);		//先进入空闲模式	
	AD7799_SetMode(pHandle, AD7799_MODE_ZEROCALI, speed);	//内部零刻度校准模式
	pHandle->SetCS(0);	
	if(pHandle->GetInData()==0) 
	{
		ad7799_debug("校准失败,提前有低电平!rn");
		pHandle->SetCS(1);	
		return FALSE;
	}
	delay = 0;
	while(pHandle->GetInData()==1) 
	{
		SYS_DelayMS(10);
		delay ++;
		if(delay > 100) 
		{
			ad7799_debug("校准失败,等待校准结束超时!rn");
			pHandle->SetCS(1);	
			return FALSE;
		}
	}
	pHandle->SetCS(1);	
	
	AD7799_SetMode(pHandle, AD7799_MODE_FULLCALI, speed);	//内部满刻度校准模式
	pHandle->SetCS(0);
	if(pHandle->GetInData()==0) 
	{
		ad7799_debug("校准失败1,提前有低电平!rn");
		pHandle->SetCS(1);
		return FALSE;
	}
	delay = 0;
	while(pHandle->GetInData()==1) 
	{
		SYS_DelayMS(10);
		delay ++;
		if(delay > 100) 
		{
			ad7799_debug("校准失败1,等待校准结束超时!rn");
			pHandle->SetCS(1);
			return FALSE;
		}
	}
	pHandle->SetCS(1);
	
	return TRUE;
}






/*************************************************************************************************************************
* 函数		:	u32 AD7799_Coll(AD7799_HANDLE *pHandle, u8 ch, u8 CollCnt)
* 功能		:	AD7799采集数据
* 参数		:	pHandle:句柄;ch:通道0-2;CollCnt:采集次数(用于滤波)
* 返回		:	采集的结果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);						//连续采集模式开启
	//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);																	//连续读取模式使能
	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);
	}
	
	//退出连续读取模式
	for(i = 0;i < 10;i++)
	{
		if(pHandle->GetInData()==0)
		{
			AD7799_SetCREAD(pHandle, FALSE);												//连续读取模式关闭
			break;
		}
		SYS_DelayMS(10);
	}
	
	pHandle->SetCS(1);
	
	data /= CollCnt;																		//取得平均值

	return data;
}
/*************************************************************************************************************
 * 文件名		:	AD7799.h
 * 功能			:	AD7799驱动
 * 作者			:	cp1300@139.com
 * 创建时间		:	2017-04-21
 * 最后修改时间	:	2018-06-06
 * 详细			:	AD7799驱动
					AD7799的输入脚需要保持低电平,连续采集模式下必须片选有效,否则不产生RDY结果
					依赖系统ms延时函数
*************************************************************************************************************/		
#ifndef __AD7799_H__
#define __AD7799_H__
#include "system.h"



//AD7799寄存器定义
typedef enum
{
	AD7799_REG_STATUS	=	0,	//状态寄存器,8位
	AD7799_REG_MODE		=	1,	//模式寄存器,16位
	AD7799_REG_CONFIG	=	2,	//配置寄存器,16位
	AD7799_REG_DATA		=	3,	//数据寄存器,24位
	AD7799_REG_ID		=	4,	//ID寄存器,8位
	AD7799_REG_IO		=	5,	//IO寄存器,8位
	AD7799_REG_ZERO		=	6,	//零刻度校准寄存器,24位
	AD7799_REG_FULL		=	7,	//满刻度校准寄存器,24位
}AD7799_REG_TYPE;


//工作模式选择
typedef enum
{
	AD7799_MODE_CONTINUOUS		=	0,		//连续转换模式
	AD7799_MODE_SINGLE			=	1,		//单次转换模式
	AD7799_MODE_IDLE			=	2,		//空闲模式
	AD7799_MODE_POWERDOWN		=	3,		//掉电模式
	AD7799_MODE_ZEROCALI		=	4,		//内部零刻度校准模式
	AD7799_MODE_FULLCALI		=	5,		//内部满刻度校准模式
	AD7799_MODE_SYSZEROCALI		=	6,		//系统零刻度校准模式
	AD7799_MODE_SYSFULLCALI		=	7,		//系统满刻度校准模式
}AD7799_MODE_TYPE;

//转换速度设置
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,	//电源监控
}AD7799_CH_TYPE;

//AD7799通道配置
typedef struct
{
	AD7799_GAIN_TYPE Gain;		//增益
	AD7799_SPEED_TYPE speed;	//转换速度
	bool isEnBurnout;			//是否开启电流源
	bool isUnipolar;			//是否使能单极性采集
	bool isEnBuff;				//输出缓冲	
}AD7799_CH_CONFIG;	


//AD7799句柄
typedef struct
{
	void (*SetCLK)(u8 Level);			//CLK输出控制回调(参数1:输出高电平;0:输出低电平)
	void (*SetCS)(u8 Level);			//CS输出控制回调(参数1:输出高电平;0:输出低电平)
	void (*SetOutData)(u8 Level);		//DOUT输出控制回调(参数1:输出高电平;0:输出低电平)
	u8 (*GetInData)(void);				//DIN输入回调(返回1:高电平;0:低电平)
	AD7799_CH_CONFIG Config[3];			//存放3个通道的配置信息
}AD7799_HANDLE;

//相关函数
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);														//设置模式
void AD7799_SoftwareReset(AD7799_HANDLE *pHandle);																									//软复位
void AD7799_SetCREAD(AD7799_HANDLE *pHandle, bool Enable);																							//设置连续读取模式开关
u32 AD7799_CReadData(AD7799_HANDLE *pHandle, bool isCS);																							//快速读取模式下读取24bit数据
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);																			//校准模式
u32 AD7799_Coll(AD7799_HANDLE *pHandle, u8 ch, u8 CollCnt);																							//AD7799采集数据

#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,校准通道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;			//电流源关闭
	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;	//转换速度
	if(AD7799_Calibration(&g_SysFlag.AD7799_Handle, AD7799_SPEED_50HZ)==FALSE)
	{
		uart_printf("AD7799校准失败!rn");
	}

//采集

temp = AD7799_Coll(&g_SysFlag.AD7799_Handle, AD7799_CH_AIN1, 3);	
		
		
		ftemp = temp;
		ftemp /= 0XFFFFFF;		//计算比例
		ftemp /= 2;				//放大倍数为2
		ftemp*=2500;




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭