62 lines
1.9 KiB
C
62 lines
1.9 KiB
C
#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__
|