Files
DCU_APP/GD32E508_DCU_APP/device/adc.h
T
cbb 44d407390b fix(esc_lan9252): 修复LAN9252 HBI访问模型和IRQ输出使能问题
- 修正HBI访问模型:将ESC核心CSR(0x0000-0x0FFF)改为通过ECAT_CSR_CMD/DATA
  间接端口访问,解决此前直接寻址导致核心寄存器恒读0/写丢弃的问题

- 新增csrRead/csrWrite/pramRead/pramWrite接口,正确实现LAN9252访问端口操作

- 添加PDI就绪检测:等待DL_STATUS bit0置位确认EEPROM加载完成和EtherCAT核心使能

- 实现IRQ引脚输出使能:配置IRQ_CFG和INT_EN寄存器,使EtherCAT事件能到达PB1,
  解决PDI_Isr未触发导致SAFEOP->OP无限挂起的问题

- 为ESC_EXMC硬件诊断添加CONFIG_ESC_EXMC_DIAG门控,默认关闭避免影响正常运行

- 修正system_gd32e50x.c中HXTAL故障诊断的寄存器偏移和位设置错
2026-09-02 02:38:35 +08:00

122 lines
4.7 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.
#ifndef DEVICE_ADC_H
#define DEVICE_ADC_H
#include <stdint.h>
/**
* @brief ADC 采样模块。
* @note 负责 VIN_ADC、内部温度与内部参考电压的 DMA 扫描采样与工程值换算。
*/
class Adc {
public:
/**
* @brief ADC 采样结果结构体。
* @note 保存外部 VIN_ADC、内部温度与内部参考电压的原始值,以及可直接使用的工程值。
*/
struct Sample {
uint16_t vin_raw; /**< 外部 VIN_ADC(PA6)原始 ADC 数值。 */
uint16_t temp_raw; /**< 内部温度通道原始 ADC 数值。 */
uint16_t vref_raw; /**< 内部参考电压通道原始 ADC 数值。 */
float vin_adc_v; /**< VIN_ADC 引脚处电压(分压后的 ADC 端电压),单位 V。 */
float vdda; /**< 根据内部参考电压换算得到的 MCU 供电电压,单位 V。 */
float temperature; /**< 根据温度通道换算得到的芯片温度,单位 ℃。 */
uint8_t valid; /**< 采样是否有效:1=有效,0=存在原始值/换算异常。 */
};
/** init 故障码(0=成功;经 0xA3 INIT_STATUS fault_codes[] 上报,网页解码文字见 initial.h 注释) */
enum InitFault : uint8_t {
kFaultOk = 0U, /**< 成功 */
kFaultCalRstTimeout = 1U, /**< 校准复位(RSTCLB)等待超时,ADC 硬件无响应 */
kFaultCalTimeout = 2U, /**< 校准(CLB)等待超时 */
kFaultVddaInvalid = 3U, /**< 校准后 VREFINT→VDDA 采样链无效(DMA/通道/供电异常) */
};
/**
* @brief 初始化 ADC 硬件、扫描通道与 DMA 循环缓存。
* @param[in] 无。
* @param[out] 无。
* @retval uint8_t InitFault 故障码(0=校准完成且 VDDA 采样链有效)。
* @note 完成 ADC 三通道扫描、DMA 循环搬运、PA6(VIN_ADC) 模拟输入配置以及内部通道校准。
*/
static uint8_t init();
/**
* @brief 读取指定通道在 DMA 缓存中的原始 ADC 值。
* @param[in] channel 目标 ADC 通道号。
* @param[out] 无。
* @retval uint16_t 对应通道原始值;不受支持的通道返回 0。
*/
static uint16_t readRaw(uint8_t channel);
/**
* @brief 读取外部 VIN_ADC(PA6)通道原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t VIN_ADC 原始 ADC 数值。
*/
static uint16_t readVinRaw();
/**
* @brief 读取内部参考电压原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t 内部 VREFINT 通道原始 ADC 数值。
*/
static uint16_t readVrefRaw();
/**
* @brief 读取内部温度通道原始值。
* @param[in] 无。
* @param[out] 无。
* @retval uint16_t 内部温度通道原始 ADC 数值。
*/
static uint16_t readTempRaw();
/**
* @brief 根据 VIN_ADC 原始值与 VDDA 计算 ADC 引脚处电压。
* @param[in] vinRaw VIN_ADC 通道原始 ADC 数值。
* @param[in] vdda 当前 MCU 供电电压,单位 V。
* @param[out] 无。
* @retval float VIN_ADC 引脚电压,单位 V。
* @note 当前仅计算分压后的 ADC 端电压;若需换算输入母线电压,需要补充完整分压比。
*/
static float calculateVinAdcVoltage(uint16_t vinRaw, float vdda);
/**
* @brief 根据内部参考电压原始值计算 VDDA。
* @param[in] vrefRaw 内部 VREFINT 通道原始 ADC 数值。
* @param[out] 无。
* @retval float 换算得到的 MCU 供电电压,单位 V。
* @note 当 vrefRaw 为 0 时返回默认值 VDDA,避免除零异常。
*/
static float calculateVdda(uint16_t vrefRaw);
/**
* @brief 根据温度原始值与 VDDA 计算芯片温度。
* @param[in] tempRaw 内部温度通道原始 ADC 数值。
* @param[in] vdda 当前 MCU 供电电压,单位 V。
* @param[out] 无。
* @retval float 换算得到的芯片温度,单位 ℃。
*/
static float calculateTemperature(uint16_t tempRaw, float vdda);
/**
* @brief 采集一组完整 ADC 样本并完成工程值换算。
* @param[in] sample 指向输出 Sample 的指针;允许为空。
* @param[out] sample 当指针非空时,写入 VIN/温度/VREF 原始值与换算结果。
* @retval 无返回值。
* @note 当 sample 为 nullptr 时直接返回,不执行写操作。
*/
static void collectSample(Sample *sample);
private:
/**
* @brief 初始化 ADC DMA 通道配置。
* @param[in] 无。
* @param[out] 无。
* @retval 无返回值。
*/
static void initDma();
};
#endif /* DEVICE_ADC_H */