6466|10

9790

帖子

24

TA的资源

版主

楼主
 

电容数字转换器AD7747测试代码 [复制链接]


AD7747是一款高分辨率、Σ-Δ型电容数字转换器(CDC)。要测量的电容可直接连接到器件输入端。该架构还具有高分辨率(24-bit无失码、最高19.5-bit有效分辨率)、高线性度(±0.01%)和高精度(±10 fF工厂校准)等固有特性。AD7747的电容输入范围是±8 pF(可变),而且可接受最大17 pF共模电容(不可变),后者可以通过一个可编程片内数字电容转换器(CAPDAC)来平衡。

代码使用MSP430FR5969测试,软件I2C,方便移植
因为官方只提供了AD7746测试代码,寄存器有些不同,引用了它的头文件并做修改
实际使用时遇到一个问题,我使用的软件模拟I2C在读取数据时写头SLV_ID,写SUB_ADDR后执行发停止位,然后重新发送SLV_ID读取当前地址的寄存器值,这是一个错误的写法,在以往的I2C传感器测试中没有出现过问题,原因应该是其它器件在收到停止位时并不会将寄存器重新指向零,而AD7747不同,如果发送停止位,寄存器会指针会移到0,再次执行读取时实际上是从零开始读取,后来将中间的停止位去掉后解决。



另外一个需要注意的是,为了保证数据的准确性,在启动连续转换模式时
一定要从数据输出寄存器的起始地址连续读取3个字节
如果分3次读取CAP_H,CAP_M,CAP_L这三个寄存器,可能会导致读取到的3个数据没有同步更新
比如刚读取了第一次转换的24位数据的高8位CAP_H后,如果间隔过长或者正好第二次数据转换完成后更新了输出寄存器
这时再读取CAP_M和CAP_L则对应了第2组24位数据的低16位



测试数据



  1. /*******************************************************************************
  2. * Copyright (C), 2017, littleshrimp(虾扯蛋)
  3. * FileName: main.c
  4. * Author: littleshrimp
  5. * Version : 1.0
  6. * Date:  2017-09-24 21:46
  7. * Description:
  8. * Function List: //
  9. * 1. -------
  10. * History:
  11. * <author>   <time>                <version >  <desc>
  12. * littleshrimp      2017-09-24 21:46        build this moudle
  13. ******************************************************************************/
  14. /*

  15.               MSP430FR5969
  16.             -----------------
  17.            |     P2.0/UCA0TXD|----> PC
  18.            |                 |
  19.            |                 |
  20.            |     P2.1/UCA0RXD|<---- PC
  21.            |                 |
  22.   SCL --o--|P3.5             |
  23.            |                 |
  24.   SDA --o--|P3.6             |

  25. */
  26. /*******************************************************************************
  27. *  * INCLUDES
  28. *  */

  29. #include "msp430.h"
  30. #include <stdio.h>
  31. #include <math.h>
  32. #include <stdint.h>
  33. #include "uart.h"
  34. #include "soft_i2c.h"
  35. #include "timer.h"
  36. /*******************************************************************************
  37. *  * MACROS
  38. *  */

  39. /*******************************************************************************
  40. *  * CONSTANTS
  41. *  */
  42. /* AD7746 Slave Address */
  43. #define AD7746_ADDRESS                  0x48

  44. /* AD7746 Slave Address */
  45. #define AD7746_RESET_CMD                0xBF

  46. /* AD7746 Register Definition */
  47. #define AD7746_REG_STATUS                        0
  48. #define AD7746_REG_CAP_DATA_HIGH                1
  49. #define AD7746_REG_CAP_DATA_MID                        2
  50. #define AD7746_REG_CAP_DATA_LOW                        3
  51. #define AD7746_REG_VT_DATA_HIGH                        4
  52. #define AD7746_REG_VT_DATA_MID                        5
  53. #define AD7746_REG_VT_DATA_LOW                        6
  54. #define AD7746_REG_CAP_SETUP                        7
  55. #define AD7746_REG_VT_SETUP                        8
  56. #define AD7746_REG_EXC_SETUP                        9
  57. #define AD7746_REG_CFG                                10
  58. #define AD7746_REG_CAPDACA                        11
  59. #define AD7746_REG_CAPDACB                        12
  60. #define AD7746_REG_CAP_OFFH                        13
  61. #define AD7746_REG_CAP_OFFL                        14
  62. #define AD7746_REG_CAP_GAINH                        15
  63. #define AD7746_REG_CAP_GAINL                        16
  64. #define AD7746_REG_VOLT_GAINH                        17
  65. #define AD7746_REG_VOLT_GAINL                        18

  66. /* AD7746_REG_STATUS bits */
  67. #define AD7746_STATUS_RDY                        (1 << 2)
  68. #define AD7746_STATUS_RDYVT                        (1 << 1)
  69. #define AD7746_STATUS_RDYCAP                        (1 << 0)

  70. /* AD7746_REG_CAP_SETUP bits */
  71. #define AD7746_CAPSETUP_CAPEN                        (1 << 7)
  72. #define AD7746_CAPSETUP_CAPDIFF                        (1 << 5)

  73. /* AD7746_REG_VT_SETUP bits */
  74. #define AD7746_VTSETUP_VTEN                        (1 << 7)
  75. #define AD7746_VTSETUP_VTMD_INT_TEMP                (0 << 5)
  76. #define AD7746_VTSETUP_VTMD_EXT_TEMP                (1 << 5)
  77. #define AD7746_VTSETUP_VTMD_VDD_MON                (2 << 5)
  78. #define AD7746_VTSETUP_VTMD_EXT_VIN                (3 << 5)
  79. #define AD7746_VTSETUP_EXTREF                        (1 << 4)
  80. #define AD7746_VTSETUP_VTSHORT                        (1 << 1)
  81. #define AD7746_VTSETUP_VTCHOP                        (1 << 0)

  82. /* AD7746_REG_EXC_SETUP bits */
  83. #define AD7746_EXCSETUP_EXCDAC                        (1 << 3)
  84. #define AD7746_EXCSETUP_EXCEN                         (1 << 2)
  85. #define AD7746_EXCSETUP_EXCLVL_VDD_8                (0 << 0)
  86. #define AD7746_EXCSETUP_EXCLVL_VDD_4                (1 << 0)
  87. #define AD7746_EXCSETUP_EXCLVL_VDD_3_8                (2 << 0)
  88. #define AD7746_EXCSETUP_EXCLVL_VDD_2                (3 << 0)

  89. /* AD7746_REG_CFG bits */
  90. #define AD7746_CONF_VTFS(x)                        (((x) & 0x3) << 6)
  91. #define AD7746_CONF_CAPFS(x)                        (((x) & 0x7) << 3)
  92. #define AD7746_CONF_MODE_IDLE                        (0 << 0)
  93. #define AD7746_CONF_MODE_CONT_CONV                (1 << 0)
  94. #define AD7746_CONF_MODE_SINGLE_CONV                (2 << 0)
  95. #define AD7746_CONF_MODE_PWRDN                        (3 << 0)
  96. #define AD7746_CONF_MODE_OFFS_CAL                (5 << 0)
  97. #define AD7746_CONF_MODE_GAIN_CAL                (6 << 0)

  98. /* AD7746_REG_CAPDACx bits */
  99. #define AD7746_CAPDAC_DACEN                        (1 << 7)
  100. #define AD7746_CAPDAC_DACP(x)                        ((x) & 0x7F)
  101. /*******************************************************************************
  102. *  * TYPEDEFS
  103. *  */

  104. /*******************************************************************************
  105. *  * GLOBAL VARIABLES
  106. *  */

  107. /*******************************************************************************
  108. *  * EXTERNAL VARIABLES
  109. *  */

  110. /*******************************************************************************
  111. *  * EXTERNAL FUNCTIONS
  112. *  */

  113. /*******************************************************************************
  114. *  * LOCAL VARIABLES
  115. *  */
  116.   

  117. uint8_t txBuf[40];
  118. uint8_t rxBuf[40];
  119. float cap,vt;
  120. /*******************************************************************************
  121. *  * PROFILE CALLBACKS
  122. *  */

  123. /*******************************************************************************
  124. *  * LOCAL FUNCTIONS
  125. *  */
  126. void dco_init(void);
  127. /*******************************************************************************
  128. *  * PUBLIC FUNCTIONS
  129. *  */

  130. void delay(int32_t d)
  131. {
  132.   while(d--)
  133.   {
  134.     __delay_cycles(1000);
  135.   }
  136. }
  137. void AD7746_Reset(void)
  138. {
  139.     uint8_t cmd = 0;
  140.    
  141.     cmd = AD7746_RESET_CMD;
  142.     i2c_write_n_byte(AD7746_ADDRESS << 1,cmd,txBuf,0);
  143. }
  144. void AD7747_Init(void)
  145. {
  146.     AD7746_Reset();
  147.     delay_ms(6000);
  148.     //AD7746_REG_VT_SETUP
  149.     txBuf[0] = AD7746_CAPSETUP_CAPEN | AD7746_CAPSETUP_CAPDIFF;
  150.     //AD7746_REG_VT_SETUP
  151.     txBuf[1] = AD7746_VTSETUP_VTEN | AD7746_VTSETUP_VTMD_INT_TEMP| AD7746_VTSETUP_VTCHOP;
  152.     //AD7746_REG_EXC_SETUP
  153.     txBuf[2] = AD7746_EXCSETUP_EXCDAC | AD7746_EXCSETUP_EXCEN | AD7746_EXCSETUP_EXCLVL_VDD_3_8 ;
  154.     //AD7746_REG_CFG
  155.     txBuf[3] = AD7746_CONF_MODE_CONT_CONV;
  156.     //AD7746_REG_CAPDACA
  157.     txBuf[4] = AD7746_CAPDAC_DACEN | AD7746_CAPDAC_DACP(0x00);
  158.     //AD7746_REG_CAPDACB
  159.     txBuf[5] = AD7746_CAPDAC_DACEN | AD7746_CAPDAC_DACP(0x00);
  160.     //
  161.     i2c_write_n_byte(AD7746_ADDRESS << 1,AD7746_REG_CAP_SETUP, txBuf,6);
  162. }
  163. float AD7747_GetVT(void)
  164. {
  165.     uint32_t temp;
  166.     rxBuf[0] = AD7746_STATUS_RDYVT;
  167.     while(!(rxBuf[0] & AD7746_STATUS_RDYVT))
  168.     {
  169.         i2c_read_n_byte(AD7746_ADDRESS << 1,AD7746_REG_STATUS,rxBuf,1);
  170.     }
  171.     i2c_read_n_byte(AD7746_ADDRESS << 1,AD7746_REG_VT_DATA_HIGH,rxBuf,3);
  172.     temp = ((uint32_t)rxBuf[0] << 16) + ((uint32_t)rxBuf[1] << 8) + rxBuf[0];
  173.     return (float)temp / 2048.00 - 4096.00;
  174. }
  175. float AD7747_GetCAP(void)
  176. {   
  177.     int32_t capData = AD7746_STATUS_RDYCAP;
  178.    
  179.     rxBuf[0] = 0;
  180.     while(!(rxBuf[0] & AD7746_STATUS_RDYCAP))
  181.     {
  182.         i2c_read_n_byte(AD7746_ADDRESS << 1,AD7746_REG_STATUS,rxBuf,1);
  183.     }
  184.     i2c_read_n_byte(AD7746_ADDRESS << 1,AD7746_REG_CAP_DATA_HIGH,rxBuf,3);

  185.     capData = ((uint32_t)rxBuf[0] << 16) + ((uint32_t)rxBuf[1] << 8) + rxBuf[0];
  186.     capData -= 8388607;
  187.     return (float)capData / 8388607.00 * 8.192;
  188. }
  189. int main( void )
  190. {
  191.   char outBuf[64];//base64缓存
  192.   WDTCTL = WDTPW + WDTHOLD;//停止看门狗
  193.   PM5CTL0 &= ~LOCKLPM5;//这个是一定要加的,不然GPIO不能使用
  194.   dco_init();
  195.   i2c_init();//初始化I2C
  196.   AD7747_Init();
  197.   uart_init();
  198.   while(1)
  199.   {
  200.     vt = AD7747_GetVT();
  201.     cap = AD7747_GetCAP();
  202.     sprintf(outBuf,"%.6f\t%.2f",cap,vt);
  203.     uart_tx_string(outBuf);//输出到PC
  204.     uart_tx_string("\r\n");//换行
  205.     delay(1000);
  206.   }
  207. }
  208. void dco_init(void)
  209. {  
  210.   // Configure one FRAM waitstate as required by the device datasheet for MCLK
  211.   // operation beyond 8MHz _before_ configuring the clock system.
  212.   FRCTL0 = FRCTLPW | NWAITS_1;

  213.   // Clock System Setup
  214.   CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  215.   CSCTL1 = DCORSEL | DCOFSEL_4;             // Set DCO to 16MHz
  216.   CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO,
  217.                                             // ACLK = VLOCLK
  218.   CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  219.   CSCTL0_H = 0;                             // Lock CS registers
  220. }
复制代码


1.msp430fr5969 soft i2c AD7747.rar (18.03 KB, 下载次数: 171)
此帖出自传感器论坛

最新回复

楼主,我们有成熟的高精度数据采集解决方案,接受定制化需求,精度稳定性可以样品实测,有兴趣可以聊聊,QQ:2049436443  详情 回复 发表于 2017-11-18 15:24
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报

5310

帖子

453

TA的资源

五彩晶圆(高级)

沙发
 
片子虽好,可电容输入范围太小了!应用比较局限
此帖出自传感器论坛

点评

和它的定位有关 测量液位 接近 和位置这些还是够用的 如果量程能达到几百纳法就更好了 可以直接测量湿度传感器  详情 回复 发表于 2017-9-25 12:17
 
 
 

回复

975

帖子

2

TA的资源

纯净的硅(初级)

板凳
 
还有这种芯片……pF的电容量我用手一摸就出来了
此帖出自传感器论坛

点评

隔着玻璃摸都能测出来  详情 回复 发表于 2017-9-25 12:18
 
 
 

回复

599

帖子

2

TA的资源

版主

4
 
东西好,我原先还用这个片子做过一个自动安平系统呢。
此帖出自传感器论坛

点评

自动安平是干什么用的?  详情 回复 发表于 2017-9-25 12:18
个人签名有的时候要求软硬件必须并排走,哪个走的稍快一些都会被另外一个拖住的。

业务联系:

QQ:3265386825
e-Mail: yichunscp@163.com
 
 
 

回复

9790

帖子

24

TA的资源

版主

5
 
蓝雨夜 发表于 2017-9-24 22:30
片子虽好,可电容输入范围太小了!应用比较局限

和它的定位有关  测量液位 接近 和位置这些还是够用的
如果量程能达到几百纳法就更好了
可以直接测量湿度传感器
此帖出自传感器论坛
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

9790

帖子

24

TA的资源

版主

6
 
飞鸿浩劫 发表于 2017-9-24 22:38
还有这种芯片……pF的电容量我用手一摸就出来了

隔着玻璃摸都能测出来
此帖出自传感器论坛
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

9790

帖子

24

TA的资源

版主

7
 
yichun417 发表于 2017-9-25 10:48
东西好,我原先还用这个片子做过一个自动安平系统呢。

自动安平是干什么用的?
此帖出自传感器论坛

点评

用在测量领域,就是让一个平台的承载面一直处在绝对水平的位置,即使平台自身发生倾斜。  详情 回复 发表于 2017-9-25 13:02
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

599

帖子

2

TA的资源

版主

8
 
littleshrimp 发表于 2017-9-25 12:18
自动安平是干什么用的?

用在测量领域,就是让一个平台的承载面一直处在绝对水平的位置,即使平台自身发生倾斜。
此帖出自传感器论坛

点评

用电容传感器是怎么实现的?能简单说说原理吗  详情 回复 发表于 2017-9-25 13:25
个人签名有的时候要求软硬件必须并排走,哪个走的稍快一些都会被另外一个拖住的。

业务联系:

QQ:3265386825
e-Mail: yichunscp@163.com
 
 
 

回复

9790

帖子

24

TA的资源

版主

9
 
yichun417 发表于 2017-9-25 13:02
用在测量领域,就是让一个平台的承载面一直处在绝对水平的位置,即使平台自身发生倾斜。

用电容传感器是怎么实现的?能简单说说原理吗
此帖出自传感器论坛
 
 
 

回复

210

帖子

0

TA的资源

一粒金砂(高级)

10
 
相关技术问题,供参考https://ezchina.analog.com/content?query=AD7747
此帖出自传感器论坛
 
 
 

回复

50

帖子

0

TA的资源

一粒金砂(中级)

11
 
楼主,我们有成熟的高精度数据采集解决方案,接受定制化需求,精度稳定性可以样品实测,有兴趣可以聊聊,QQ:2049436443
此帖出自传感器论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表