陈拓 2021/02/09-2021/02/19
1. 概述
电容式传感是一种低功耗、低成本且高分辨率的非接触式感测技术, 适用于从接近检测、手势识别到远程液位感测的各项应用。电容式传感系统中的传感器可以采用任意金属或导体,因此可实现高度灵活的低成本系统设计。
FDC2214是Ti公司的一款低功耗高精度的电容传感器芯片,使用I2C接口。
- 特性
- 官方网址
https://www.ti.com.cn/product/cn/FDC2214?utm_source=baidu&utm_medium=cpc&utm_campaign=asc-null-null-GPN_CN-cpc-pf-baidu-cn&utm_content=Device&ds_k=FDC2214&DCM=yes&gclid=CN6Vy9Lk3O4CFQn2vAodsfwNNQ&gclsrc=ds
下载数据手册:
- 测量原理
FDC2214采用L-C谐振器作为传感器。通过测量LC谐振器的振荡频率,输出一个与频率成比例的数字值。这个频率测量值可转换为等效电容。FDC2214的功能方框图:
FDC的前端是谐振电路,后面是一个多路复用器,多路复用器的活动通道将传感器频率fSENSOR连接到核心Core。这个核心使用参考频率fREF来测量传感器频率。fREF是内部或外部参考时钟(振荡器)。每个通道的数字化输出是fSENSOR/fREF的比值。I2C接口用于芯片配置和传输结果数据。SD用于设置关机模式,以节省电流。可配置的中断引脚INTB用来通知主机芯片状态的变化。
- 控制FDC2214的主机
百度了一下,网上的介绍文章基本上都是用STM32或者51单片机控制FDC2214,本文用ESP8266控制FDC2214获取传感器的数据。相比STM32,用ESP8266控制FDC2214性价比更高,支持WiFi,代码更简洁。
如果你对ESP8266的开发工具的使用还不熟悉,可以参考:
《ESP8266_RTOS_SDK v3创建一个新项目使用GPIO》
https://zhuanlan.zhihu.com/p/350165597
https://blog.csdn.net/chentuo2000/article/details/113772591
2. ESP8266引脚
- ESP8266EX技术规格书
https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_cn.pdf
- ESP8266的GPIO管脚
- 管脚定义
ESP8266的i2c引脚是可以自己选择的。
3. FDC2214引脚
下图为芯片引脚,芯片还需要配一些外围电路,可以在网上购买现成的模块。
- FDC2214引脚功能
4. ESP8266和FDC2214接线表
ESP8266第24脚(GPIO5)- FDC2214第1脚(SCL)
ESP8266第16脚(GPIO4)- FDC2214第2脚(SDA)
ESP8266第9脚(GPIO14)- FDC2214第6脚(SD)
FDC2214第4脚(ADDR)接GND这时I2C的地址 = 0x2A
FDC2214第7脚(VDD)接+3.3V
FDC2214第8脚(GND)接GND
5. 传感器配置和目标物体接入
- 单端配置
FDC支持两种传感器配置。这两种配置都使用LC谐振回路设置振荡频率。典型的选择是一个18μH的屏蔽贴片电感器和一个33pF的电容并联,产生6.5MHz的振荡频率。在图54中的单端配置中,一个导电板(Sensor plate)连接到了IN0A,导电板与目标物体(Target object)一起形成可变电容器。
- 差分配置
在图55中的差分配置中,一个导电板连接到IN0A,另一个连接到IN0B,它们一起构成可变电容器。
在传感器感应板面积相同的情况下,单端配置比差分配置有更大的感应范围。在要求在近距离处具有高灵敏度的应用中,差分配置比单端配置性能更好。
在我的项目中使用了单端配置,因为我希望有更大的感应范围。
6. FDC2214 I2C基本操作
- FDC2214 I2C速度
FDC2214 I2C接口的最高速度为400 kbit/s。
- FDC2214的I2C地址
FDC使用I2C扩展启动序列进行寄存器访问,I2C扩展启动序列之后跟随着标准的I2C 7位从机地址,后面跟随8位指针寄存器字节设置寄存器地址。
当ADDR引脚设置为低位时,FDC的I2C地址为0x2A;当ADDR引脚设置为高时,FDC的I2C地址为0x2B。
我们设置FDC的I2C地址为0x2A。
- FDC2214初始化
当SD引脚设置为高电平时,FDC将进入关机模式,关机模式是低功耗状态。将SD引脚设置为低电平时FDC退出关机模式。
即将SD拉高可以进入关机模式,再拉低进入正常工作模式。这时所有寄存器都返回其默认值,并清除所有错误条件,取消INTB引脚的中断信号。
- 设置通道
FDC2214有4个通道,所以在使用的时候有单通道和多通道模式。在我的应用中使用单通道模式。
我使用通道0,所以:
寄存器0X1A[14:15]=00
寄存器0X1B[15]=0
- 数据采样
单通道模式采样序列
Sensor Activation 传感器激活
Conversion转换,在这个时间段采样
Amplitude Correction振幅修正
- 采样数据寄存器
数据保存在采样数据寄存器中。
在单通道情况下,通道0只需要读0x00和0x01。FDC2214有28位采样数据,寄存器0x00存放数据的高12位MSB[27:16],寄存器0x01存放数据的低16位LSB[15:0]。
- 状态寄存器
为了保障在Conversion期间采样,我们需要读状态寄存器
0x18用来读取包含各种状态位[15:0]的12个域。0x19用来配置这些状态位。
这些寄存器可以被配置在INTB引脚为特定的数据触发一个中断
- 数据准备好
查询状态寄存器 0x18,如果状态为0x0048,表示通道0的数据已经准备好。
相关的Bit:
- 寄存器设置
推荐的初始化寄存器配置值(多通道)
因为我们使用单通道,寄存器的设置为:
#define RCOUNT_CH0 0x08 // Value = 0x8329
#define SETTLECOUNT_CH0 0x10 // Value = 0x000A
#define CLOCK_DIVIDERS_CH0 0x14 // Value = 0x2002
#define STATUS_CONFIG 0x19 // Value = 0x0001
#define MUX_CONFIG 0x1B // Value = 0x020D
#define DRIVE_CURRENT_CH0 0x1E // Value = 0x7C00
#define CONFIG 0x1A // Value = 0x1441(内部参考频率) 0x1641(外部参考频率)
7. ESP8266 I2C相关操作
https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/peripherals/i2c.html
7.1 头文件
7.2 函数
- i2c_driver_install
说明:
- i2c_param_config
说明见文档。
- i2c_driver_delete
- i2c_master_start
- i2c_master_write_byte
- i2c_master_write
- i2c_master_read
- i2c_master_stop
- i2c_master_cmd_begin
- i2c_cmd_link_delete
7.3 自定义数据类型
- esp_err_t
- i2c_cmd_handle_t
7.4 枚举
7.5 结构
- i2c_config_t
8. 创建新项目
8.1 创建项目i2c
参考《ESP8266_RTOS_SDK v3创建一个新项目使用GPIO》
https://zhuanlan.zhihu.com/p/350165597
https://blog.csdn.net/chentuo2000/article/details/113772591
- i2c项目目录
- C程序user_main.c
8.2 程序代码
- 参考ESP8266_RTOS_SDK带的例子
/home/ccdc/esp/ESP8266_RTOS_SDK/examples/peripherals/i2c/main/user_main.c
- 编辑C程序
nano main/user_main.c
完整的程序代码见:
《ESP8266_RTOS v3用I2C读FDC2214(附C程序代码).docx》
https://download.csdn.net/download/chentuo2000/15366041
或者
《用ESP8266_RTOS_SDK v3控制电容传感器FDC2214(附C程序).docx》
https://download.csdn.net/download/chentuo2000/15841717
下面这个代码固定了SD引脚为低电平,这样可以节省一个ESP8266引脚。
8.3 编译
make
8.4 烧写
make flash