FDC2214的使用——基于STM32F4开发板
- 前言
- 一、FDC2214基本信息
- 二、读写时序图
- 三、寄存器信息
- 四、配置步骤
- 五、数据读取
- 六、部分代码
-
- 1、FDC配置
- 2.读出数据
- 总结
前言
FDC2214传感器是一种低功耗、低成本且高分辨率的非接触式感测技术, 适用于从接近检测和手势识别到远程液位感测领域的各项应用。电容式传感系统中的传感器可以采用任意金属或导体,因此可实现高度灵活的低成本系统设计。 电容式传感应用灵敏度的主要限制因素 在于 传感器的 噪声敏感性。FDC2x1x 采用创新型抗 EMI 架构,即使 在高噪声环境中也能维持性能不变。 FDC2x1x 是面向电容式传感解决方案的抗噪声和 EMI、高分辨率、高速、多通道电容数字转换器系列。 该系列器件采用基于窄带的创新型架构,可对噪声和干扰进行高度抑制,同时在高速条件下提供高分辨率。该 系列器件支持宽激励频率范围,可为系统设计带来灵活 性。宽频率范围对于导电液体(例如清洁剂、肥皂液和 油墨)感测的可靠性特别有用。
一、FDC2214基本信息
FDC2112,FDC2114,FDC2212和FDC2214是高分辨率,多通道电容数字转换器,用于实现电容式传感解决方案。 与传统的开关电容架构相比,FDC2112,FDC2114,FDC2212和FDC2214采用L-C谐振器(也称为L-C谐振器) 作为传感器。 与其他电容式传感解决方案相比,窄带架构可实现前所未有的EMI抗扰性,并大大降低了本底噪声。 使用这种方法,可以观察到L-C槽的电容变化作为谐振频率的变化。 使用该原理,FDC是电容数字转换器(FDC), 其测量LC谐振器的振荡频率。 设备输出与频率成比例的数字值。 该频率测量可以转换为等效电容。
二、读写时序图
三、寄存器信息
上述寄存器清单中,首项是每个寄存器对应的地址信息,在进行寄存器相关的操作时需要先对FDC2214发送特定的寄存器地址,才可以对寄存器进行读写操作。而每个寄存器的具体信息需要从收据手册中查找,在编写程序时可以根据自身需求进行相关配置。我给出我自己学习时用的手册,还带点小笔记:下载地址
四、配置步骤
在数据手册中Ti给出了一般操作的配置步骤,只需按照配置表格进行配置即可。当然图片中的步骤仅供参考,读者可以根据自身需求结合寄存器信息进行需要的配置。
五、数据读取
通过数据手册了解到,数据在数据样本寄存器中存储是分段的,一部分在DATA_CHx中,一部分在DATA_LSB_CHx中,所以需要进行移位操作来处理数据。
六、部分代码
1、FDC配置
FDC驱动配置如下:
//初始化IIC接口
u8 FDC2214_ADDR=0;
void FDC2214_Init(void)
{
IIC_Init();//IIC初始化
ADDR=1;
FDC2214_WriteByte(0x08,0x8329);//CH0
FDC2214_WriteByte(0x09,0x8329);//CH1
FDC2214_WriteByte(0x0A,0x8329);//CH2
FDC2214_WriteByte(0x0B,0x8329);//CH3
FDC2214_WriteByte(0x10,0x000A);
FDC2214_WriteByte(0x11,0x000A);
FDC2214_WriteByte(0x12,0x000A);
FDC2214_WriteByte(0x13,0x000A);
FDC2214_WriteByte(0x14,0x1001);//5M
FDC2214_WriteByte(0x15,0x1001);//5M
FDC2214_WriteByte(0x16,0x1001);//5M
FDC2214_WriteByte(0x17,0x1001);//5M
FDC2214_WriteByte(0x19,0x0000);
FDC2214_WriteByte(0x1B,0xc20D);
FDC2214_WriteByte(0x1E,0x7C00);
FDC2214_WriteByte(0x1F,0x7C00);
FDC2214_WriteByte(0x20,0x7C00);
FDC2214_WriteByte(0x21,0x7C00);
FDC2214_WriteByte(0x1A,0x1401);
}
//在FDC2214指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u16 FDC2214_ReadByte(u8 address)//从某一寄存器读取16位数据
{
u8 data[2];
u16 C_date;
if(ADDR==1)
{
FDC2214_ADDR=0X2B;
}else{
FDC2214_ADDR=0X2A;
}
IIC_Start();
// if(EE_TYPE>AT24C16)
// {
IIC_Send_Byte((FDC2214_ADDR<<1)|0); //发送写命令 最低位 0 写 最低位 1 读
IIC_Wait_Ack();
IIC_Send_Byte(address);//发送高地址
// }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((FDC2214_ADDR<<1)|1); //发送读命令 进入接受模式
IIC_Wait_Ack();
data[0]=IIC_Read_Byte(1);
// IIC_Wait_Ack();
data[1]=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
C_date=(data[0]<<8)+data[1];
return C_date;
}
//在FDC2214指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void FDC2214_WriteByte(u8 WriteAddr,u16 DataToWrite) //向某一寄存器写入某一地址
{
IIC_Start();
// if(EE_TYPE>AT24C16)
// {
if(ADDR==1)
{
FDC2214_ADDR=0X2B;
}else{
FDC2214_ADDR=0X2A;
}
IIC_Send_Byte((FDC2214_ADDR<<1)|0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr);//发送高地址
// else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite>>8); //发送高位字节
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite%256);
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
delay_ms(10);
}
2.读出数据
代码如下(示例):
u32 Read_CH_num(int a)
{
u32 CH0=0,CH0_LSB=0,data0=0,CH2=0,CH2_LSB=0,data2=0,CH1=0,CH1_LSB=0,data1=0,CH3=0,CH3_LSB=0,data3=0;
switch(a)
{
case 0: CH0=FDC2214_ReadByte(0X00);
CH0_LSB=FDC2214_ReadByte(0X01);
data0=((CH0&(0x0fff))<<16)+CH0_LSB;
// LCD_ShowString(30,150,200,16,16,"This Device's CH0_LSB Is: "); //显示提示信息
// LCD_ShowxNum(30,170,data0,9,16,0);//提示传送完成
// delay_ms(20);
return data0;
case 1: CH1=FDC2214_ReadByte(0X02);
CH1_LSB=FDC2214_ReadByte(0X03);
data1=((CH1&(0x0fff))<<16)+CH1_LSB;
// LCD_ShowString(30,150,200,16,16,"This Device's CH0_LSB Is: "); //显示提示信息
// LCD_ShowxNum(30,170,data0,9,16,0);//提示传送完成
// delay_ms(20);
return data1;
case 2: CH2=FDC2214_ReadByte(0X04);
CH2_LSB=FDC2214_ReadByte(0X05);
data2=((CH2&(0x0fff))<<16)+CH2_LSB;
// LCD_ShowString(30,150,200,16,16,"This Device's CH0_LSB Is: "); //显示提示信息
// LCD_ShowxNum(30,170,data0,9,16,0);//提示传送完成
// delay_ms(20);
return data2;
case 3: CH3=FDC2214_ReadByte(0X06);
CH3_LSB=FDC2214_ReadByte(0X07);
data3=((CH3&(0x0fff))<<16)+CH3_LSB;
// LCD_ShowString(30,150,200,16,16,"This Device's CH0_LSB Is: "); //显示提示信息
// LCD_ShowxNum(30,170,data0,9,16,0);//提示传送完成
// delay_ms(20);
return data3;
default : return 0;
}
}
以上代码仅供参考,如有问题欢迎评论留言,大家一起互相学习。源码在这里:下载地址
总结
FDC2214测电容变化,在实际应用中,我感觉效果并不是那么理想,不知道是什么原因导致数据浮动比较大,我认为可能是因为静电等因素导致的,所以在使用中我建议做一个静电屏蔽的装置以减少误差。