Files
ldc1612_cmake_vscode/LDC1612_USAGE_EXAMPLE.md
2025-08-17 02:58:32 +08:00

4.8 KiB
Raw Blame History

LDC1612 驱动使用指南

📌 概述

LDC1612是TI公司的涡流传感器芯片本驱动支持单通道(Channel 0)和双通道工作模式并提供了硬件IIC和软件IIC的灵活切换。

🔧 硬件IIC与软件IIC切换

方法一:通过 board_config.h 配置(推荐)

Inc/board_config.h 文件中修改以下配置:

/* 使用软件IIC */
#define SOFTWARE_IIC       // 启用软件IIC
// #undef  SOFTWARE_IIC   // 注释掉这行

/* 使用硬件IIC */
// #define SOFTWARE_IIC    // 注释掉这行  
#undef  SOFTWARE_IIC      // 使用硬件IIC

方法二:通过编译时定义

在CMakeLists.txt中添加

# 使用软件IIC
target_compile_definitions(${PROJECT_NAME} PRIVATE SOFTWARE_IIC)

# 使用硬件IIC移除上面的定义即可

📋 LDC1612 初始化序列

推荐的初始化步骤


    
    // 2. 检查传感器ID
    uint16_t manufacturer_id = ldc1612_get_manufacturer_id();
    uint16_t device_id = ldc1612_get_deveice_id();
    
    printf("Manufacturer ID: 0x%04X (Expected: 0x5449)\n", manufacturer_id);
    printf("Device ID: 0x%04X (Expected: 0x3055)\n", device_id);
    
    if (manufacturer_id != 0x5449 || device_id != 0x3055) {
        printf("ERROR: LDC1612 not detected!\n");
        return;
    }
    
    // 3. 复位传感器
    ldc1612_reset_sensor();
    delay_ms(100);
    
    // 4. 配置单通道模式
    ldc1612_single_ch0_config();
    
    // 5. 显示当前IIC类型
    printf("Current IIC Type: %s\n", ldc1612_get_iic_type());
    
    printf("LDC1612 initialization completed\n");
}

📊 数据读取示例

void ldc1612_read_example(void) {
    uint32_t raw_data;
    uint16_t status;
    
    // 检查数据是否准备好
    if (ldc1612_is_data_ready(CHANNEL_0)) {
        // 读取原始数据
        raw_data = ldc1612_get_raw_channel_result(CHANNEL_0);
        
        // 检查错误状态
        if (raw_data & 0xF0000000) {
            printf("Sensor Error: 0x%08X\n", raw_data);
            return;
        }
        
        // 获取有效数据 (28位)
        uint32_t sensor_data = raw_data & 0x0FFFFFFF;
        printf("Channel 0 Data: %u\n", sensor_data);
        
        // 转换为频率值 (可选)
        float frequency = (float)sensor_data * COIL_FREQ_HZ / 0x10000000;
        printf("Frequency: %.2f Hz\n", frequency);
    }
    
    // 读取状态寄存器
    status = ldc1612_get_sensor_status();
    printf("Status: 0x%04X\n", status);
}

⚠️ 常见错误代码

错误代码 说明
0xF0000000 ERR_NC - 未检测到线圈
0x80000000 ERR_UR - 欠量程错误
0x40000000 ERR_OR - 超量程错误
0x20000000 ERR_WD - 看门狗超时
0x10000000 ERR_AE - 振幅错误

🔍 寄存器配置说明

当前配置值解析

#define LDC1612_CONVERSION_TIME_CH0    0x0546  // 转换时间
#define LDC1612_DRIVE_CURRENT          0x9000  // 驱动电流
#define LDC1612_MUX_CONFIG             0x020C  // 多路复用配置
#define LDC1612_SENSOR_CONFIG_CH0      0x1601  // 传感器配置
#define LC_STABILIZE_TIME_CH0          0x001E  // LC稳定时间
  • 转换时间: 0x0546 = 1350个参考时钟周期
  • 驱动电流: 0x9000 = 高驱动电流设置
  • MUX配置: 0x020C = 无自动扫描3.3MHz滤波带宽
  • 传感器配置: 0x1601 = 启用传感器,连续转换模式

🛠️ 调试技巧

1. 检查IIC通信

void debug_iic_communication(void) {
    printf("=== IIC Communication Test ===\n");
    printf("IIC Type: %s\n", ldc1612_get_iic_type());
    
    uint16_t manufacturer_id = ldc1612_get_manufacturer_id();
    uint16_t device_id = ldc1612_get_deveice_id();
    
    printf("Manufacturer ID: 0x%04X\n", manufacturer_id);
    printf("Device ID: 0x%04X\n", device_id);
    
    if (manufacturer_id == 0xFFFF || device_id == 0xFFFF) {
        printf("ERROR: IIC communication failed!\n");
    } else if (manufacturer_id == 0x5449 && device_id == 0x3055) {
        printf("SUCCESS: LDC1612 detected and communicating\n");
    } else {
        printf("WARNING: Unexpected device detected\n");
    }
}

2. 自动检测驱动电流

void auto_detect_drive_current(void) {
    printf("=== Auto Drive Current Detection ===\n");
    ldc1612_drvie_current_detect(CHANNEL_0);
}

📈 性能优化建议

  1. 硬件IIC vs 软件IIC:

    • 硬件IIC: 更快速CPU占用率低
    • 软件IIC: 更灵活,便于调试
  2. 频率设置优化:

    • 根据实际线圈参数调整 COIL_L_UHCOIL_C_PF
    • 确保传感器频率在1-10MHz范围内
  3. 电源管理:

    • 不使用时可调用 ldc1612_set_sensor_config(LDC1612_SLEEP_MODE)

📚 参考资料

  • TI LDC1612 数据手册
  • GD32E230 参考手册
  • 本项目IIC驱动实现: i2c.csoft_i2c.c