天天看点

2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结

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谐振器的振荡频率。 设备输出与频率成比例的数字值。 该频率测量可以转换为等效电容。

二、读写时序图

2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结
2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结

三、寄存器信息

2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结
2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结

上述寄存器清单中,首项是每个寄存器对应的地址信息,在进行寄存器相关的操作时需要先对FDC2214发送特定的寄存器地址,才可以对寄存器进行读写操作。而每个寄存器的具体信息需要从收据手册中查找,在编写程序时可以根据自身需求进行相关配置。我给出我自己学习时用的手册,还带点小笔记:下载地址

四、配置步骤

在数据手册中Ti给出了一般操作的配置步骤,只需按照配置表格进行配置即可。当然图片中的步骤仅供参考,读者可以根据自身需求结合寄存器信息进行需要的配置。

2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结

五、数据读取

通过数据手册了解到,数据在数据样本寄存器中存储是分段的,一部分在DATA_CHx中,一部分在DATA_LSB_CHx中,所以需要进行移位操作来处理数据。

2021-08-20前言一、FDC2214基本信息二、读写时序图三、寄存器信息四、配置步骤五、数据读取六、部分代码总结

六、部分代码

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测电容变化,在实际应用中,我感觉效果并不是那么理想,不知道是什么原因导致数据浮动比较大,我认为可能是因为静电等因素导致的,所以在使用中我建议做一个静电屏蔽的装置以减少误差。

继续阅读