找回密码
 立即注册
查看: 742|回复: 11

8G1K08A SOP-8 碰到内部基准电压问题求助

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-4 23:11:58 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-9-4 23:42 编辑

我在用8G1K08A SOP-8 封装的时候用电池供电,用官方的公式,VDDA = (unsigned int)(1023L*(*BGV/res));我用5V 输入,为什么得到的结果是3.069V,而不是5呢,请大家帮我分析一下程序 ,谢谢了;

#include <STC8H.H>
#include "delay.h"
#include <intrins.h>

#define ADC_Power 0x8f        //使能ADC模块                打开ADC                将ADC引脚设置到P55
#define ADC_Start 0x40        //开始ADC转换
#define ADC_Flag 0x20        //转换完成标志位
#define ADC_SYS 0x2f        //将ADC系统时钟设定为SYSclk/2/16  右对齐

unsigned int VDDA; // VDDA的电压值 单位毫伏
unsigned int *BGV; // 内部参考电压值 单位毫伏

void AD_Init()
{
        ADC_RES = 0;
        ADC_RESL = 0;
        P_SW2|= 0x80;
        ADCTIM=0x3f;
        P_SW2 &= 0x7f;
        ADCCFG=ADC_SYS;
        ADC_CONTR=ADC_Power;
        BGV = (unsigned int idata *)0xef;
        delay_ms(1);        
}

unsigned int ADC_Get()
{        
        unsigned int res;
        ADC_CONTR |= ADC_Start;
        ADCCFG=ADC_SYS;
    _nop_();
    _nop_();
    while((ADC_CONTR & ADC_Flag) == 0);   //等待完成
    ADC_CONTR &= ~ADC_Flag;     //清除完成标志位
res =((unsigned int)ADC_RES << 8) | ADC_RESL;
        return res;
}


以下是主程序

void main()
{
    P5M0 = 0x00; P5M1 = 0x30;
    P3M0 = 0x0c; P3M1 = 0x00;
        AD_Init();
        Uart_Init();
//        Fetch_VDDA();
        

        while(1)
        {
                Fetch_VDDA();
                printf("VDDA=%u\r\n",VDDA);   
                delay_ms(2000);
        }

}


printf打印出来是3069; 哪里出错了呢?


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-9-4 23:46:36 | 显示全部楼层
再打印15通道ADC值看看对不对,应该是1190*1024/5000≈244
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 2024-9-5 01:10:29 | 显示全部楼层
Screenshot_2024-09-05-01-06-30-218_cn.wps.moffice_eng.jpg

这个地址可能被使用了
REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-5 17:26:34 | 显示全部楼层
wnag*** 发表于 2024-9-4 23:30
先打印BGV值看看对不对,应该是1190左右

打印出来是1190,正确的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-5 17:31:10 | 显示全部楼层
void Fetch_VDDA(void)
{
  unsigned int res=0;
  unsigned char i;

  ADC_CONTR = ADC_Power;
  ADC_Get();
  ADC_Get();
  for(i=0;i<8;i++)
  {
    res+=ADC_Get();
  }
  res>>=3;
  VDDA = (unsigned int)(1023L*(*BGV/res));
}

这是输出 的函数
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-5 17:32:41 | 显示全部楼层
wnag*** 发表于 2024-9-5 06:58
对对对,建议使用专门例程函数读取内部参考电压

不理解,不知道怎么操作
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-02 05:31:55

16

主题

702

回帖

2474

积分

金牌会员

积分
2474
发表于 2024-9-5 17:42:43 | 显示全部楼层
硬件仿真看一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-9-5 18:34:19 | 显示全部楼层
用附件的例子试试

利用ADC15通道测量外部电压-RAM.zip

14.84 KB, 下载次数: 75

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-5 21:14:35 | 显示全部楼层
小*** 发表于 2024-9-5 17:42
硬件仿真看一下

图片
截图202409052111455963.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-02 21:21:58

1

主题

8

回帖

85

积分

注册会员

积分
85
发表于 2024-9-5 21:34:35 | 显示全部楼层
乘风*** 发表于 2024-9-5 18:34
用附件的例子试试

难道我电源是3,3的
截图202409052131261794.jpg

点评

你电源多少V都不确定吗?上万用表。  详情 回复 发表于 2024-9-5 21:48
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:51 , Processed in 0.373762 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表