Ai8H2K ADC问题 | 已解决
最近在研究这个Ai8H2K这个芯片的ADC功能一个很奇怪的现象就是没有信号输入的时候就是最大值即默认为Vref值,
刚好和正常使用的逻辑反了 需要0-Vref 而不是Vref-0
希望高手指点下
关于Ai8H2K芯片的AD功能异常现象,您描述的“无信号输入时为Vref值”确实与常规的0-Vref逻辑相反。首先,建议检查芯片的参考电压(Vref)设置是否正确,确保其与设计规格一致。其次,排查硬件连接,确认输入信号路径无短路或开路现象。此外,软件配置也是关键,需核实AD转换的初始化设置,包括输入通道选择、采样时间等参数是否配置正确。若以上均无问题,可能需要考虑芯片内部的AD模块是否存在设计缺陷或固件bug,建议联系芯片厂商获取技术支持,或查阅最新的技术文档和勘误表以获取解决方案。如问题仍未解决,可考虑使用外部电路进行信号调理,以适应芯片的AD特性。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考] 使用ADC功能时,
相应的输入I/O需要配置成高阻输入,
如果设置为准双向会由于弱上拉的因素导致悬空的引脚默认高电平,采集到的就是最大值。
晓飛飛 发表于 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));}
}
#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);
}
神农鼎 发表于 2025-3-15 08:16
#include "reg51.h"
#include "intrins.h"
这个问题已解决 但是这个ADC采集的数据 不稳定上下漂移范围很大 tanbo123 发表于 2025-3-15 11:14
这个问题已解决 但是这个ADC采集的数据 不稳定上下漂移范围很大
要设计好你的硬件线路,参考下面的建议
神农鼎 发表于 2025-3-15 11:24
要设计好你的硬件线路,参考下面的建议
电路是按照这个电路来的 也许是板子布线问题 谢谢你的建议
页:
[1]