陈北 发表于 3 天前

ADC采集数据相差太多是为什么

void AdcSetRate(void)                //100KSPS@12.000MHz
{
        ADCCFG &= ~0x0f;
        ADCCFG |= 0x01;                        //SPEED(1)
        ADCTIM = 0x2e;                        //CSSETUP(0), CSHOLD(1), SMPDUTY(14)
}

void ADC_Init(void)
{
        P3M0 &= ~0x08; P3M1 |= 0x08;        //配置P3.3为高阻输入
        AdcSetRate();        //初始化ADC速度
        ADC_CONTR |= 0x80;        //打开ADC电源
}

uint ADC_Read(uchar no)
{
        uint adcvalue = 0;
        ADC_CONTR &= 0xf0;        //清除低四位
        ADC_CONTR |= no;        //配置ADC通道
        ADC_CONTR |= 0x40;        //启动ADC转换
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));        //等待标志位
        ADC_CONTR &= ~0x20;        //清除标准位
        adcvalue = (((uint)ADC_RES << 8) | ADC_RESL) >> 6; //读取ADC的值
        return adcvalue;
}

void main()
{
    ADC_Init();
    Delay_Ms(1);
    while(1)
    {
         ADC_Read(3);
    }
}
这是我的ADC配置,芯片是STC8G1K08A,在采集ADC数据时,采集的数据0x80左右,但示波器上看,P3.3的模拟电压大约在130mV,计算得出的ADC值在0x28作用,寻求大佬帮助

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

根据您提供的代码和描述,ADC采集数据与实际电压不符的问题可能由以下几个方面引起:

1. ADC配置不正确
   在 AdcSetRate() 函数中,ADCCFG &= ~0x0f; ADCCFG |= 0x01; 设置了 ADC 的速度为 SPEED(1)。但 STC8G1K08A 的 ADC 配置需结合 ADCCON 寄存器进行更细致的控制,例如采样时间、参考电压等。建议检查 ADCCON 是否设置正确。

2. 参考电压未正确配置
   ADC 的输出值依赖于参考电压(Vref)。若未明确设置参考电压(如使用内部 Vref 或外部 Vref),可能导致 ADC 读数异常。STC8G1K08A 默认使用 VDD 作为参考电压,但若 VDD 不稳定或未正确供电,也可能导致测量误差。

3. 通道选择或寄存器操作错误
   在 ADCRead(uchar no) 函数中,ADCCONTR &= 0xf0; ADCCONTR |= no; 可能存在位操作问题。STC8G1K08A 的 ADC 通道选择需要确保 no 的范围在有效范围内(通常为 0~7),且 ADCCONTR 的其他位(如启动位)是否被正确设置。

4. 采样时间不足
   在 AdcSetRate() 中,ADCTIM = 0x2e; 设置了采样时间。若该值过小,可能导致采样不充分,从而影响 ADC 转换精度。建议根据具体应用调整采样时间。

5. ADC 电源未完全开启
   ADCCONTR |= 0x80; 用于打开 ADC 电源,但需确保电源稳定后才开始转换。建议在 ADCInit() 后增加适当的延时(如 DelayMs(1);)以保证 ADC 正常工作。

6. ADC 结果寄存器读取方式错误
   在 ADCRead() 函数中,adcvalue = (((uint)ADCRES > 6; 存在语法错误。正确的读取方式应为 `adcvalue = (ADCRES

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 3 天前

没开EAXFR
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反刍/吐槽,新手乐园,毕业设计 国芯人工智能技术交流网站 - AI32位8051交流社区





陈北 发表于 3 天前

ercircle 发表于 2025-8-21 22:49
没开EAXFR
新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读!新手必读! - 老鸟反 ...

你好,我没有看懂您是什么意思,这个EAXFR是需要开启吗

huashanhui20 发表于 3 天前

ADC对齐错误,请使用ADC右对齐ADCCFG = 0x2f;

陈北 发表于 3 天前

huashanhui20 发表于 2025-8-21 23:29
ADC对齐错误,请使用ADC右对齐ADCCFG = 0x2f;

你好,我试过右对齐,结果是一样的

乘风飞扬 发表于 前天 09:15

ADC时序控制寄存器是扩展寄存器,扩展寄存器访问使能没有开启的情况下,对这个寄存器的配置是无效的


附件的ADC转换例子供参考:

hei188 发表于 前天 10:30

写的太笼统,不明白,应该写差了多少。

陈北 发表于 前天 11:04

乘风飞扬 发表于 2025-8-22 09:15
ADC时序控制寄存器是扩展寄存器,扩展寄存器访问使能没有开启的情况下,对这个寄存器的配置是无效的




你好,按照大佬说的,在最开始对P_SW2的bit7进行置位,但ADC采集还是不准确。我有一个疑问,这个ADCTIM是配置采集速度的,即使配置不成功,系统也有默认的值,采集速度也会影响ADC的值吗

神农鼎 发表于 前天 11:57

建议使用 AiCube-ISP-V6.96A 的 AiCube来自动生成程序

深圳国芯人工智能有限公司-工具软件
页: [1] 2
查看完整版本: ADC采集数据相差太多是为什么