Q289466080 发表于 2024-1-10 15:57:43

关于adc_stc.c中16次ADC采集的平均值问题

本帖最后由 Q289466080 于 2024-1-10 15:57 编辑

uint16 GetADC_CHX(uint8 chx)
{
    uint16 ADCx;
    uint8 i;

    ADCInit(0); //ADC 初始化

    //通过ADC的chx通道读取Bandgap电压的ADC测量值
    ADCRead(chx); //前两个数据丢弃
    ADCRead(chx);
    ADCx = ADCRead(chx);

    for (i = 0; i < 16; i++)
    {
      ADCx += ADCRead(chx);
    }

    ADCx >>= 4; //取平均值
    return ADCx;
}代码中(代码是adc_stc.c中的),FOR循环前有一次采样,FOR循环里有16次,一共17次。>>4是16次平均值
范例代码:1-老刘爱捣鼓示波器,使用I2C OLED屏显示或者通过USB-CDC虚拟串口送STC-ISP虚拟OLED接口显示

_奶咖君_ 发表于 2024-1-10 16:57:20

诶 好像看起来是有问题的0.0emm 这不应该测不出来问题把。。
等大佬们的回复看看

社区闲人 发表于 2024-1-10 17:07:54

本帖最后由 社区闲人 于 2024-1-10 17:10 编辑

楼主有心了,确实是代码不严谨。第12行应改为:ADCx = 0;

_奶咖君_ 发表于 2024-1-10 17:16:07

社区闲人 发表于 2024-1-10 17:07
楼主有心了,确实是代码不严谨。应该删除第12行。

直接删除会有问题把,,如果工程配置在large模式,这个ADCx变量应该会被定义到xdata区 由于xdata区中的数据不会被清除的原因,如果不加入对变量的初始化代码。直接进行运算操作应该会导致数据错误把。
我感觉 要么在定义变量的时候直接对变量进行初始化操作,或者在这个变量使用前进行初始化操作。
可以把11行代码 改为ADCx = 0; 应该就可以了。
不知道我上面的理解是正确的么。。我记得会有问题{:4_167:}
页: [1]
查看完整版本: 关于adc_stc.c中16次ADC采集的平均值问题