找回密码
 立即注册
查看: 237|回复: 22

芯片AI8H1K08通过内部1.19V测量芯片电池电压正确但是测量P32引脚ADC10电压一直不正常

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 19:41:09 | 显示全部楼层 |阅读模式
芯片AI8H1K08通过内部1.19V测量芯片电池电压正确,
但是测量P32引脚ADC10电压一直不正常,
数据通过串口1发送进行查看

P32电路: 723aea87ce5ce28103a5e48f3297764.png

串口收到的数据:[19:13:53.234]接收←04 A1 10 92 FF E1   
    其中:  04 A1  转换后是内部电压1185 --1.185V
               10 92   转换后芯片电池电压4242  --4.21V  万用表实际测量电压为4.21V   精度感觉非常高
               FF E1   转换后P32电压65505      明显不对,不知道哪里有问题,请高手指点,谢谢

改了ADC很多次,得到的P32电压还是不正确


以下是完整程序:
/*
        2025-07-13: 1.获取内部1.19电压OK
                                2.通过1.19计算芯片供电VVC功能OK
*/


#include<AI8H.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

int *BGV;
int VCC,res;
int VDD;
int P32_V;
int adcValue=0;

int P32ADC=0;

int res_ADC10=0,Volate_ADC10=0;

bit        B_TX_Busy = 0;        //发送忙标志

static char time_cous=0;

bit Time_flag=0;
bit Send_flag=0;

sbit led1=P3^6;  
sbit led2=P3^5;
//*********************************************
void Delay10ms(void)        //@24.000MHz
{
        unsigned char data i, j, k;

        i = 2;
        j = 56;
        k = 172;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//*********************************************
void Delay1ms(void)        //@24.000MHz
{
        unsigned char data i, j;

        _nop_();
        i = 32;
        j = 40;
        do
        {
                while (--j);
        } while (--i);
}
//*********************************************
void port_init()
{
        P0M0 = 0x00;
        P0M1 = 0x00;

        P1M0 = 0x0E;
        P1M1 = 0x00;

        P2M0 = 0x00;
        P2M1 = 0x00;

        P3M0 = 0x00;
        P3M1 = 0x00;

        P4M0 = 0x00;
        P4M1 = 0x00;

        P5M0 = 0x00;
        P5M1 = 0x00;

        P6M0 = 0x00;
        P6M1 = 0x00;
}
//*********************************************
void Timer0_Init(void)                //10毫秒@24.000MHz
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xE0;                                //设置定时初始值
        TH0 = 0xB1;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
//*********************************************
void Uart1_Init(void)        //9600bps@24.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0x8F;                        //设置定时初始值
        T2H = 0xFD;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        ES = 1;                                //使能串口1中断
}
//*********************************************
void Uart1SendData(uchar ch)
{      
    while(B_TX_Busy);                        //不忙后发送数据
    SBUF = ch;                 //写数据到UART数据寄存器
        B_TX_Busy = 1;
}
//*********************************************
void Uart1_Isr(void) interrupt 4
{
        if (TI)                                //检测串口1发送中断
        {
                TI = 0;                        //清除串口1发送中断请求位
                B_TX_Busy = 0;
        }
        if (RI)                                //检测串口1接收中断
        {
                RI = 0;                        //清除串口1接收中断请求位
        }
}
//*********************************************
void Timer0_Isr(void) interrupt 1
{//10ms
        time_cous++;
        if(time_cous>99)//100*10=1000ms=1s
        {
                time_cous=0;
                Time_flag=!Time_flag;
                Send_flag=1;

                led2=!led2;
        }
}
//*********************************************
void adc_int()// 初始化ADC
{
       P1M0 = 0x0E;        //设置P1.0为ADC口
       P1M1 = 0x01;

    //设置P3.2为ADC输入 (ADC10通道)
       P3M1 |= (1 << 2);   //设为高阻输入(模拟输入)
       P3M0 &= ~(1 << 2);

        P_SW2 |= 0x80;
        ADCTIM = 0x3f;      //设置ADC内部时序
        P_SW2 &= 0x7f;

        ADCCFG=0x2f;

//     ADC_CONTR = 0x80;   //使能ADC模块
        ADC_CONTR=0x8f;                //使能ADC模块
        Delay1ms();                    //@24.000MHz
}
//*********************************************
int ADCRead()
{
        int resX;

        ADC_CONTR|=0x40;                   //启动转换
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&0x20));  //查询ADC完成标志
        ADC_CONTR&=~0x20;                   //清完成标志
        resX=(ADC_RES<<8)|ADC_RESL;

        return resX;      
}
int ADCReadP32()
{
        int resY;

        ADC_CONTR|=0x4A;                   //启动转换
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&0x20));  //查询ADC完成标志
        ADC_CONTR&=~0x20;                   //清完成标志
        resY=(ADC_RES<<8)|ADC_RESL;

        return resY;      
}
//*********************************************
void Read_VCC()        //读取芯片供电VCC
{
        char i=0;
        res=0;
        for(i=0;i<8;i++)
        {
                res+=ADCRead();
        }
        res>>=3;    //8次

        VCC=(int)(1024L* *BGV/res);        //获取电池电压--测量是4.24,万用表测量是4.21 OK

        P32ADC=ADCReadP32();  //读取P32ADC10通道        --有问题
        Volate_ADC10=(P32ADC * VCC) / 1023.0f;  //读取P32ADC10通道         --有问题
}
//*********************************************
void main()
{
        Delay10ms();
        port_init();
        Timer0_Init();                //10毫秒@24.000MHz
        Uart1_Init();            //9600bps@24.000MHz
        EA=1;
        adc_int();                        // 初始化ADC

        BGV=(int idata*)0xef;        //读取内部1.19V电压

        ADCRead();        //前两次丢弃
        ADCRead();        //前两次丢弃

        while(1)
        {

                if(Send_flag==1)
                {
                        Send_flag=0;
                        led1=!led1;

                        Uart1SendData(*BGV >> 8);    //串口1发送内部1.19V参考信号源的高字节  ok
                        Uart1SendData(*BGV);            //串口1发送内部1.19V参考信号源的低字节  ok

                        Read_VCC();        //读取芯片供电VCC  

                        Uart1SendData(VCC >> 8); //串口1发送芯片供电VCC的高字节        ok
                        Uart1SendData(VCC);          //串口1发送芯片供电VCC的低字节        ok

                        Uart1SendData(Volate_ADC10 >> 8);         //串口1发送P32数据不正确
                        Uart1SendData(Volate_ADC10);                 //串口1发送P32数据不正确      
                }               
        }
}


回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-07-31 10:37:58

760

主题

1万

回帖

1万

积分

管理员

积分
18139
发表于 2025-7-13 19:55:54 | 显示全部楼层
截图202507131955405787.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 20:04:25 | 显示全部楼层

是的,我用的芯片就是AI8H1K08-QFN20封装的,P3.2(ADC10通道)引脚是芯片第10脚没有错,就是不知道为什么测量出来的值不正确
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 20:05:49 | 显示全部楼层
国芯人工智能 发表于 2025-7-13 19:43
针对您提供的芯片AI8H1K08在ADC10测量P32引脚电压异常的问题,以下为专业分析与建议:

首先,根据您描述的 ...

谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 20:13:04 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 20:16:26 | 显示全部楼层

芯片6脚ADC_VRef+是和芯片供电脚5接在一起的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 2025-7-13 20:39:17 | 显示全部楼层
注意数据类型和强制类型转换
https://www.stcaimcu.com/forum.p ... id=18917&pid=175153
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 21:28:13 | 显示全部楼层
DebugLab 发表于 2025-7-13 20:39
注意数据类型和强制类型转换
https://www.stcaimcu.com/forum.p ... id=18917&pid=175153

谢谢,我看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-07-29 19:51:44
已绑定手机

3

主题

16

回帖

87

积分

注册会员

积分
87
发表于 2025-7-13 21:31:56 | 显示全部楼层
DebugLab 发表于 2025-7-13 20:39
注意数据类型和强制类型转换
https://www.stcaimcu.com/forum.p ... id=18917&pid=175153

如果是数据类型的问题,但是我得到的内部电压1.19V,电池电压都很准啊,就是测P3.2引脚ADC10通道就不正常
串口接收数据:04 A1 10 92 FF E1,其中:
04 A1 对应内部电压1185V(实际为119V),说明内部参考电压测量正常;
10 92 对应芯片电池电压4242,换算后为421V,与万用表实测一致;
FF E1 对应P32引脚电压65505,明显超出ADC量程(通常为0~4095或0~65535),表明该通道存在异常。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:144
  • 最近打卡:2025-07-31 10:37:58

760

主题

1万

回帖

1万

积分

管理员

积分
18139
发表于 2025-7-13 23:00:58 | 显示全部楼层
8H1K08-36I-TSSOP20的ADC是10位
0 ~ 1023

截图202507132302568245.jpg


截图202507132305179941.jpg

截图202507132306099236.jpg

截图202507132307438229.jpg


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-31 23:03 , Processed in 0.125801 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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