绎妄无绎 发表于 2025-7-18 04:43:49

ADC 切换通道需要关ADC电源吗

型号 是Stc8h1k08我看手册上没有关于这个的说明   Adc切换的时候我直接默认是换通道但是正常使用的时候是读数正常,一切换通道读数马上异常,甚至固定在一个值不变,工作在异常状态翻了一下手册没说明,不知道什么原因想了一下,会不会跟adc电源有关系?然后在结果返回那里加了一个关闭adc电源后续切换通道读书就正常了

这是以下代码:
#include <STC8H.h>

#include <intrins.h>
void AdcSetRate(bit t);
float adcRes(int num,float voltage );
void Delay1ms(void) //@24.000MHz
{
  unsigned char data i, j;

  _nop_();
  i = 32;
  j = 40;
  do
  {
    while (--j);
  } while (--i);
}


float adc(bit ch, float voltage)
{
    int res;
if (ch==1)
{
AdcSetRate(1);//1是温度  选择p36
}
else
{
AdcSetRate(0);//0是电压  选择p33
}




ADC_CONTR |= 0x80;  // 开启ADC电源
Delay1ms();         // 延时
EA = 0;            
ADC_CONTR |= 0x40;  // 启动转换
_nop_(); _nop_();   // 等待硬件响应
while (!(ADC_CONTR&0x20));
ADC_CONTR &= ~0x20;  
EA = 1;

res=(ADC_RES << 8) | ADC_RESL;  // 将ADC_    //读取ADC结果


return adcRes(res,voltage);

}
void AdcSetRate(bit t)    //300ksps@24.000MHz
{
 
 
 
  ADCCFG &= ~0x0f;    //SPEED(0)
  ADCCFG |= 0x20;   //RESFMT(1) 结果右对齐
  ADCTIM = 0x38;      //CSSETUP(0), CSHOLD(1), SMPDUTY(24)


 


    if (t==1)
    {
         ADC_CONTR |=0x0E;
    }
    else
    {
      ADC_CONTR |=0x0B;
    }
 
   
}


float adcRes(int num,float voltage )
{
   float res;

  res = voltage * (num / 1024.0f);
   
   ADC_CONTR &= 0X10;


return res;
}

梁工 发表于 2025-7-18 09:45:17

ADC切换通道不要关ADC电源,否则,重开电源必须延时至少1ms(最好10ms以上)才能做ADC(因为模拟电路上电后需要一定时间才能稳定工作)。
切换ADC通道是ADC输入端的模拟开关实现的。

绎妄无绎 发表于 2025-7-25 02:01:53

梁工 发表于 2025-7-18 09:45
ADC切换通道不要关ADC电源,否则,重开电源必须延时至少1ms(最好10ms以上)才能做ADC(因为模拟电路上电后 ...

那不关电源切换的通道产生的异常是什么问题?电源延时有的
{:4_181:}

梁工 发表于 2025-7-25 10:31:19

绎妄无绎 发表于 2025-7-25 02:01
那不关电源切换的通道产生的异常是什么问题?电源延时有的

那跟通道切换无关,检查硬件,使用官方例子测试。

zgrfox110 发表于 2025-7-25 17:32:03

绎妄无绎 发表于 2025-7-25 02:01
那不关电源切换的通道产生的异常是什么问题?电源延时有的

切换通道,转换前四次波动大,第五次开始用数据{:4_168:}

虚无 发表于 2025-8-5 11:06:16

梁工 发表于 2025-7-25 10:31
那跟通道切换无关,检查硬件,使用官方例子测试。

好吧
页: [1]
查看完整版本: ADC 切换通道需要关ADC电源吗