说在前面的话
最近在做一个用FDC2214测量液位的小东西,真的查了很多资料,花了一天半看完了德州仪器这本又臭又长(?)的手册,看英语真的一个头两个大;尤其是数字量to电容量这一部分的计算,可以说是上面一块下面一块,好像四魂之玉一样散落在手册的各个部位,真的看得我脑袋都炸了。于是为了方便电赛/项目的伙伴,我整理了一份胎教级别的计算指南,希望对各位的开发有些帮助。因为我比较菜,如果文章中有错误的部分请大佬指出,我会及时订正,我自己也会在开发过程中好好审阅一下子。之后还会再写一些有关2214的其他笔记的!(●’◡’●)
准备工作:
1.在德州仪器官网下载一本FDC2214的手册
2.一支笔,一张草稿纸
step1:三个公式
三个公式都是在手册中找到的,并且我会对公示的英文说明进行一些简单的翻译和解释,大家也可以对照着手册寻找这些公式,我会注明出现页面。
1.
来自手册P14;
其中:
fref是该通道的参考频率,
fclk是该通道的输入频率,
CHx_FREF_DIVIDER是用户自行在寄存器中设置的一个值,对该通道输入频率进行除法;为什么要做除法呢?因为在手册中有提到
来自手册P14;
其中finx也就是fsensor/2(因为单端输入),fref要大于四倍的fin,而fsensor的最大值可以用f=1/(2pi(L*C)^(1/2))求出;对于这个公式的说明,按照手册原文翻译(P42):
“这个值代表了传感器频率的最大值,随着传感器的电容增加,频率下降”
从这句我们也可以直截了当的知道,原来传感器的电容和频率成反比,也就引出了下面一系列的计算。
回到CHx_FREF_DIVIDER,用CH0举例,该值如下图所示:
在图中我们可以看到,CH0_FREF_DIVIDER不可以等于0,必须大于等于1。我个人参考的几个例程里都将这个值设成了1,因为几乎所有人都是根据推荐配置设置的震荡电路,那么fsensor的最大值也几乎就都是固定的,计算出来大概是5.15MHz左右,fref就至少要有20.6MHz;而推荐的时钟fclk是40MHz,也几乎所有人采用这个配置,所以几乎全部例程中时钟除法器中都将CHx_FREF_DIVIDER设置成1。采用别的频率的时钟的情况我也不太了解,所以就不多说了;另外关于fin和fsenser,由于我们计算的过程中刚好把fin消掉了,所以不用太过纠结fin,参考手册P14 Table1的 CH0_FIN_SEL一列;fin设置了传感器频率的选择和传感器的输入方法(单端/差分),有点复杂,但是只要是单端输入CHx_FIN_SEL就一定是b10,所以一不要太过纠结了(自己都没太弄懂(‾◡◝)……等我再看看在更新,如果有懂得大佬说一下)。
2.
来自手册P15;
这个公式描述的是FDC2214输出的结果;对于2214来说,分辨率是28位的,也就是意味着他输出的这个结果DATAx是一个28位的二进制数据,x代表FDC2214的0~3的输入通道中的一个,DATAx就是该通道的输出结果。
需要注意的是,输出数据存放在寄存器0x00–0x07中;由于一个地址空间只能存16bit的数据,所以每一个28bit的输出结果都被分成两个部分存放在两个地址中,用CH0举例:他的高12位存放在0x00中,低16位存放在0x01中,使用DATA0的时候需要将其按高低顺序拼接起来才能使用。
所有通道的DATAx存放地址如下表,这是通过官方手册整理出来的简略版,完整表格参考手册P15,Table4;
3.
来自手册P19;
这个公式用于计算该通道电容传感器的电容值,也就是通过这个式子将上文提到的数字量DATAx转换成我们想要的电容值。这个式子来源于下面两个式子:
其中:
Call是整条线路上的电容,
Csensor是电容传感器的电容,也就是我们需要计算的电容值,
C0是该通道上并联的电容,
C是振荡电路中电容器的电容量(推荐配置为33pF,见下图),
Cpin是电路中引脚与接线等等的电容量,在手册中有举例记作20pF,
L是整条电路上的电感;
通道的传感器接线图如下图:
来自手册P39;
需要注意的是,这一张图所示的是传感器的单端输入接法,在手册中也有给出差分输入接法(见P39 figure55),由于我自己的项目是单端输入的所以在此不再对单端/差分过多叙述;
step2 推导计算
现在开始计算:
首先由式1计算fsensor的最大值,前面也说过传感器的电容量Csensor和fsensor成反比,当Csensor为0时fsensor最大,所以式1中的C仅由振荡电路中的电容器和引脚接线的电容量组成;
然后通过fsensor_m确定fref,计算过程和上面一节的1.写过的一样,请大家仔细阅读后计算;
最后通过读出的DATA计算出fsensor的实时值,带入式4,于是你所测量的电容值就被算出来了!好耶!(❁´◡`❁)
到底怎么将计算体现在程序中?
说了这么一大堆,有的小伙伴可能就问了,你搁这跟我讲高中物理呢?我咋给他编进程序中?别着急,现在你就看到了(.jpg)♪(´▽`)
首先我们整理一下上文中提到的式2和式4:仔细思考一下,按照线性方程的角度来说,Csenser是应变量,fs是应变量,而fsensor又由所读出的DATA决定,那么我们就把所有的已知量(常量)整理在一起,就变成了:
式7是由式5带入式6求出的,式7的系数k中所有值都已知,经过几步简单的运算就可以在单片机上执行了,例如以下的例程:
float Cap_Calculate(u8 index)
{
float Cap;
Data_FDC = FCD2214_ReadCH(index);
// Cap = 56645.763f/((float)Data_FDC);
// return ((Cap*Cap)-33);
Cap = 232021045.248/(Data_FDC);
return (Cap*Cap);
}
打了注释的两行和我们计算的方法是完全一致的,这样就可以得到传感器电容的量了,好耶!没有被注释的两行是例程给出的另外一种solution。
由于我还没正式把程序刷进板子里,如果有疑难杂症我会继续更新!