AD7745/AD7746简介
简介
AD7745/AD7746,24位CDC(Capacitance-to-Digital Converter)转换芯片。AD7745单路,AD7746为双路输入。
测量范围+-4pF,最大偏置电容为17pF。数据更新频率10~90HZ
I2C接口
2.7V~5.25V供电
0.7mA电流消耗
封装:TSSOP-16
除了CDC的转换,芯片还自带片上温度传感器,及电压输入通道。这里我们只简单介绍CDC的一种使用方式,也不探究其内部的具体实现方式。
虽然测量范围+-4pF,可以通扩容的方式增大测量范围
主要用于压力、位置、湿度等的测量
如下是管脚分布图
使用电路
这个是测量的电路图,CIN+与CIN-两个管脚输入,同时配置两个偏置电容形成最基本的测量电路。
激励管脚是不能省略的,必须要使用上。
电容的测量值由下面的公式来得到
同时配置输入管脚与偏置电容,可以将测量的范围移动来达到我们的测量要求。
单管脚输入
有时我们并不需求测量两个电容,可以通过将CAPDIFF设置为0设置为单管脚输入,同时CAPDAC(-)维持默认0即可。
上图将CAPDAC(+)设置为17pF,这样整个测量范围就调整为13~21pF。
扩容电路
+-4pF的测量范围并不能满足很多电容的测量,还可以配置双激励管脚与电阻分压的方式。
将测量范围进行扩容,扩容的同时偏置电容的值也会进行相应的扩容。
扩容比例为
EXCA与EXCB需要在EXCSETUP的寄存器中配置为反向。同时EXC的LEVEL也需要配置为VCC/2
扩容比例理解
原始激励源以VCC/2为基点,振幅为VCC/2
EXCA为VCC,EXCB为0时,激励点电压为 \(\frac{R_2*VCC}{R_1+R_2}\)
EXCA为0,EXCB为VCC时,激励点电压为 \(\frac{R_1*VCC}{R_1+R_2}\)
振幅为\(\frac{R_2*VCC}{R_1+R_2} - \frac{VCC}{2} = \frac{(R_2 - R_1)*VCC}{2(R_1+R_2)}\)
\(K = \frac{VCC}{2} / \frac{(R_2 - R_1)*VCC}{2(R_1+R_2)} = \frac{R_2 + R_1}{R_2 - R_1}\)
这样就可以得出文档中K值的意义了
寄存器设置
I2C设备地址
设备地址为0x48
复位
写入寄存器地址为0xBF时发生复位操作
STATUS
通过判断RDYCAP来确认数据是否准备好了,再读取相当的CAP的测量值
CAPSETUP
CAPEN使能
CADDIFF配置单管脚输入
CAPCHOP配置用加长时间,提高精度
EXCSETUP
配置激励源的两个管脚的极性与幅值
CONFIGURE
配置转换时间与转换模式
CAPDACA
高位设置是否使能
低7位为具体的值,配置偏置电容,最大17pF,按7位成比例放大
CAPDATA
示例代码
rt_uint8_t capSetupCmd = AD7745_CAPSETUP_CAPEN | AD7745_VTSETUP_VTCHOP;
rt_uint8_t excSetupCmd = AD7745_EXCSETUP_NEXCB | AD7745_EXCSETUP_EXCA | AD7745_EXCSETUP_EXCLVL_VDD_DIV_2;
rt_uint8_t configureCmd = AD7745_CONF_V_TF_62MS_1 | AD7745_CONF_C_F_62MS_0 | AD7745_CONF_MODE_CONT_CONV;
rt_uint8_t capDacACmd = 0x5d | AD7745_CAPDAC_DACEN;
/*********************************************************
*********************************************************/
static rt_err_t ad7745_init(rt_device_t dev)
{
ad7745_i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(AD7745_I2C_BUS_NAME);
if(ad7745_i2c_bus == RT_NULL)
rt_kprintf("can't find %s device!\n", AD7745_I2C_BUS_NAME);
ad7745_write_reg(AD7745_REG_EXC_SETUP, &excSetupCmd, 1);
ad7745_write_reg(AD7745_REG_CFG, &configureCmd, 1);
ad7745_write_reg(AD7745_REG_CAP_SETUP, &capSetupCmd, 1);
ad7745_write_reg(AD7745_REG_CAPDACA, &capDacACmd, 1);
return RT_EOK;
}
/*********************************************************
*********************************************************/
static rt_size_t ad7745_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
{
rt_uint8_t status = AD7745_STATUS_RDYCAP;
ad7745_read_reg(AD7745_REG_STATUS, &status, 1);
while(status & AD7745_STATUS_RDYCAP)
{
ad7745_read_reg(AD7745_REG_STATUS, &status, 1);
rt_thread_mdelay(20);
}
if(size == 3)
ad7745_read_reg(AD7745_REG_CAP_DATA_HIGH, buffer, size);
else
size = 0;
return size;
}
总结
AD7745/6是一款高精度的电容数字转换芯片,I2C通信方式使用起来也比较方便。