tanbo123 发表于 2025-3-14 18:54:03

Ai8H2K ADC问题 | 已解决

最近在研究这个Ai8H2K这个芯片的ADC功能   
一个很奇怪的现象就是没有信号输入的时候就是最大值即默认为Vref值,
刚好和正常使用的逻辑反了   需要0-Vref   而不是Vref-0

希望高手指点下

国芯人工智能 发表于 2025-3-14 18:58:00

关于Ai8H2K芯片的AD功能异常现象,您描述的“无信号输入时为Vref值”确实与常规的0-Vref逻辑相反。首先,建议检查芯片的参考电压(Vref)设置是否正确,确保其与设计规格一致。其次,排查硬件连接,确认输入信号路径无短路或开路现象。此外,软件配置也是关键,需核实AD转换的初始化设置,包括输入通道选择、采样时间等参数是否配置正确。若以上均无问题,可能需要考虑芯片内部的AD模块是否存在设计缺陷或固件bug,建议联系芯片厂商获取技术支持,或查阅最新的技术文档和勘误表以获取解决方案。如问题仍未解决,可考虑使用外部电路进行信号调理,以适应芯片的AD特性。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]

晓飛飛 发表于 2025-3-14 23:11:39

使用ADC功能时,
相应的输入I/O需要配置成高阻输入,
如果设置为准双向会由于弱上拉的因素导致悬空的引脚默认高电平,采集到的就是最大值。

tanbo123 发表于 2025-3-15 08:14:34

晓飛飛 发表于 2025-3-14 23:11
使用ADC功能时,相应的输入IO需要配置成高阻输入,如果设置为准双向会由于弱上拉的因素导致悬空的引脚默认 ...

这个IO配置问题已经确定过 没有问题 采集的AD口是处于悬空状态(方便测试) 会不会是程序设计问题
#include <ai8h.h>
#include <intrins.h>
#include <1640.h>
void delay1(uchar x) //延时程序
{
        uchar y,z;
        for(y=x;y>0;y--)
       for(z=150;z>0;z--);
}
void Init()
{
        P1M0 = 0x01;   //设置P1.0为ADC口
    P1M1 = 0x00;
        P2M0=0x00;
        P2M1=0x00;
        P3M0=0x00;
        P3M1=0x00;       
}
uint ad_result(uchar adda) //A/D转换函数
{
        uintadzh;
        ADC_CONTR=0xc0+adda;                //启动A/D转换
        delay1(10);
        while(!(ADC_CONTR&0x20)){;}        //等待A/D转换结束
        ADC_CONTR=0x80+adda;
        adzh=ADC_RES;
        adzh=(adzh<<8)+ADC_RESL;
        return(adzh);                        //返回10位AD转换结果
}
void Timer0_Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xCD;                                //设置定时初始值
        TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0=1;
        EA=1;
}
void main()
{
        Init();
        Timer0_Init();       
        ADCCFG=0x27;//专换结果高4位,低8位 256个时钟        
        while(1)
        {
                  out_disp();               
        }
}
void TM0_Isr() interrupt 1
{
    static uint a;
        if(a<500) a++;   //测试端口
        else {a=0;DP_disp(0,ad_result(0));}
}

神农鼎 发表于 2025-3-15 08:16:52




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

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)

sbit    EADC    =   IE^5;

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;

void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中断标志
    P2 = ADC_RES;                               //读取ADC结果
    ADC_CONTR |= 0x40;                        //继续AD转换
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P1M0 = 0x00;                              //设置P1.0为ADC口
    P1M1 = 0x01;
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x80;                           //使能ADC模块
    EADC = 1;                                 //使能ADC中断
    EA = 1;
    ADC_CONTR |= 0x40;                        //启动AD转换

    while (1);
}


tanbo123 发表于 2025-3-15 11:14:10

神农鼎 发表于 2025-3-15 08:16
#include "reg51.h"
#include "intrins.h"


这个问题已解决    但是这个ADC采集的数据 不稳定上下漂移范围很大

神农鼎 发表于 2025-3-15 11:24:58

tanbo123 发表于 2025-3-15 11:14
这个问题已解决    但是这个ADC采集的数据 不稳定上下漂移范围很大

要设计好你的硬件线路,参考下面的建议









tanbo123 发表于 2025-3-15 12:19:30

神农鼎 发表于 2025-3-15 11:24
要设计好你的硬件线路,参考下面的建议

电路是按照这个电路来的 也许是板子布线问题    谢谢你的建议
页: [1]
查看完整版本: Ai8H2K ADC问题 | 已解决