使用STC8G1K08实现ADC采集电池电压,输入电压稳定不变时,使用串口发送的v_bat值始终不正确,使用串口发送adc_res值基本准确,代码如下,在main.c中使用while不停调用函数void ADC_BATTERY()
#define _ADC_C
#include "ADC.h"
#include "config.h"
#include "Uart.h"
#define ADC_RES_MAX 1024 // ADC采样最大值
#define V_REF (3.3) // 参考电压为3.3V
#define V_BAT_MAX (2.8) // 电池最大电压为2.8V
#define V_BAT_MIN (1.8) // 电池最小电压为1.8V
#define V_BAT_WARN (2.1) // 电池电量过低警告阈值为2.1V
unsigned int ADC_Value; // 定义全局变量,用于存储采样结果
void ADC_Init()
{
P_SW2 |= 0x80;
ADCTIM = 0x2A; //设置 ADC 内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x20; //设置 ADC 时钟为系统时钟/2,右对齐
ADC_CONTR = 0x80; //使能 ADC 模块
}
void ADC_ISR() interrupt 5
{
ADC_Value = (unsigned int)(ADC_RES << 8) + (unsigned int)ADC_RESL;
ADC_CONTR &= ~0x20; //中断标志位清0
}
void ADC_BATTERY()
{
unsigned char battery_percent = 0; // 定义电量百分比变量
float adc_res;
float v_bat;
ADC_CONTR &= 0xf0; //底四位清零
ADC_CONTR |= 0x0C; //置通道12
ADC_CONTR |= 0x40; // 启动ADC转换
adc_res = (float)ADC_Value * V_REF / ADC_RES_MAX ;// 计算ADC被转换通道的输入电压
v_bat = adc_res * V_BAT_MAX / V_REF;// 计算电池电压值
battery_percent = (v_bat - V_BAT_MIN) / (V_BAT_MAX - V_BAT_MIN) * 100;// 计算电池电量百分比
UartSend(v_bat);