基于LDC1614 1612的电感式位移传感器

0. 序言

最近因为开发电感传感器,而接触了LDC1614。使用TMS320F28335和DLC1614进行I2C通信,通过LDC芯片产生的电流通入传感器线圈中,再检测线圈谐振频率从而检测位置,过程从无到有。解读文档,编写程序,全程干货,助你快速上手。
原创不易,转载请标明出处。

1. LDC1614介绍

1.1 介绍

LDC1612、LDC1614为适用于电感感应的多通道28位(即分辨率为1/2^28)电感数字转换器,LDC1612为2通道,LDC1614位4通道。特性如下:
感应范围超过线圈直径的两倍
支持 1kHz 至 10MHz 的宽传感器频率范围
2.7V 至 3.6V 工作电压
多个基准时钟选项:内部时钟,或支持40MHz外部时钟
抗直流磁场和磁体干扰
通过I2C通信,来配置LDC1614寄存器,或是读取传感器数据输出。
在这里插入图片描述

1.2 原理

工作原理为:流过电感器的交流电流将产生交流磁场。如果一种导电材料,如金属物体,被带入电感器附近,磁场将在导体表面产生循环电流(涡流)。

涡流是导体的距离、大小和组成的函数。涡流产生它自己的磁场,这与传感器电感器产生的原始磁场相反。这种效应相当于一组耦合电感器,其中传感器电感器是主绕组,目标物体中的涡流代表二级电感器。电感器之间的耦合是传感器电感器与导电目标的电阻率、距离、尺寸和形状的函数。由涡流引起的二次绕组的电阻和电感可以建模为一端(线圈)上的与距离相关的电阻和感应分量。图49显示了传感器和目标作为耦合线圈的简化电路模型。
在这里插入图片描述
简而言之就是LDC通一个电流到线圈中,电流大小可以设置,通过检测LC振荡产生的正弦波频率来判断此时位置,芯片输出的数据是线圈频率与基准频率的比值。频率会根据目标的位置而变化。通常,当目标最接近传感器时,传感器的频率最高。

1.3 主要引脚接法

NAMETYPEDESCRIPTION连接
SCLII2C时钟输入。开漏输出;需要电阻上拉至逻辑高电平。SCL
SDAI/OI2C数据输入/输出。开漏输出;需要电阻上拉至逻辑高电平。SDA
CLKINI外部参考时钟输入。如果使用内部振荡器,将该引脚连接至GND。GND
ADDRII2C地址选择引脚:当ADDR=L时,I2C地址=0x2A;当ADDR=H时,I2C地址=0x2B。不得允许此输入浮动。GND
INTBI可配置中断输出引脚。推挽输出;不需要上拉。GPIOx
SDI关机输入:设置SD=L为正常操作,设置SD=H为非活动模式。不得允许此输入浮动。GND
INxAI外部LC传感器连接通道x线圈
INxBI外部LC传感器连接连接x线圈

2. I2C通信

LDC1614通过与主机进行通信,来发送或接收数据。主机发送数据到LDC的特定地址中,从而更改LDC的寄存器配置。LDC发送转换完的数据给主机,主机接收该数据以使用。

LDC1614的I2C通信方式包含读写两种,SCL时钟线最低频率10kHz,最高频率400kHz。每个芯片I2C通信的从机寄存器地址长度或传输数据长度可能不同。比如X1226(时钟芯片)的寄存器地址长度16位,数据长度8位。而LDC1614的寄存器地址长度8位,数据长度16位。同时主机数据方式读取方式也可能不同,比如X1226存在3中数据读取方式,而LDC1614只有一种。故程序不可能一成不变,要根据不同芯片编写。

注意,下面说的高8位,低8位并不是代表芯片输出数据为16位,实际应为28位。因为一个通道有两个寄存器DATA0_MSB与DATA0_LSB,两个合起来时28位,具体计算后面会详细说明。

2.2 写模式

1.主机产生起始信号。
2.主机发送从机主线(即LDC1614)的地址,该值通过ADDR引脚设置。当ADDR引脚设置为低时,设备I2C地址为0x2A;当ADDR引脚设置为高时,I2C地址为0x2B。前7位为地址,最后1位为0,表示主机写数据。
3.从机应答。
4.主机发送从机寄存器地址。
5.从机应答。
6.主机发送该寄存器中需要写的数据的高8位。
7.从机应答。
8.主机发送该寄存器中需要写的数据的低8位。
9.从机应答。
10.主机产生停止信号。
在这里插入图片描述

2.3 读模式

1.主机产生起始信号。
2.主机发送从机主线(即LDC1614)的地址,该值通过ADDR引脚设置。当ADDR引脚设置为低时,设备I2C地址为0x2A;当ADDR引脚设置为高时,I2C地址为0x2B。前7位为地址,最后1位为0,表示主机写数据。
3.从机应答。
4.主机发送从机寄存器地址。
5.从机应答。
6.主机产生起始信号。(这里开始和写模式不同)
7.主机发送从机主线(即LDC1614)的地址,最后1位为1,表示主机读数据。
8.从机应答。
9.从机发送该寄存器中的数据的高8位。
10.主机应答。
11.从机发送该寄存器中的数据的低8位。
12.主机不应答。
13.主机产生停止信号。
在这里插入图片描述

3. 设备功能模式

3.1. 启动模式

LDC上电后进入Sleep Mode,等待配置。一旦设备配置好,退出休眠模式并通过设置CONFIG开始转换。SLEEP_MODE_EN b0。

建议在休眠模式下配置LDC。如果需要修改LDC上的设置,将设备返回到睡眠模式,更改相应的寄存器,然后退出睡眠模式。

3.2. 睡眠模式(配置模式)

通过设置CONFIG进入休眠模式。SLEEP_MODE_EN寄存器字段为1。在此模式下,保留设备配置,但不进行转换。如果要进入普通模式进行转换,请设置CONFIG。SLEEP_MODE_EN寄存器字段为0。后设置配置。SLEEP_MODE_EN到b0,第一次转换的传感器激活将在16,384÷ƒINT结束后开始。有关设备计时的更多信息,请参阅时钟体系结构。

在休眠模式下,I2C接口是有效的,因此可以执行寄存器读和写操作。进入睡眠模式将清除所有转换结果,任何错误条件,并取消INTB引脚断言。

对于不需要连续转换的应用程序,在完成转换后将设备返回到Sleep模式,并重新读取所需的转换次数,可以节省功耗。有关更多信息,请参阅TI应用说明LDC131x/161x电感传感的功率降低技术。

3.3. 正常(转换)模式

LDC在正常(转换)模式下工作时,根据设备配置重复采样传感器的频率,生成有源通道的采样输出。

3.4. 关机模式

当SD引脚设置为高时,LDC将进入关机模式。关机模式是最低的电源状态。要退出关机模式并进入睡眠模式,请将SD引脚设置为低。进入关机模式将返回所有寄存器的默认状态。

当处于关机模式时,不执行任何转换。此外,进入Shutdown Mode将清除任何错误条件并取消断言INTB引脚(当取消断言时,INTB将被积极驱动至高)。当设备处于关机模式时,无法通过I2C接口对设备进行读写操作。

允许在关机模式下更改ADDR引脚设置。

3.5. 重启

可以通过写入RESET_DEV.RESET_DEV来重置设备。任何正在进行的转换都将停止,所有寄存器将返回到它们的默认值。这个寄存器位在读取时总是返回b0。

4. 典型应用

4.1. 系统传感功能

感应传感提供了其他技术无法提供的广泛系统优势——非接触式测量,抵抗灰尘/水,对外部磁铁的抗扰力,远程定位,廉价和健壮的传感器,以及极高分辨率的相对运动测量。

LDC1612/LDC1614可用于检测用于测量各种目标运动的广泛应用:
1.角度测量:参考1度拨号参考示例设计。
2.线性位置传感:关于传感器和目标结构的详细信息可在LDC1612/LDC1614线性位置传感应用说明中获得。对于绝对定位需求,建议使用差分2通道结构。
3.金属感应触摸式按钮:系统设计信息参考TI应用说明金属感应感应触摸式按钮设计指南,16按钮感应触摸式不锈钢键盘参考设计示例。

4.2. 示例应用程序

使用LDC1614的多通道实现的示例。该示例代表了一种轴向位移应用,其中目标运动垂直于线圈的平面。第二通道可用于感知第二目标的接近程度,或者它可用于通过连接参考线圈来进行环境补偿。
在这里插入图片描述

4.3. 设计要求

在该设计示例中,传感器0用于接近测量,传感器1用于温度补偿。使用WEBENCH线圈设计工具创建传感器。系统测量要求:
目标距离=1.0mm
距离分辨率=0.2µm
目标直径=10mm
目标材料=不锈钢(SS416)
线圈的PCB层数=2
应用程序需要 500 SPS (TSAMPLE = 2.00 ms)

以上为TI例程所给参数,实际测试的传感器为使用铜线手动绕的电感,并没有这些参数。

4.4. 详细设计程序

目标距离、分辨率和直径用TI软件(https://webench.ti.com/wb5/LDC/#/spirals)设计传感器线圈的输入,所得线圈设计为2层线圈,面积2.5cm2,直径17.7mm,旋转39圈。
Rp、L和C的值为:RP=6.6kΩ,L=43.9µH,C=100pF。
传感器频率:ƒSENSOR = 0.5π√(LC) = 0.5π√(43.910^-6 * 10010^-12) = 2.4 MHz
品质因数:Q=Rp*√(C/L)=9.96

Rp的由来是由于用于构造电感器的导体中的串联损耗,电感传感器本质上存在损耗。这些电阻损耗主要来自两个来源:在目标或其他附近的导体中耗散的能量,以及从电感器的导电绕组中产生的分布损耗。在测量Rp时,其目的是只测量目标上的涡流损失。传感器中的分布损耗降低了低直流流的测量动态范围。即使使用LDC131x或LDC161x设备测量电感(仅限L),更高的损耗也会降低测量精度。简而言之,Rp就是两种损耗等效为并联谐振电路后的电阻。
在这里插入图片描述
可以将40MHz的系统参考时钟应用于CLKIN引脚,允许灵活地设置内部时钟频率。传感器线圈连接到通道0(IN0A和IN0B引脚)。

4.4.1. 软件操作流程

打开LDC电源后,它将处于睡眠模式。如下寄存器编程(本例仅为通道0设置寄存器;通道1寄存器可以使用相同的配置):

1.设置通道0的分频器
a.由于传感器频率小于8.75MHz,因此可以将传感器分频器设置为1,这意味着将字段FIN_DIVIDER0设置为0x1。默认情况下,ƒIN0=ƒSENSOR=2.4MHz。

b.ƒREF0的设计约束是> 4׃SENSOR。内部参考时钟频率43.4MHz满足此约束,因此可以将参考分频器设置为2。这是通过将FREF_DIVIDER0字段设置为0x02来实现的。ƒREF0的计算公式为:ƒREF0 =ƒCLK/FREF_DIVIDER0=21.7MHz。

c.CLOCK_DIVIDERS0寄存器(0x14)的组合值是0x1002。(报错,要根据传感器状态检测手册的说明,增加或减小了分频)

综上,ƒIN0=ƒSENSOR=2.4MHz,ƒREF0=21.7MHz,ƒCLK=43.4MHz。

这里所述的ƒIN0,ƒSENSOR,ƒREF0可以看下图进行理解。可以看出芯片给线圈通入一个电流,传感器为线圈即电感L,再加上电容C,构成了一个LC并联振荡电路。根据被测物体与线圈的距离,传感器频率经过分频后得到的ƒIN0与基准频率经过分频后得到的ƒREF0进行比较。

当然,这里并没有传感器参数fSENSOR0,所以无法算出激活时间。fSENSOR0可以通过示波器识别,后文会讲。这里的所有传感器数据使用TI文档参考值。
在这里插入图片描述

2.设置通道0的传感器激活时间
之所以要步骤2 3 4是因为当LDC序列在多通道模式下,每个通道的停留时间间隔为 传感器激活时间+转换时间+通道开关延迟之和(sensor activation time + conversion time + channel switch delay),如图53所示。Q按照10来计算。
在这里插入图片描述

a.SETTLECOUNT0≥Q×fREF0/(16×fSENSOR0)→5.2,四舍五入至6。为了提供系统公差,选择更高的值10。

b.寄存器0x10应被编程为至少10。

c.激活时间为:(10x16)/20,000,000=8µs。

d.SETTLECOUNT0寄存器(0x10)的组合值为0x000A。

3.计算通道0的通道开关延迟
ƒREF=21.7MHz的通道切换延迟为约1μs,计算公式如下:
Channel Switch Delay = 692 ns + 5/ƒREF0 = 922.4ns

4.设置通道0的转换时间
转换时间(tC0)预计为:采样时间-传感器激活时间-通道开关延迟=1000-8-1=991µs。这里的采样时间为人为设计的可调整,计算方法为:1/500/2=1ms=1000µs,这里500代表500 SPS,2代表需要采集2个通道。

a.要确定转换时间寄存器值,请使用以下等式并求解RCOUNT0:
转换时间(tC0)=(RCOUNT0ˣ16)/ƒREF0
可得RCOUNT0=tC0*ƒREF0/16=1334

b.故RCOUNT0的值为十进制1334(四舍五入)。

c.RCOUNT0寄存器(地址0x08)的组合值为0x0536。

5.启用ERROR_CONFIG寄存器
默认情况下,不启用任何中断。但这里我们启用所用中断,即ERROR_CONFIG.all = 0xF801。这样设置后,传感器有错误时会报出,主要错误有:
• 低量程错误
• 超量程错误
• 看门狗超时错误
• 幅值高错误
• 幅值低错误
• 零计数错误
• 数据就绪 (DRDY)
在这里插入图片描述
正常使用时不会产生任何错误,如果产生错误,则STATUS寄存器相应位置位1,同时INTB引脚上产生一个低电平。DRDY与其它错误不同,它在多通道模式转换完成时会将STATUS.bit.DRDY置位为1,同时也会在INTB引脚上产生一个低电平。读取STATUS寄存器则会将这个低电平变成高电平,同时清除STATUS内的数值。所以将INTB引脚接入GPIO口,利用INTB引脚产生的电平变化,作为DSP外部中断源。每当INTB产生下降沿,DSP就会进入中断读取数据。

6.设置传感器驱动器电流
要设置 IDRIVE0 字段值,请使用Rp = 6.6 kΩ从图55中读取值。在这种情况下,IDRIVE0 值应设置为 18(十进制)。在知道Rp值的时候,可以计算驱动电流计算公式得到的电流,从表格40中读取出需要的电流。驱动电流计算公式为:
IDRIVE = π * Vp ÷ 4Rp =3.14*(3.3/2)/(4 * 6.6*10^3)=196.25µA

综上,IDRIVE0为0x90,INIT_DRIVE0字段应设置为0x00。DRIVE_CURRENT0寄存器(地址0x1E)的组合值为0x9000。

因为我们的传感器为手动绕的,所以传感器RP未知。这时可以使用示波器设置IDRIVEx探测传感器振幅。监测INAx或INBx接地线上的信号振幅时,只需将传感器目标移动到距离传感器最远的计划工作距离,并在振幅稳定后测量通道振幅。如果传感器振幅小于1.5VP,则增加通道IDRIVE设置。如果传感器振幅稳定大于1.75VP,则降低通道IDRIVE设置。如果不同通道的传感器结构有显著差异,则每个通道重复此过程。实际测试如果不能满足幅值在1.5V到1.75V范围内,可以让幅值范围在1.2V到1.8V范围内亦可。

在更改电流后,可以通过示波器测量两个波峰之间的时间,从而得到大致的传感器谐振频率。

引用TI员工的说法:传感器引线长度越长,传感器等效的RS越大,维持传感器振荡需要的能量越多,如果RS过高(与RP过低相同),LDC可能无法有效驱动传感器,从而导致噪音增加,甚至传感器无法振荡。通常,建议尝试最小化RS以提高传感器性能。

7.设置MUX_CONFIG寄存器
a.设置AUTOSCAN_EN为b1,启用顺序模式。

b.设置RR_SEQUENCE为b10,选择4个通道(通道0、1、2、3)按顺序进行数据转换。

c.设置DEGLITCH为b100,设置输入抗尖峰脉冲滤波器带宽为3.3MHz,即超过最大传感器振荡频率的最低设置。可以理解为该值要设置为:比传感器能输出的最大频率2.4MHz大但必须最低。

d.MUX_CONFIG寄存器(地址0x1B)的组合值为0x820C。

8.设置CONFIG寄存器
a.设置ACTIVE_CHAN为b00,选择频道0连续转换。这里理论上讲应该无所谓,因为已经设置了多通道,这里设置多少应该没影响。

b.设置SLEEP_MODE_EN为b0,使设备处于活动状态。

c.设置RP_OVERRIDE_EN为b1,关闭自动校准功能。

d.设置SENSOR_ACTIVATE_SEL为b1,不使传感器为全电流激活模式,可以通过图55查看两种模式差异。可以看出,全电流模式所需稳定时间较短。
在这里插入图片描述
e.设置AUTO_AMP_DIS字段为b1,禁用自动振幅校正。

f.设置REF_CLK_SRC字段为b0,使用内部时钟源。这里TI文档中本来使用的是外部,但由于没有外部时钟源,所以使用了内部时钟源,内部时钟源频率43.4MHz。

g.将其他字段设置为默认值。

h.CONFIG寄存器(地址0x1A)的组合值为0x1401。

9.读取传感器经芯片转换后的数值
从寄存器地址0x00到0x03,每1.00ms读取通道0和通道1的转换结果。读取时必须先读取DATAx_MSB(地址0x00),再读取DATAx_LSB(地址0x01)。注意这两个寄存器长度都是16位。DATAx_MSB的11:0位代表通道x转换结果的高12位,DATAx_LSB的15:0位代表通道x转换结果的低16位。整体的数据计算方法为:
DATAx = DATAx_MSB×65536 + DATAx_LSB。
代表含义为:
在这里插入图片描述
DATAx即为需要的结果,它代表传感器频率ƒINx与基准频率ƒREFx的比值,直接反应了被测物体的距离远近。

4.5. TI推荐的配置

根据详细设计程序一节中的示例配置,以TI建议值为例,使用以下寄存器写入顺序:
在这里插入图片描述
在这里插入图片描述

5. 部分代码实现

由于代码较多,这里只展示部分代码,实际大同小异。

5.1. 寄存器定义

//********************************************************DATA0_MSB**************************
struct DATA0_MSB_BITS {				//寄存器的位段定义
	Uint16 DATA0:12;			//	0:11
	Uint16 ERR_AE0:1;			// 12
	Uint16 ERR_WD0:1;			//13
	Uint16 ERR_OR0:1;			//14
	Uint16 ERR_UR0:1;			//15
};
union DATA0_MSB_REG {				//整体与各位段的联合体定义
	Uint16              all;
   struct DATA0_MSB_BITS  bit;
};
union DATA0_MSB_REG	DATA0_MSB;

5.2. 寄存器默认值

void LDC1614_Regs_Reset()
{
	DATA0_MSB.all = 0x0000;
	//更多. . . . . .
}

5.3. 寄存器初始化

void LDC1614_Regs_Init()//仅展示通道3
{
	CLOCK_DIVIDERS3.all = 0x1002;
	OFFSET3.all=0x0000;
	SETTLECOUNT3.all = 0x000A;
	RCOUNT3.all = 0x0536;
	DRIVE_CURRENT3.all = 0xD800;
	DRIVE_CURRENT3.bit.IDRIVE3=22;
	ERROR_CONFIG.all = 0xF801;
	MUX_CONFIG.all = 0xC20C;
	CONFIG.all = 0x1C01;
	}

5.4. 写寄存器

void Write_LDC1614_Regs()//仅展示通道3
{
	LDC1614_WriteOneByte(CLOCK_DIVIDERS3_ADDRESS	,	CLOCK_DIVIDERS3.all);		//通道3的参考值和传感器分频器设置
	LDC1614_WriteOneByte(OFFSET3_ADDRESS					,	OFFSET3.all);						//通道3的偏移设置
	LDC1614_WriteOneByte(SETTLECOUNT3_ADDRESS		,	SETTLECOUNT3.all);			//通道3参考计数设置(设置激活时间)
	LDC1614_WriteOneByte(RCOUNT3_ADDRESS					,	RCOUNT3.all);						//通道3参考计数设置(设置转换时间)
	LDC1614_WriteOneByte(DRIVE_CURRENT3_ADDRESS	,	DRIVE_CURRENT3.all);		//通道3电流传感器设备配置

	LDC1614_WriteOneByte(ERROR_CONFIG_ADDRESS		,	ERROR_CONFIG.all);			//错误配置
	LDC1614_WriteOneByte(MUX_CONFIG_ADDRESS			,	MUX_CONFIG.all);				//通道复用配置
	LDC1614_WriteOneByte(CONFIG_ADDRESS						,	CONFIG.all);							//配置寄存器
}

5.5. 读寄存器

struct Output_Result Read_LDC1614_Dat(int ReadChanel)//仅展示通道3
{
	DATA3_MSB.all=LDC1614_ReadOneByte(DATA3_MSB_ADDRESS);//读取通道0的MSB
	DATA3_LSB.all=LDC1614_ReadOneByte(DATA3_LSB_ADDRESS);//读取通道0的LSB
}

5.6. 中断函数

interrupt void XInt2(void)//LDC的INTB端口产生一个下降沿,说明数据转换完成,此时触发外部中断2,进行数据读取
{
	static int i=3;
	sensor_data=Read_LDC1614_Dat(i);
	sensor_data.chanel3=DATA3_MSB.bit.DATA3*65536  +  DATA3_LSB.bit.DATA3;//根据公式将两个寄存器的值加起来
	STATUS.all=LDC1614_ReadOneByte(STATUS_ADDRESS);//读取状态寄存器的值,读取后状态寄存器会全部清零
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//中断完成后要清除中断标志位
}

6. 实际测试

6.1. I2C通信

读取的数据波形如下:
读取数据波形

放大后的读取数据时第1 2 3步的波形如下:
在这里插入图片描述

6.2. 传感器谐振波形

非全电流模式下传感器谐振波形如下,可以看到波形频率约300kHz,通过换算实际得到数据,也可以得到约300kHz。
在这里插入图片描述

多通道模式下通道3与通道0传感器谐振波形:
在这里插入图片描述
INTB引脚与传感器波形:
在这里插入图片描述

6.3. 实测数据

通过实验平台调整传感器与被测物体间的距离(单位mm),测量LDC输出的数据,结果如下:
在这里插入图片描述
在这里插入图片描述

  • 10
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值