工程师必备!AD7799 驱动程序
扫描二维码
随时随地手机看文章
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;





