Files
gd32e230_uart_ring_buffer/Inc/ldc1612.h
2025-08-14 00:41:12 +08:00

178 lines
5.8 KiB
C
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.

//
// Created by dell on 24-12-3.
// LDC1612 Inductive Sensor Driver Header
//
#ifndef LDC1612_H
#define LDC1612_H
#include "gd32e23x_it.h"
#include "gd32e23x.h"
#include "systick.h"
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "board_config.h"
#include "i2c.h"
/******************************************************************************/
/* LDC1612 I2C Address */
#define LDC1612_ADDR (0x2B) // 7-bit address
/* Register Addresses */
/******************************************************************************/
#define LDC1612_DATA_CH0_MSB 0x00
#define LDC1612_DATA_CH0_LSB 0x01
#define LDC1612_DATA_CH1_MSB 0x02
#define LDC1612_DATA_CH1_LSB 0x03
#define LDC1612_RCOUNT_CH0 0x08
#define LDC1612_RCOUNT_CH1 0x09
#define LDC1612_OFFSET_CH0 0x0C
#define LDC1612_OFFSET_CH1 0x0D
#define LDC1612_SETTLECOUNT_CH0 0x10
#define LDC1612_SETTLECOUNT_CH1 0x11
#define LDC1612_CLOCK_DIVIDERS_CH0 0x14
#define LDC1612_CLOCK_DIVIDERS_CH1 0x15
#define LDC1612_STATUS 0x18
#define LDC1612_ERROR_CONFIG 0x19
#define LDC1612_CONFIG 0x1A
#define LDC1612_MUX_CONFIG 0x1B
#define LDC1612_RESET_DEV 0x1C
#define LDC1612_DRIVE_CURRENT_CH0 0x1E
#define LDC1612_DRIVE_CURRENT_CH1 0x1F
#define LDC1612_MANUFACTURER_ID 0x7E
#define LDC1612_DEVICE_ID 0x7F
/* Channel Definitions */
/******************************************************************************/
#define LDC1612_CHANNEL_0 0
#define LDC1612_CHANNEL_1 1
/* Configuration Values */
/******************************************************************************/
#define LDC1612_CONVERSION_TIME_CH0 0x0546 // 转换时间
#define LDC1612_DRIVE_CURRENT_DEFAULT 0x9000 // 驱动电流
#define LDC1612_MUX_CONFIG_DEFAULT 0x020C // 无自动扫描滤波器带宽3.3MHz
#define LDC1612_SENSOR_CONFIG_ACTIVE 0x1601 // 激活配置
#define LDC1612_SENSOR_CONFIG_SLEEP 0x2801 // 休眠配置
#define LDC1612_ERROR_CONFIG_DEFAULT 0x0000 // 错误配置
#define LDC1612_SETTLECOUNT_CH0_DEFAULT 0x001E // 稳定时间
#define LDC1612_RESET_VALUE 0x8000 // 复位值
/* Coil Parameters */
/******************************************************************************/
#define LDC1612_COIL_RP_KOHM 7.2f // 并联电阻 (kΩ)
#define LDC1612_COIL_L_UH 33.0f // 电感值 (μH)
#define LDC1612_COIL_C_PF 150.0f // 电容值 (pF)
#define LDC1612_COIL_Q_FACTOR 35.97f // 品质因数
#define LDC1612_COIL_FREQ_HZ 2262000 // 谐振频率 (Hz)
/* Error Codes */
/******************************************************************************/
#define LDC1612_ERROR_NONE 0x00000000
#define LDC1612_ERROR_NO_COIL 0xF0000000
#define LDC1612_ERROR_UNDER_RANGE 0x80000000
#define LDC1612_ERROR_OVER_RANGE 0x40000000
#define LDC1612_ERROR_WATCHDOG 0x20000000
#define LDC1612_ERROR_AMPLITUDE 0x10000000
/* Status Definitions */
/******************************************************************************/
typedef enum {
LDC1612_STATUS_SUCCESS = 0,
LDC1612_STATUS_ERROR,
LDC1612_STATUS_TIMEOUT,
LDC1612_STATUS_INVALID_PARAM,
LDC1612_STATUS_NO_COIL,
LDC1612_STATUS_UNDER_RANGE,
LDC1612_STATUS_OVER_RANGE
} ldc1612_status_t;
typedef struct {
uint32_t raw_data;
uint32_t frequency;
float distance_mm;
bool error_flag;
uint8_t error_code;
} ldc1612_result_t;
/******************************************************************************/
/* Function Declarations */
/*!
\brief 初始化LDC1612传感器
\param[in] none
\param[out] none
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_init(void);
/*!
\brief 复位LDC1612传感器
\param[in] none
\param[out] none
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_reset(void);
/*!
\brief 配置单通道模式
\param[in] channel: 通道号 (0或1)
\param[out] none
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_config_single_channel(uint8_t channel);
/*!
\brief 读取制造商ID
\param[in] none
\param[out] none
\retval uint16_t 制造商ID
*/
uint16_t ldc1612_get_manufacturer_id(void);
/*!
\brief 读取设备ID
\param[in] none
\param[out] none
\retval uint16_t 设备ID
*/
uint16_t ldc1612_get_device_id(void);
/*!
\brief 读取通道原始数据
\param[in] channel: 通道号
\param[out] result: 结果结构体指针
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_read_channel(uint8_t channel, ldc1612_result_t *result);
/*!
\brief 设置驱动电流
\param[in] channel: 通道号
\param[in] current: 电流值
\param[out] none
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_set_drive_current(uint8_t channel, uint16_t current);
/*!
\brief 自动检测驱动电流
\param[in] channel: 通道号
\param[out] none
\retval ldc1612_status_t
*/
ldc1612_status_t ldc1612_auto_detect_drive_current(uint8_t channel);
/*!
\brief 获取状态字符串
\param[in] status: 状态码
\param[out] none
\retval const char* 状态字符串
*/
const char* ldc1612_get_status_string(ldc1612_status_t status);
#endif //LDC1612_H