FDC2214+FPGA转换芯片使用和配置(非接触液位检测设计)
芯片介绍
FDC2214是一款分辨率28位,四通道(可以采集四个电容模拟量),IIC接口的芯片,其他的优点接不介绍了总之很多什么低功耗,抗噪声,高速…等等。电容式传感系统中的传感器可 以采用任意金属或导体(我用的是黄铜丝 哈哈 金属片也试了 效果也不错),因此可实现高度灵活的低成本系统设计。其他信息可以看FDC2214数据手册(不得不说德州仪器TI的产品是厉害哈哈)。
设计介绍
本设计采用FPGA与FDC2214进行通讯通过单通道检测容器内液位,传感器为黄铜线缠绕在容器外壁(本设计采用单通道配置,只使用一个通道中的一个电容传输接口,另一个电容传输接口悬空)。具体装置如下图所示。
下图为无水时读取的的数据,无水时读取出0X00寄存器中的数据为00D5,0X01中的数据位6FFA(SignalTap ii抓取的数据)。
下图为有水时装置图片和读取的数据。
下图为有水时读取的的数据,有水时读取出0X00寄存器中的数据为00D4,0X01中的数据位9EA6(SignalTap ii抓取的数据)。
IIC驱动配置
下图为官方数据手册中的IIC读写时序,需要注意的是寄存器地址为8位但是读写数据为16位的,也就是在读写完高八位数据后需要读写低八位数据。(这个需要特别注意)
下图为iic读写工作状态机
因为代码太多了,只放状态机状态转移部分的代码吧哈哈(要是想要完整工程可以私信我啊哈哈)
always @( * ) begin
case(cur_state)
idle: begin // 空闲状态
if(i2c_exec) begin
next_state = sladdr;
end
else
next_state = idle;
end
sladdr: begin
if(st_done) begin
if(bit_ctrl) // 判断是16位还是8位字地址
next_state = addr16;
else
next_state = addr8 ;
end
else
next_state = sladdr;
end
addr16: begin // 写16位字地址
if(st_done) begin
next_state = addr8;
end
else begin
next_state = addr16;
end
end
addr8: begin // 8位字地址
if(st_done) begin
if(wr_flag==1'b0)begin // 读写判断
if(bit_ctrl_w) //如果bit_ctrl_w为一则写16位数据
next_state = data_wr_16;
else
next_state = data_wr_8; //如果bit_ctrl_w为零则写8位数据
end
else begin
next_state = addr_rd;
end
end
else begin
next_state = addr8;
end
end
data_wr_16:begin // 写高8位数据(8 bit)
if(st_done)
next_state = data_wr_8 ;
else
next_state = data_wr_16;
end
data_wr_8: begin // 写低8位数据(8 bit)
if(st_done)
next_state = stop;
else
next_state = data_wr_8;
end
addr_rd: begin // 写地址以进行读数据
if(st_done) begin
if(bit_ctrl_r) //如果bit_ctrl_r为一则读16位数据
next_state = data_rd_16;
else
next_state = data_rd_8; //如果bit_ctrl_r为零则读8位数据
end
else begin
next_state = addr_rd;
end
end
data_rd_16: begin // 读取高8位数据(8 bit)
if(st_done)
next_state = data_rd_8;
else
next_state = data_rd_16;
end
data_rd_8: begin // 读取低8位数据(8 bit)
if(st_done)
next_state = stop;
else
next_state = st_data_rd_8;
end
stop: begin // 结束I2C操作
if(st_done)
next_state = idle;
else
next_state = stop ;
end
default: next_state= idle;
endcase
end
FDC2214单通道寄存器配置
下面我就直接说我是怎么配置得了哈哈不详细介绍了可以查看数据手册啊,下图为官方手册中的寄存器介绍。
0X00到0X07
总共8个寄存器,每两个寄存器为一个电容通道的数据寄存器。下图为数据手册中的0X00介绍。
下图为为数据手册中的0X01介绍。
以通道0为例介绍0X00和0X01两个寄存器,0X00的低12位数据是该通道电容的高12位数据,0X01的全部16位数据是该通道电容的低16位数据,总共为28位的电容数据。
0X08到0X0B
这四个寄存器是四个通道的计数转换时间设置在这里我就不介绍详细计算过程了。单通道使用时把对应通道的寄存器设置为FFFF。
下图是官方手册中的以0X08为例,对应0通道的计数转换时间计算。
0x0C到0x0F
这四个寄存器是对应四个通道的转换偏移,此项一般不做配置。
0X10到0X13
这四个寄存器是对应四个通道的转换开始前稳定时间设置在这里我就不介绍详细计算过程了。单通道使用时把对应通道的寄存器设置为0064。
下图是官方手册中的以0X10为例,对应0通道的转换开始前稳定时间计算。
0X14到0X17
这四个寄存器是对应四个通道的频率选择,单端时配置为2001差分时配置为1001。单通道使用时把对应通道配置为2001采用单端传输。
下图是官方手册中的以0X14为例详细介绍。
0x18
这个寄存器是设备的状态报告,读取该寄存器的值,获取错误信息。
下图是官方手册中的0X18寄存器详细介绍。
0X19
这个寄存器是设备状态报告配置。默认配置0x19为0000,默认情况下,不允许中断启用。
下图是官方手册中的0X19寄存器详细介绍。
0X1A
这个寄存器参数配置寄存器用来配置各种参数,单通道使用时配置为1C81。
下图是官方手册中的0X1A寄存器详细介绍。
0X1B
这个寄存器通道复用寄存器,单通道使用时配置为020D。
下图是官方手册中的0X1B寄存器详细介绍。
0X1B
复位配置用不到就不需要配置。
0X1E到0X21
这四个寄存器是四个通道驱动电流配置。单通道使用时把对应通道的寄存器设置为F800。
下图是官方手册中的以0X1E为例详细介绍。
注意
要是不愿意看数据手册的小伙伴可以直接根据我的单通道配置来设置寄存器。(我使用的是单通道以通道1为例)单通道配置如下图所示。(我用的是通道一啊 哈哈 通道一定不要搞错了 )
(0x0A,0xFFFF);//通道1转换时间配置
(0x12,0x0064);//通道1转换开始前稳定时间配置
(0x16,0x2001); //通道1分频系数配置
(0x19,0x0000); //设备状态报告配置
(0x1A,0x1C81); //参数配置
(0x1B,0x020D); //通道复用配置
(0x20,0xF800); //通道1驱动电流配置
总结
实验结果,当采用通道一单通道设置时,在无水的情况下(十六进制显示)0X04寄存器和0X05寄存器中28位数据为00D5,6FFA。在有水的情况下(十六进制显示)0X04寄存器和0X05寄存器中28位数据为00D4 ,9EA6。因为28位分辨率的转换芯片精度已经是相当高了所以我在试验时低12位数据一直在变化。但是高12位数据还是很稳定的,在有水的情况下有明显的减小。
要是想要工程的小伙伴可以私信我啊哈哈。
最近没怎么写博客可能是因为懒惰了,也可能是因为被tutor搞得把哈哈,要是有什么疑问或者我哪里写错了可以告诉我啊一起探讨 ,代码我就不全粘贴了太多了哈哈 。感兴趣可以私信啊。