智*** 发表于 7 天前

32g12k128 VCC=Vref+=3.3V实测ADC13脚只有1.6V,读出AD=0x0fff,那出错

32g12k128 VCC=Vref+=3.3V实测ADC13脚只有1.6V,读出AD=0x0fff,那出错

u16 Water_AD(u8 channel)//channel = 0~15
{
      ADC_RES = 0;
      ADC_RESL = 0;

      ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
      ADC_START = 1;//启动ADC转换
      _nop_();
      _nop_();
      _nop_();
      _nop_();

      while(ADC_FLAG == 0);   //wait for ADC finish
      ADC_FLAG = 0;   //清除ADC结束标志
      return(((u16)ADC_RES << 8) | ADC_RESL);

国芯人工智能 发表于 7 天前

根据您提供的信息,STC32G12K128芯片在VCC和VREF+均为3.3V的情况下,ADC13引脚实际电压为16V,但读取到的AD值为0x0FFF(即4095),显然存在异常。以下是对该问题的专业分析与建议:

一、ADC工作原理简述

STC32G12K128内置12位逐次逼近型ADC,其参考电压由VREF+决定。当VREF+为3.3V时,ADC满量程对应为4095(即0x0FFF)。因此,理论上ADC输出应为:

$$
\text{AD} = \left( \frac{V{\text{in}}}{V{\text{ref}}} \right) \times 4095
$$

若VCC=VREF+=3.3V,而ADC13脚输入电压为16V,则远高于参考电压,此时ADC应无法正常转换,可能产生错误结果或溢出。

二、问题分析

1. 输入电压超出参考电压范围
ADC13脚输入电压为16V,明显高于VREF+(3.3V),属于过压输入,可能导致以下问题:
ADC内部电路损坏或误判;
ADC转换结果异常,如读取到最大值0x0FFF;
引脚保护电路未有效动作,导致异常。

2. 硬件连接问题
检查ADC13引脚是否被正确配置为模拟输入;
确保ADC13引脚未被误用为数字IO或复用功能;
检查是否有外部电路(如分压电阻)导致输入电压异常。

3. 软件配置问题
检查ADC初始化代码是否正确设置:
ADCCONTR寄存器中通道选择是否正确;
ADCFLAG标志位是否被正确清除;
ADCRES和ADCRESL寄存器是否被正确读取;
是否存在多通道连续采样或中断处理干扰。

4. 参考电压不稳定
若VREF+未稳定供电或存在噪声,也可能导致ADC读数异常。建议使用外部精密参考源或对VREF+进行滤波处理。

三、建议排查步骤

1. 确认ADC13引脚功能
   查阅数据手册,确保ADC13为模拟输入引脚,并且未被配置为其他功能。

2. 检查ADC配置代码
确认ADCCONTR寄存器中通道选择是否正确(channel=13);
确保ADCSTART被正确置1以启动转换;
确认ADCFLAG标志位被正确清除。

3. 测量实际输入电压
   使用万用表或示波器测量ADC13脚的实际电压,确认是否为16V。若确实为16V,说明输入信号超出ADC量程。

4. 检查参考电压稳定性
   测量VREF+电压是否为3.3V,是否存在波动或噪声。

5. 测试其他通道
   尝试读取其他ADC通道,确认是否也出现类似问题,以判断是单通道故障还是整体ADC异常。

6. 硬件保护措施
   若ADC13引脚需接入高于VREF+的电压,应添加限幅电路(如TVS二极管或分压网络),避免损坏ADC模块。

四、结论

当前ADC13脚输入电压16V远高于参考电压3.3V,导致ADC无法正常工作,读取到最大值0x0FFF是合理现象。建议立即检查输入信号是否符合ADC量程要求,并采取必要的保护措施。同时,检查ADC配置代码及硬件连接,确保系统稳定运行。

如需进一步调试,可提供完整的ADC初始化代码及硬件连接图,以便更精确分析问题根源。

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 32g12k128 VCC=Vref+=3.3V实测ADC13脚只有1.6V,读出AD=0x0fff,那出错