#ifndef __ADC_H__ #define __ADC_H__ #include "../App/config.h" /* ====== ADC 通道与硬件引脚定义 ====== */ #define ADC_CHANNEL_KEY_DOWN 11 // KEY_DOWN (P0.3) 对应 STC32G 的 ADC 通道 11 #define ADC_CHANNEL_BATTERY 3 // 电池检测 (P1.3) 对应 STC32G 的 ADC 通道 3 #define ADC_CHANNEL_CHRG_DET 2 // 充电检测 (P1.2) 对应 STC32G 的 ADC 通道 2 /* ====== 判定阈值定义 (基于 12 位 ADC, 0~4095) ====== */ // KEY_DOWN 2.2V 常态 (ADC~2700), 3.7V 按下 (ADC 饱和 4095) #define KEY_DOWN_ADC_THRESHOLD 3400 // ADC 采样值超过 3400 判定为按键按下 /** * @brief 初始化 STC32G 硬件 ADC 模块 * @details 开启 ADC 电源、设置结果右对齐格式及采样时钟分频,并将 P0.3 和 P1.3 设置为高阻输入模式 */ void ADC_Init(void); /** * @brief 读取指定 ADC 通道的原始 12 位转换结果 * @param channel ADC 通道号 (0~15) * @return u16 12 位 ADC 采样原始值 (0 ~ 4095) */ u16 ADC_ReadRaw(u8 channel); /** * @brief 对指定 ADC 通道进行多重采样与中值滤波 * @param channel ADC 通道号 (0~15) * @return u16 滤波后的 12 位 ADC 采样值 */ u16 ADC_ReadFiltered(u8 channel); /** * @brief 判断 KEY_DOWN (P0.3) 当前是否处于按下状态 (ADC 阈值判定) * @return bit 1: 按下 (电压 ~3.7V), 0: 松开/常态 (电压 ~2.0V) */ bit ADC_IsKeyDown(void); /** * @brief 获取 P1.3 电池分压测得的实际电压 (毫伏 mV) * @return u16 电池电压,单位 mV (例如 3850 代表 3.85V) */ u16 ADC_GetBatteryVoltage_mV(void); /** * @brief 获取电池电量百分比 (0% ~ 100%) * @return u8 电量百分比 (0 ~ 100) */ u8 ADC_GetBatteryPercent(void); /** * @brief 检测 USB 充电是否插入 * @return bit 0=未充电, 1=充电中 * @note TP4054 CHRG 引脚开漏输出,低电平时表示正在充电。 * 需要 MCU 内部上拉或外部上拉电阻。 */ bit Is_Charging(void); #endif // __ADC_H__