Zhouzhou 发表于 2023-9-14 08:44:51

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;
}

zhp 发表于 2023-9-14 10:37:36

附加是我的测试代码

万用表测量VCC电压4.97V
示波器测量的VCC纹波为50mV左右
串口输出的ADC测量VCC为4960mV~4980mV
使用BGV反推出的VCC电压还是比较准确的

你那边需要看看你的VCC是或否纹波太大导致误差大
另外你程序这里return的是res,而不是vcc,是否是笔误

梁工 发表于 2023-9-14 11:33:42

直接下载“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.



Zhouzhou 发表于 2023-9-14 14:02:41

好的
页: [1]
查看完整版本: STC8G1K17的ADC15通道采样不准,3.9V读出3.4V