ldc1314芯片工作原理、引脚参数及其应用例程详解

  电感-数字转换器LDC1314是电子工程人员经常会接触的芯片,LDC1314是4-通道12位的电感-数字转换器(LDC),用于解决电感检测问题。采用多个信道和遥感的支持,LDC1314以最低的成本与最小的功耗来获得电感感测的性能和可靠性。此类产品使用简便,仅需要传感器频率处于 1kHz 至 10MHz 的范围内即可开始工作。 由于支持的传感器频率范围 1kHz 至 10MHz 较宽,因此还支持使用非常小的 PCB 线圈,从而进一步降低感测解决方案的成本和尺寸。

  ldc1314工作原理

  导体在与交变电磁(EM)场接触时将引起磁场变化,可以采用传感器中的电感传感器进行检测。一个电感器与一个电容器可以构造一个L-C振荡器,可以用来产生电磁场。在一个LC振荡器中,当电磁场收到干扰时,可以观察到电感发生微小的偏移,与共振频率存在一定关系。

  利用这个原理,在LDC1314是一个电感-数字转换器(LDC),通过测量LC谐振器的振荡频率。该器件输出数字值与振荡频率成比例关系。此频率测量值可以被转换为一个等效电感。

ldc1314芯片工作原理、引脚参数及其应用例程详解

  LDC1314特征参数

  *合格的汽车应用

  *符合AEC-Q100的结果如下:

  -设备温度等级1:- 40°C至125°C环境工作温度范围

  -设备HBM的ESD等级分类2

  -装置CDM ESD分类等级C

  *易于使用的最低配置要求

  *测量多达4个传感器与一个集成电路

  *多渠道支持环境和老龄化补偿

  *多通道遥感提供最低系统成本

  *引脚兼容的介质和高分辨率选项

  -LDC1312-Q1/LDC1314-Q1: 2/4-ch 12-bit LDC

  -LDC1612-Q1/LDC1614-Q1: 2/4-ch 28-bit LDC

  *支持广泛的传感器频率范围10MHz 1KHz

  *35μ低功耗的睡眠模式 -200钠关断模式 *3.3V的操作

  *支持内部或外部参考时钟 *对直流磁场和磁铁的免疫

ldc1314芯片工作原理、引脚参数及其应用例程详解

  ldc1314引脚图

  ldc1314芯片工作原理、引脚参数及其应用例程详解

  ldc1314引脚定义

 ldc1314芯片工作原理、引脚参数及其应用例程详解

ldc1314芯片工作原理、引脚参数及其应用例程详解

  说明:DAP不能做地使用,可以悬空,为获得最佳性能对DAP应连接到相同的电位作为设备的GND管脚。

编辑推荐:LDC1314中文手册

  典型ldc1314应用电路一:

  ldc1314芯片工作原理、引脚参数及其应用例程详解

  典型ldc1314应用电路二:

  系统以MSP430F169单片机为控制核心,采用可充电锂电池为电源,以L298N为驱动芯片,结合PWM技术实现对4个直流减速机速度控制,从而实现小车的前进、转向等功能。在本系统中,单片机通过LDC1314芯片实现对赛道表面金属丝和硬币的识别与小车位置的判定,利用电机尾部的霍尔传感器与编码器实现对小车行进路程的计算,并使用LCD12864液晶实时显示小车行进路程与所用时间。

  ldc1314芯片工作原理、引脚参数及其应用例程详解

  电机驱动芯片L298N原理图如下

  ldc1314芯片工作原理、引脚参数及其应用例程详解

  主程序

  void main( void )

  {

  P2SEL &=~ BIT7; //蜂鸣器

  P2DIR |= BIT7;

  P2OUT &=~ BIT7;

  InitSys();

  InitLDC1314();

  Ini_Lcd();

  P6SEL=0;P6DIR|=BIT0+BIT1;P6OUT&=~(BIT0+BIT1); //电机旋转方向

  _EINT();

  int i;

  InitPWM(0x03E8); //PWM初始化,采用TB输出2路PWM波

  TBCCR1=TBCCR2=0;

  for(i=0;i《1500;i++) // 电感传感器自校准

  {

  D1=LDC1314_Result(1);

  D2=LDC1314_Result(2);

  D3=LDC1314_Result(3);

  }

  initTA(); // 定时器A初始化,用于计时

  go(); //直行

  TIme=mc=sx=0; //开始执行 时间路程清零

  while(1)

  {

  Component_Display(4,0,TIme);//时间

  sl=(int)((float)sx*3.0);

  Component_Display(4,4,sl); //路程

  if(sl》800){while(1);_DINT();TBCCR1=TBCCR2=0;} //到达终点 结束

  value1 = LDC1314_Result(1); Component_Display(1,1,value1);//显示通道1

  value2 = LDC1314_Result(2); Component_Display(2,1,value2);

  value3 = LDC1314_Result(3); Component_Display(3,1,value3);//显示

  // 硬币的检测

  if ((value1》(2+D1))|| (value2》(2+D2))|| (value3》(2+D3)) || (abs(value2-D2)》20)|| (abs(value1-D1)》20)|| (abs(value3-D3)》20))

  P2OUT |=BIT7;

  else

  P2OUT &=~BIT7;

  //循迹

  if((abs(value3-D3)《20)&&(D3》value3)) { turn_r(); }

  else if((abs(value1-D1)《20)&&(D1》value1)) { turn_l(); }

  else go();

  }

  }

  ldc1314例程

  ldc1314例程一:

  MSP430F149/169驱动LDC1314程序,可用于金属的检测,已给出各个文件名称,自建工程添加文件即可使用。显示程序较为普遍,未给出。

  MAIN.C文件

  #include 《msp430f169.h》

  #include “config.h”

  #include “12864.h”

  extern uint LDC1314_Result(uchar Channal);

  extern void InitLDC1314(void);

  /***************************************************

  系统初始化,MCLK=8MHz,SMCLK=1MHz

  *************************************************/

  void InitSys()

  {

  unsigned int iq0;

  _DINT(); // 关中断,本可以不必这样小心

  WDTCTL = WDTPW + WDTHOLD;

  BCSCTL1 &=~XT2OFF;

  do

  {

  IFG1 &= ~OFIFG; // 清除振荡器失效标志

  for (iq0 = 0xFF; iq0 》 0; iq0--); // 延时,等待XT2起振

  }

  while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振

  BCSCTL2 =SELM_2+SELS+DIVS_3; //MCLK,SMCLK时钟为XT2,SMCLK8分频1MHz

  }

  void main( void )

  {

  uint value = 0;

  InitSys();

  InitLDC1314();

  Ini_Lcd();

  Component_Display(4,0,134);//显示

  while(1)

  {

  value = LDC1314_Result(0);//通道0

  Component_Display(1,0,value);//显示

  delay_ms(200);

  }

  _NOP();

  }

  LDC1314.C文件

  #include “LDC1314.h”

  /*I2C总线初始化*/

  void I2C_Init()

  {

  LDC_SCL_L(); //拉低时钟线

  delay_us(5); //延时

  I2C_Stop();

  }

  //**************************************

  //I2C起始信号

  //**************************************

  void I2C_Start()

  {

  LDC_SCL_OUT(); // SCL设置为输出

  LDC_SDA_OUT(); // SDA设置为输出

  LDC_SDA_H(); //拉高数据线

  LDC_SCL_H(); //拉高时钟线

  delay_us(5); //延时

  LDC_SDA_L(); //产生下降沿

  delay_us(5); //延时

  LDC_SCL_L(); //拉低时钟线

  }

  //**************************************

  //I2C停止信号

  //**************************************

  void I2C_Stop()

  {

  LDC_SCL_OUT(); // SCL设置为输出

  LDC_SDA_OUT(); // SDA设置为输出

  LDC_SDA_L(); //拉低数据线

  LDC_SDA_H(); //产生上升沿

  delay_us(5); //延时

  }

  //**************************************

  //I2C发送应答信号

  //入口参数:ack (0:ACK 1:NAK)

  //**************************************

  void I2C_SendACK(uchar ack)

  {

  if(ack)

  LDC_SDA_H();

  else

  LDC_SDA_L();

  // SDA = ack; //写应答信号

  LDC_SCL_H(); //拉高时钟线

  delay_us(5); //延时

  LDC_SCL_L(); //拉低时钟线

  delay_us(5); //延时

  }

  //**************************************

  //I2C接收应答信号,0有效,1无效

  //**************************************

  uchar I2C_RecvACK()

  {

  uchar cy;

  LDC_SCL_OUT(); // SCL设置为输出

  LDC_SCL_H(); //拉高时钟线

  delay_us(5); //延时

  if(LDC_SDA_DAT())

  {

  cy=1;

  }

  else

  {

  cy=0;

  }

  // cy = SDA; //读应答信号

  LDC_SCL_L(); //拉低时钟线

  delay_us(5); //延时

  LDC_SDA_OUT(); // SDA设置为输出

  return cy;

  }

  /*向I2C总线发送一个字节数据*/

  uchar I2C_SendByte(uchar dat)

  {

  uchar i,temp;

  LDC_SCL_OUT(); // SCL设置为输出

  LDC_SDA_OUT(); // SDA设置为输出

  for (i=0; i《8; i++) //8位计数器

  {

  if((dat《《i))

  {

  LDC_SDA_H();

  }

  else

  {

  LDC_SDA_L();

  }

  LDC_SCL_H(); //拉高时钟线

  delay_us(5); //延时

  LDC_SCL_L(); //拉低时钟线

  delay_us(5); //延时

  }

  temp=I2C_RecvACK();

  return temp;

  }

  /*从I2C总线接收一个字节数据*/

  uchar I2C_RecvByte()

  {

  uchar i;

  uchar dat = 0,cy;

  LDC_SCL_OUT(); // SCL设置为输出

  LDC_SDA_OUT(); // SDA设置为输出

  LDC_SDA_H(); //使能内部上拉,准备读取数据,

  LDC_SDA_IN(); // SDA设置为输入,准备向主机输入数据

  for (i=0; i《8; i++) //8位计数器

  {

  dat 《《= 1;

  LDC_SCL_H(); //拉高时钟线

  delay_us(5); //延时

  if(LDC_SDA_DAT())

  {

  cy=1;

  }

  else

  {

  cy=0;

  }

  dat |= cy; //读数据

  LDC_SCL_L(); //拉低时钟线

  delay_us(5); //延时

  }

  LDC_SDA_OUT();

  return dat;

  }

  /*向I2C设备写入一个字节数据*/

  /*

  void ByteWrite1314(uchar REG_Address,uchar REG_data)

  {

  I2C_Start(); //起始信号

  I2C_SendByte(SlaveAddress); //发送设备地址+写信号

  I2C_SendByte(REG_Address); //内部寄存器地址,

  I2C_SendByte(REG_data); //内部寄存器数据,

  I2C_Stop(); //发送停止信号

  }

  */

  //**************************************

  //从I2C设备读取一个字节数据

  //**************************************

  /*

  uchar ByteRead1314(uchar REG_Address)

  {

  uchar REG_data;

  I2C_Start(); //起始信号

  I2C_SendByte(SlaveAddress); //发送设备地址+写信号

  I2C_SendByte(REG_Address); //发送存储单元地址,从0开始

  I2C_Start(); //起始信号

  I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号

  REG_data=I2C_RecvByte(); //读出寄存器数据

  I2C_SendACK(1); //接收应答信号

  I2C_Stop(); //停止信号

  return REG_data;

  }

  */

  //**************************************

  //向I2C设备写入一个字数据

  //**************************************

  void WordWrite1314(uchar REG_Address,uint REG_data)

  {

  uchar REG_data_H,REG_data_L;

  REG_data_L=(uchar)(REG_data&0xFF);

  REG_data_H=(uchar)((REG_data&0xFF00)》》8);

  I2C_Start(); //起始信号

  I2C_SendByte(SlaveAddress); //发送设备地址+写信号

  I2C_SendByte(REG_Address); //内部寄存器地址

  I2C_SendByte(REG_data_H); //发送内部寄存器数据,高8位

  I2C_SendByte(REG_data_L); //发送内部寄存器数据,低8位

  I2C_Stop(); //发送停止信号

  }

  /*从I2C设备读取一个字数据*/

  uint WordRead1314(uchar REG_Address)

  {

  uint REG_data;

  uchar REG_data_H,REG_data_L;

  I2C_Start(); //起始信号

  I2C_SendByte(SlaveAddress); //发送设备地址+写信号

  I2C_SendByte(REG_Address); //发送存储单元地址,从0开始

  I2C_Start(); //起始信号,??原因不明

  I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号

  REG_data_H=I2C_RecvByte(); //读出寄存器数据

  I2C_SendACK(0); //接收应答信号

  REG_data_L=I2C_RecvByte(); //读出寄存器数据

  I2C_SendACK(1); //接收应答非信号

  I2C_Stop(); //发送停止信号

  REG_data=REG_data_H;

  REG_data《《=8;

  REG_data|=REG_data_L;

  return REG_data;

  }

  /*初始化LDC1314*/

  void InitLDC1314(void)

  {

  I2C_Init();

  while(WordRead1314(DEVICE_ID)!=0x3025);//等待,I2C正常

  //WordWrite1314(RESET_DEV,0x8800);

  /*重启LDC1314*/

  WordWrite1314(CONFIG,0x2451);

  /*默认值,睡眠模式开,方便配置*/

  WordWrite1314(CLOCK_DIVIDERS_CH0,0X500a);//fSENSOR不分频,fCLK 2分频

  /* 时钟源分频选择,分频系数1,1

  Using L and C, 得fSENSOR = 1/2π&TImes;sqrt(L &TImes;C)

  注意fSENSOR须小于8.75 MHz,fSENSOR分频系数才能置1

  注意fREF0须至少大于 4 × fSENSOR,以决定fREF0分频系数

  fin0 = fSENSOR0/CH0_FIN_DIVIDER

  fREF0 = fCLK / CH0_FREF_DIVIDER

  *

  WordWrite1314(SETTLECOUNT_CH0,0x0A60);

  /* 建立(Settling)时间设置

  计算得Q=Rp*sqrt(C/L)

  寄存器值小于10取10,大于10取其值,且应满足以下条件:

  CHx_SETTLECOUNT ≥ QSENSORx × fREFx / (16 × fSENSORx) (10进制)

  (1)fSENSORx:x通道传感器频率

  (2)fREFx:x通道参考频率

  (3)QSENSORx:品质因数,Q=Rp ×sqrt(C/L)

  注意,不等式右边算出有小数则向上取整

  建立时间tSx = (CH0_SETTLECOUNT*16) / fREF0

  通道切换时间tCsd = Channel Switch Delay = 692 ns + 5 / fref (us)

  */

  WordWrite1314(RCOUNT_CH0,0xFFFF);

  /*转换时间设置

  得转换时间tCx = TSAMPLE(采样时间) – tSx – tCsd (us)

  由下式算出寄存器的值(有小数则向下取整(舍去)):

  转换时间tCx = (CHx_RCOUNT × 16) / fREFx (10进制)

  注意寄存器的值化为16进制

  */

  /*使用ERROR_CONFIG默认值,错误中断关闭*/

  WordWrite1314(DRIVE_CURRENT_CH0,0x9800);

  /*传感器驱动电流设置,使用请同时注意CONFIG寄存器相关配置

  查数据手册的Figure 15,得IDRIVE值(10进制),INIT_DRIVE值不使用,保持默认

  使用CH0_IDRIVE[15:11]时,Rp Override须打开

  使用CH0_INIT_IDRIVE[10:6]时,保证AUTO_AMP_DIS位不置位

  */

  //WordWrite1314(MUX_CONFIG,0x801);

  /* 多通道转换选择,输入尖峰脉冲滤波器带宽选择,使用请同时注意CONFIG寄存器相关配置!

  (a)置AUTOSCAN_EN位为b1使能连续模式(sequential mode)

  (b)置RR_SEQUENCE位为b00使能两个通道的数据转换(channel 0,channel 1)

  (c)置DEGLITCH位为b100设定输入尖峰脉冲滤波器带宽,此值必须高于谐振频率fTank!

  */

  //WordWrite1314(OFFSET_CH0,0x00);

  /*频率偏移(补偿)设置

  可以设置从每个数据值中减去偏移值,以补偿频率偏移或最大化动态范围的样本数据

  fOFFSET0 = CH0_OFFSET * (fREF0/2^16)

  且偏移值应小于 fSENSORx_MIN / fREFx

  */

  //WordWrite1314(RESET_DEV,0x00);

  /*输出增益设置,[10:9],对所有通道有效

  对于传感器信号变化量小于满量程25%的系统,设置输出增益可以提供更高的分辨率(精度)

  */

  /*

  状态寄存器:STATUS,ERROR_CONFIG

  */

  WordWrite1314(CONFIG,0x1501);

  /*默认连续转换(单)通道0,睡眠模式关,Rp Override开

  低功耗模式关,传感器自动幅度校正(AUTO_AMP)关,Ref时钟源选外部时钟源

  INTB中断开,高电流驱动关*/

  }

  /*读取LDC1314转换结果,输入参数为选择通道数*/

  uint LDC1314_Result(uchar Channal)

  {

  uint temp=0;

  switch(Channal)

  {

  case 0x00:

  temp=WordRead1314(DATA_CH0); //通道0

  break;

  case 0x01:

  temp=WordRead1314(DATA_CH1); //通道1

  break;

  case 0x02:

  temp=WordRead1314(DATA_CH2); //通道2

  break;

  case 0x03:

  temp=WordRead1314(DATA_CH3); //通道3

  break;

  default :

  break;

  }

  while((temp&0xF000)!=0);

  /*有错误Flag!,有输出增益时注意此句,可能出错!

  0x000 = under range,0xfff = over range

  */

  return temp;

  }

  LDC1314.H文件

  #ifndef __LDC1314_H

  #define __LDC1314_H

  #include 《msp430f169.h》

  #include “config.h”

  static void I2C_Init();

  static void I2C_Start();

  static void I2C_Stop();

  static void I2C_SendACK(uchar ack);

  static uchar I2C_RecvACK();

  static uchar I2C_SendByte(uchar dat);

  static uchar I2C_RecvACK();

  static void WordWrite1314(uchar REG_Address,uint REG_data);

  static uint WordRead1314(uchar REG_Address);

  void InitLDC1314(void);

  uint LDC1314_Result(uchar Channal);

  //****定义LDC1314硬件接口(不同硬件修改此处即可)***********

  #define LDC1314DIR P1DIR

  #define LDC1314OUT P1OUT

  #define LDC1314IN P1IN

  #define LDC_SCL BIT2

  #define LDC_SDA BIT3

  #define LDC_INTB BIT4//中断

  #define LDC_SD BIT5//置高,则进入掉电模式

  //*********I2C硬件相关接口函数**************

  #define LDC_SCL_OUT() LDC1314DIR |= LDC_SCL // SCL脚输出

  #define LDC_SCL_H() LDC1314OUT |= LDC_SCL // SCL拉高

  #define LDC_SCL_L() LDC1314OUT &= ~LDC_SCL // SCL拉低

  #define LDC_SDA_OUT() LDC1314DIR |= LDC_SDA // SDA脚输出

  #define LDC_SDA_H() LDC1314OUT |= LDC_SDA // SDA拉高

  #define LDC_SDA_L() LDC1314OUT &= ~LDC_SDA // SDA拉低

  #define LDC_SDA_IN() LDC1314DIR &= ~LDC_SDA // SDA脚输入

  #define LDC_SDA_DAT() (LDC1314IN&LDC_SDA) // SDA输入数据

  #define SlaveAddress 0x2A //IIC写入时的地址字节数据,+1为读取,ADDR接高电平,地址则为0x2B

  #define DATA_CH0 0x00 //Channel 0 Conversion Result and Error Status

  #define DATA_CH1 0x02

  #define DATA_CH2 0x04

  #define DATA_CH3 0x06

  #define RCOUNT_CH0 0x08 //Reference Count setting for Channel 0

  #define RCOUNT_CH1 0x09

  #define RCOUNT_CH2 0x0A

  #define RCOUNT_CH3 0x0B

  #define OFFSET_CH0 0x0C //Offset value for Channel 0

  #define OFFSET_CH1 0x0D

  #define OFFSET_CH2 0x0E

  #define OFFSET_CH3 0x0F

  #define SETTLECOUNT_CH0 0x10 //Channel 0 Settling Reference Count

  #define SETTLECOUNT_CH1 0x11

  #define SETTLECOUNT_CH2 0x12

  #define SETTLECOUNT_CH3 0x13

  #define CLOCK_DIVIDERS_CH0 0x14

  #define CLOCK_DIVIDERS_CH1 0x15

  #define CLOCK_DIVIDERS_CH2 0x16

  #define CLOCK_DIVIDERS_CH3 0x17

  #define STATUS 0x18 //Device Status Report

  #define ERROR_CONFIG 0x19 //Error Reporting Configuration

  #define MUX_CONFIG 0x1A //Channel Multiplexing Configuration

  #define CONFIG 0x1B //Conversion Configuration

  #define RESET_DEV 0x1C //Reset Device

  #define DRIVE_CURRENT_CH0 0x1E //Channel 0 sensor current drive configuration

  #define DRIVE_CURRENT_CH1 0x1F

  #define DRIVE_CURRENT_CH2 0x20

  #define DRIVE_CURRENT_CH3 0x21

  #define MANUFACTURER_ID 0x7E //厂商ID,默认值0x5449

  #define DEVICE_ID 0x7F //设备ID,默认值0x3054

  #endif

  • ldc1314芯片工作原理、引脚参数及其应用例程详解已关闭评论
    A+
发布日期:2019年07月14日  所属分类:电子百科