YY2018 发表于 2025-7-13 19:41:09

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

芯片AI8H1K08通过内部1.19V测量芯片电池电压正确,
但是测量P32引脚ADC10电压一直不正常,
数据通过串口1发送进行查看

P32电路:

串口收到的数据:接收←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数据不正确      
                }               
      }
}


神农鼎 发表于 2025-7-13 19:55:54


YY2018 发表于 2025-7-13 20:04:25

神农鼎 发表于 2025-7-13 19:55


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

YY2018 发表于 2025-7-13 20:05:49

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

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

谢谢

YY2018 发表于 2025-7-13 20:13:04

神农鼎 发表于 2025-7-13 19:55


YY2018 发表于 2025-7-13 20:16:26

神农鼎 发表于 2025-7-13 19:55


芯片6脚ADC_VRef+是和芯片供电脚5接在一起的

DebugLab 发表于 2025-7-13 20:39:17

注意数据类型和强制类型转换
https://www.stcaimcu.com/forum.p ... id=18917&pid=175153

YY2018 发表于 2025-7-13 21:28:13

DebugLab 发表于 2025-7-13 20:39
注意数据类型和强制类型转换
https://www.stcaimcu.com/forum.p ... id=18917&pid=175153

谢谢,我看看

YY2018 发表于 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),表明该通道存在异常。

神农鼎 发表于 2025-7-13 23:00:58

8H1K08-36I-TSSOP20的ADC是10位,
0 ~ 1023











页: [1] 2 3
查看完整版本: 芯片AI8H1K08通过内部1.19V测量芯片电池电压正确但是测量P32引脚ADC10电压一直不正常