STC8G1K17的ADC15通道采样不准,3.9V读出3.4V
#include "ADCVDC_Driver.h"int *BGV;//内部 Bandgap 电压值存放在 idata 中
//idata 的 EFH 地址存放高字节
//idata 的 F0H 地址存放低字节
//电压单位为毫伏(mV)
/**
* @brief初始化ADC
* @param无
* @retval 无
*/
void ADCInit(void)
{
BGV = (int idata *)0xef;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x8f; //使能ADC模块,并选择第15通道
ES = 1;
}
int ADCRead()
{
int res;
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
res = (ADC_RES << 8) | ADC_RESL; //读取ADC结果
return res;
}
/**
* @brief计算电池电压
* @param无
* @retval 无
*/
int VBACCount(void)
{
int res;
int vcc;
int i;
ADCRead();
ADCRead(); //前两个数据建议丢弃
res = 0;
for (i=0; i<8; i++)
{
res += ADCRead(); //读取8次数据
}
res >>= 3; //取平均值
vcc = (int)(1024L * *BGV / res); //(10位ADC算法)计算VREF管脚电压,即电池电压
return res;
}
附加是我的测试代码
万用表测量VCC电压4.97V
示波器测量的VCC纹波为50mV左右
串口输出的ADC测量VCC为4960mV~4980mV
使用BGV反推出的VCC电压还是比较准确的
你那边需要看看你的VCC是或否纹波太大导致误差大
另外你程序这里return的是res,而不是vcc,是否是笔误
直接下载“ADC相关程序-STC8G1K08-20PIN”里的“03-ADC读取BandGap计算VCC-串口1(P3.1)返回结果-C语言”里的"ADC.hex"测试. 下载时选择主频11.0592MHZ。
测试时, 电脑的串口助手设置115200,8,n,1.
本程序演示查询方式读取bandgap转换的ADC值并计算MCU的工作电压VCC, 通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.
好的
页:
[1]