alanma 发表于 2024-3-6 16:03:31

STC8H4K的被测试通道用内置1.19V反推计算的问题

请问STC8H4K系列用内置1.19V参考电压计算ADC输入电压怎么计算?规格书中只有外部参考电压和MCU工作电压计算公式,没有内部参考1.19V的计算公式,是不是用1.19V替换外部参考电压即可?

kksk 发表于 2024-3-6 16:08:25

不是的,内部1.19V参考电压连接的是ADC15通道,即当选择通道15时,ADC被转换通道的输入电压Vin约等于1.19V。
你可以用这个测量结果反推出ADC外部参考电源的电压,然后再用这个外部参考电源电压得出其它通道的电压。

alanma 发表于 2024-3-6 16:18:36

kksk 发表于 2024-3-6 16:08
不是的,内部1.19V参考电压连接的是ADC15通道,即当选择通道15时,ADC被转换通道的输入电压Vin约等于1.19V ...

还是没有明白如何反推?有没有反推计算公式?

kksk 发表于 2024-3-6 16:37:24

alanma 发表于 2024-3-6 16:18
还是没有明白如何反推?有没有反推计算公式?

反推就是已知你公式里面的Vin、转换结果和常数(1024或4096),算出MCU工作电压Vcc或ADC外部参考源的电压。

21cnsound 发表于 2024-3-6 17:00:40

alanma 发表于 2024-3-6 16:18
还是没有明白如何反推?有没有反推计算公式?

被测电压=1.19V*被测电压ADC值/通道15的ADC值

angmall 发表于 2024-3-6 21:33:29

利用 ADC 第 15 通道测量外部电压或电池电压


#include "reg51.h"
#include "intrins.h"

#define FOSC            11059200UL
#define BRT             (65536 - FOSC / 115200 / 4)

sfr   AUXR      =   0x8e;

sfr   ADC_CONTR   =   0xbc;
sfr   ADC_RES   =   0xbd;
sfr   ADC_RESL    =   0xbe;
sfr   ADCCFG      =   0xde;

sfr   P_SW2   =   0xba;
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

int *BGV;                                       //内部1.19V参考信号源值存放在idata中
                                                //idata的EFH地址存放高字节
                                                //idata的F0H地址存放低字节
                                                //电压单位为毫伏(mV)
bit busy;

void UartIsr() interrupt 4
{
    if (TI)
    {
      TI = 0;
      busy = 0;
    }
    if (RI)
    {
      RI = 0;
    }
}

void UartInit()
{
    SCON = 0x50;
    TMOD = 0x00;
    TL1 = BRT;
    TH1 = BRT >> 8;
    TR1 = 1;
    AUXR = 0x40;
    busy = 0;
}

void UartSend(char dat)
{
    while (busy);
    busy = 1;
    SBUF = dat;
}

void ADCInit()
{
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;

    ADCCFG = 0x2f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x8f;                           //使能ADC模块,并选择第15通道
}

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

void main()
{
    int res;
    int vcc;
    int i;

    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    BGV = (int idata *)0xef;
    ADCInit();                                  //ADC初始化
    UartInit();                                 //串口初始化

    ES = 1;
    EA = 1;

//ADCRead();
//ADCRead();                                  //前两个数据建议丢弃

    res = 0;
    for (i=0; i<8; i++)
    {
      res += ADCRead();                     //读取8次数据
    }
    res >>= 3;                                  //取平均值

    vcc = (int)(1024L * *BGV / res);            //(10位ADC算法)计算VREF管脚电压,即电池电压
//vcc = (int)(4096L * *BGV / res);            //(12位ADC算法)计算VREF管脚电压,即电池电压
                                                //注意,此电压的单位为毫伏(mV)
    UartSend(vcc >> 8);                         //输出电压值到串口
    UartSend(vcc);

    while (1);
}

晓飛飛 发表于 2024-3-6 21:48:36

VREF脚连接VDD,也就是用外部电源作为ADC的基准,去采集通道15,也就是内部1.19V的这个基准源,采集值/1024 = 1.19/VDD
这就能反推VDD的值了。

alanma 发表于 2024-3-6 22:14:51

21cnsound 发表于 2024-3-6 17:00
被测电压=1.19V*被测电压ADC值/通道15的ADC值

懂了,谢谢

王昱顺 发表于 2024-3-7 08:40:38

其实就是内部1.19v出厂校准过,所以就当这个电压是准的。

而verf的作用就是提供给adc进行电压比较。
举个例子,12位adc最大值4096,如果verf=5V,adc=2.5V,那么adc读到的就是2048。
如果verf=5V,adc=5V,那么adc读到的就是4096。

所以反推其实就是假定这个1.19V是准的,通过看在整个分辨率宽度内的占比,推测整个分辨率的电压值

zhang32568 发表于 2024-3-23 21:01:50

我折腾了两天总算搞明白了。内部参考电压1.19V可以都取出来。内部1.19V的adc码可以读出来。1.19V除以 adc码是斜率。是一个固定的数值!!
读取外部的adc码。那么外部电压除以外部adc码等于斜率。这样就求出来了。我现在就用这个还是非常好用!
页: [1]
查看完整版本: STC8H4K的被测试通道用内置1.19V反推计算的问题