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

179 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LDC1612 驱动使用指南
## 📌 概述
LDC1612是TI公司的涡流传感器芯片本驱动支持单通道(Channel 0)和双通道工作模式并提供了硬件IIC和软件IIC的灵活切换。
## 🔧 硬件IIC与软件IIC切换
### 方法一:通过 board_config.h 配置(推荐)
`Inc/board_config.h` 文件中修改以下配置:
```c
/* 使用软件IIC */
#define SOFTWARE_IIC // 启用软件IIC
// #undef SOFTWARE_IIC // 注释掉这行
/* 使用硬件IIC */
// #define SOFTWARE_IIC // 注释掉这行
#undef SOFTWARE_IIC // 使用硬件IIC
```
### 方法二:通过编译时定义
在CMakeLists.txt中添加
```cmake
# 使用软件IIC
target_compile_definitions(${PROJECT_NAME} PRIVATE SOFTWARE_IIC)
# 使用硬件IIC移除上面的定义即可
```
## 📋 LDC1612 初始化序列
### 推荐的初始化步骤
```c
// 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");
}
```
## 📊 数据读取示例
```c
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 - 振幅错误 |
## 🔍 寄存器配置说明
### 当前配置值解析
```c
#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通信
```c
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. 自动检测驱动电流
```c
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_UH``COIL_C_PF`
- 确保传感器频率在1-10MHz范围内
3. **电源管理**:
- 不使用时可调用 `ldc1612_set_sensor_config(LDC1612_SLEEP_MODE)`
## 📚 参考资料
- TI LDC1612 数据手册
- GD32E230 参考手册
- 本项目IIC驱动实现: `i2c.c``soft_i2c.c`