尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32F103C8T6驱动LDC1614测试程序

STM32F103C8T6驱动LDC1614测试程序 一、LDC1614芯片简介LDC1614是德州仪器TI推出的4通道电感式传感控制器通过检测电感线圈的频率变化实现对导电物体如金属的距离、位置或材质的高精度测量。其核心特性包括4个独立传感通道支持多目标检测I2C接口地址0x2A7位兼容标准/快速模式可编程驱动电流1.5mA~32mA适配不同线圈分辨率达28位测量精度±1%低功耗模式适合电池供电场景。二、硬件连接2.1 核心连接表LDC1614引脚STM32F103C8T6引脚功能说明SCLPB6 (I2C1_SCL)I2C时钟线SDAPB7 (I2C1_SDA)I2C数据线VDD3.3V电源 (2.3V~3.6V)GNDGND地线INTBPA0 (可选)中断输出低有效CLKIN悬空内部RC振荡外部时钟输入可选2.2 线圈连接LDC1614需外接电感线圈如PCB螺旋线圈直径5~20mm线圈两端接LDC1614的CH0-CH3引脚每个通道对应一个线圈。三、STM32 I2C配置标准库3.1 I2C初始化函数#includestm32f10x.h#includei2c.hvoidI2C1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);// 配置PB6(SCL)、PB7(SDA)为复用开漏输出GPIO_InitStructure.GPIO_PinGPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_OD;// 复用开漏GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);// I2C1配置I2C_InitStructure.I2C_ModeI2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycleI2C_DutyCycle_2;// 2:1占空比I2C_InitStructure.I2C_OwnAddress10x00;// 主机地址可忽略I2C_InitStructure.I2C_AckI2C_Ack_Enable;// 使能ACKI2C_InitStructure.I2C_AcknowledgedAddressI2C_AcknowledgedAddress_7bit;// 7位地址I2C_InitStructure.I2C_ClockSpeed100000;// 100kHz标准模式I2C_Init(I2C1,I2C_InitStructure);I2C_Cmd(I2C1,ENABLE);// 使能I2C1}3.2 I2C读写函数// I2C发送数据寄存器地址数据voidI2C_WriteReg(uint8_tdev_addr,uint8_treg_addr,uint16_tdata){while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));// 等待总线空闲// 发送起始信号I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));// EV5// 发送设备地址写I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// EV6// 发送寄存器地址I2C_SendData(I2C1,reg_addr);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));// EV8// 发送数据16位分两次发送I2C_SendData(I2C1,(uint8_t)(data8));// 高8位while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_SendData(I2C1,(uint8_t)(data0xFF));// 低8位while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));// 发送停止信号I2C_GenerateSTOP(I2C1,ENABLE);}// I2C读取数据寄存器地址读取数据uint16_tI2C_ReadReg(uint8_tdev_addr,uint8_treg_addr){uint16_tdata0;while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));// 发送起始信号I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));// EV5// 发送设备地址写I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// EV6// 发送寄存器地址I2C_SendData(I2C1,reg_addr);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));// EV8// 发送重复起始信号I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));// EV5// 发送设备地址读I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Receiver);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));// EV6// 读取数据16位while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));// EV7dataI2C_ReceiveData(I2C1)8;// 高8位I2C_AcknowledgeConfig(I2C1,DISABLE);// 最后一次读取关闭ACKI2C_GenerateSTOP(I2C1,ENABLE);// 发送停止信号while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));// EV7data|I2C_ReceiveData(I2C1);// 低8位I2C_AcknowledgeConfig(I2C1,ENABLE);// 恢复ACKreturndata;}四、LDC1614初始化与配置4.1 寄存器定义关键寄存器// LDC1614寄存器地址部分#defineLDC1614_DEV_ADDR0x2A// 7位I2C地址#defineREG_DATA_CH00x00// 通道0数据寄存器28位#defineREG_DATA_CH10x02// 通道1数据寄存器28位#defineREG_DATA_CH20x04// 通道2数据寄存器28位#defineREG_DATA_CH30x06// 通道3数据寄存器28位#defineREG_RCOUNT_CH00x08// 通道0转换计数寄存器#defineREG_OFFSET_CH00x0C// 通道0偏移寄存器#defineREG_SETTLECOUNT_CH00x10// 通道0稳定计数寄存器#defineREG_CLOCK_DIVIDERS_CH00x14// 通道0时钟分频寄存器#defineREG_CONFIG0x1A// 全局配置寄存器#defineREG_MUX_CONFIG0x1B// 多路复用配置寄存器#defineREG_DRIVE_CURRENT0x1E// 驱动电流寄存器4.2 LDC1614初始化函数voidLDC1614_Init(void){// 1. 复位芯片写入CONFIG寄存器bit151I2C_WriteReg(LDC1614_DEV_ADDR,REG_CONFIG,0x8000);delay_ms(10);// 等待复位完成// 2. 配置全局参数CONFIG寄存器// bit150正常工作, bit141启用INTB, bit130连续转换模式// bit12-10000分频系数1, bit9-00x000保留I2C_WriteReg(LDC1614_DEV_ADDR,REG_CONFIG,0x4000);// 3. 配置多路复用MUX_CONFIG寄存器// bit15-13000通道序列0-3, bit120自动扫描, bit11-80x0F所有通道使能// bit7-600SETTLECOUNT分频, bit5-00x00保留I2C_WriteReg(LDC1614_DEV_ADDR,REG_MUX_CONFIG,0x0F00);// 4. 配置驱动电流DRIVE_CURRENT寄存器// CH0-CH3驱动电流0x1F约16mA根据线圈调整I2C_WriteReg(LDC1614_DEV_ADDR,REG_DRIVE_CURRENT,0x1F1F1F1F);// 5. 配置通道0参数以CH0为例I2C_WriteReg(LDC1614_DEV_ADDR,REG_RCOUNT_CH0,0x0FFF);// 转换计数最大值I2C_WriteReg(LDC1614_DEV_ADDR,REG_SETTLECOUNT_CH0,0x0400);// 稳定计数1024 cyclesI2C_WriteReg(LDC1614_DEV_ADDR,REG_CLOCK_DIVIDERS_CH0,0x1001);// 时钟分频1:1I2C_WriteReg(LDC1614_DEV_ADDR,REG_OFFSET_CH0,0x0000);// 偏移量0}参考代码 STM32F103C8T6驱动LDC1614测试程序www.youwenfan.com/contentcss/183148.html五、数据读取与处理5.1 读取通道数据LDC1614每个通道数据为28位存储在2个16位寄存器中高12位低16位需拼接后转换为实际频率值。// 读取通道0数据28位uint32_tLDC1614_ReadCh0(void){uint16_tdata_highI2C_ReadReg(LDC1614_DEV_ADDR,REG_DATA_CH0);// 高12位bit15-4uint16_tdata_lowI2C_ReadReg(LDC1614_DEV_ADDR,REG_DATA_CH01);// 低16位bit15-0uint32_tdata_28bit((uint32_t)(data_high0x0FFF)16)|data_low;// 拼接28位returndata_28bit;}5.2 数据转换为频率LDC1614的输出频率为fOUTfREF×228RCOUNT×DATAf_{OUT}\frac{f_{REF}×2^{28}}{RCOUNT×DATA}fOUT​RCOUNT×DATAfREF​×228​其中fREFf_{REF}fREF​参考频率由CLKIN或内部RC决定默认4MHzRCOUNTRCOUNTRCOUNT转换计数值REG_RCOUNT_CH0如0x0FFF4095DATADATADATA28位数据LDC1614_ReadCh0()返回值。floatLDC1614_DataToFreq(uint32_tdata_28bit){constfloatf_ref4000000;// 参考频率4MHzconstuint16_trcount0x0FFF;// RCOUNT值4095floatfreq(f_ref*(1UL28))/(rcount*data_28bit);// 计算频率Hzreturnfreq;}六、主程序测试流程#includestm32f10x.h#includei2c.h#includeldc1614.h#includeusart.h// 串口初始化用于打印数据intmain(void){SystemInit();// 系统时钟初始化72MHzUSART1_Init(115200);// 串口初始化波特率115200I2C1_Init();// I2C初始化LDC1614_Init();// LDC1614初始化printf(LDC1614 Test Start...\r\n);while(1){// 读取通道0数据uint32_tdata_ch0LDC1614_ReadCh0();floatfreq_ch0LDC1614_DataToFreq(data_ch0);// 打印结果串口printf(CH0 Data: 0x%08lX, Freq: %.2f Hz\r\n,data_ch0,freq_ch0);delay_ms(500);// 500ms刷新一次}}七、测试结果与分析7.1 预期输出通过串口助手如XCOM可观察到类似以下数据LDC1614 Test Start...CH0 Data:0x07A1203F,Freq:123456.78Hz CH0 Data:0x079F3045,Freq:123987.65Hz...当金属物体靠近线圈时频率会降低电感增大远离时频率升高电感减小。7.2 常见问题排查问题现象可能原因解决方案无数据输出I2C通信失败检查接线SCL/SDA是否接反、上拉电阻4.7kΩ数据全0或全F线圈未连接或损坏用万用表测量线圈电阻应10Ω频率值异常如0HzRCOUNT或DRIVE_CURRENT配置错误检查REG_RCOUNT_CH0和REG_DRIVE_CURRENT寄存器值八、总结本测试程序实现了STM32F103C8T6对LDC1614的基础驱动包括I2C通信、寄存器配置、数据读取与转换。通过串口打印的28位数据和频率值可验证LDC1614的正常工作。实际应用中需根据线圈参数电感、Q值调整驱动电流和RCOUNT以优化测量范围和精度。扩展方向添加多通道数据读取CH1-CH3实现距离-频率校准曲线通过实验数据拟合结合中断功能INTB引脚实现低功耗检测。
返回列表