虚无 发表于 2025-8-25 13:49:49

adc切换通道有顺序要求吗?


#include <STC8H.h>
#include "adc.h"
#include <intrins.h>
#include "delay.h"
#define start ADC_CONTR |= 0x40;// 启动转换
#define conversionFlag ADC_CONTR&0x20//转换完成标志
#define cleanConversionFlag   ADC_CONTR &= ~0x20;//ADC完成标志位清零      


float adc(char ch, float voltage)
{
    int res;
switch (ch)
{
    //p10
case 'r':
   ADC_CONTR &=0xF0;
    break;
   //p36
case 'l':
    ADC_CONTR &=0xF0;
   ADC_CONTR |=0x0E;
   

    break;
//   //p33
// case 'v':
//    ADC_CONTR |=0x0B;
//    ADC_CONTR &=0xFB;//第三位清零
//P11
case 'v':
    ADC_CONTR &=0XF0;
      ADC_CONTR |=0X01;
   
    break;
}
EA = 0;            
start
_nop_(); _nop_();   // 等待硬件响应
while (!(conversionFlag));
cleanConversionFlag
EA = 1;
res=(ADC_RES << 8) | ADC_RESL;// 将ADC_    //读取ADC结果
return adcRes(res,voltage);
}
void adc_init()//300KSPS@30.000MHz
{
ADC_CONTR |= 0x80;// 开启ADC电源
Delay1ms(10);         // 延时
ADCCFG &= ~0x0f;    //SPEED(0)
ADCCFG |= 0x20;   //RESFMT(1) 结果右对齐
ADCTIM = 0xff;      //
ADCEXCFG = 0x04;         
}
float adcRes(int num,float voltage )
{
   float res;

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


return res;
}


国芯人工智能 发表于 2025-8-25 13:53:00

ADC切换通道是否具有顺序要求,取决于具体的ADC硬件设计及配置方式。在大多数情况下,ADC通道的切换并无严格的顺序限制,但为了确保采样精度与系统稳定性,仍需遵循一定的操作规范。

首先,从硬件角度来看,ADC通常具备多个输入通道(如CH0、CH1、CH2等),每个通道对应不同的模拟输入信号。在进行通道切换时,ADC控制器会根据当前配置选择对应的通道进行采样。如果通道切换频繁或未正确配置,可能导致采样误差或数据不稳定。

其次,在软件层面,ADC的通道切换通常通过设置寄存器中的通道选择位(如ADCH)来实现。例如,在一些单片机中,ADCCONTR寄存器中的ADCH位用于选择当前转换的通道。此时,只要正确设置该寄存器,即可完成通道切换,无需特定顺序。

然而,在实际应用中,仍需注意以下几点:

1. 通道切换前应确保ADC处于空闲状态:在切换通道之前,建议等待当前转换完成,避免因通道切换导致采样中断或数据错误。

2. 通道切换后应重新启动ADC转换:某些ADC架构在通道切换后需要重新触发一次转换,以确保新通道的数据采集正常进行。

3. 避免连续快速切换通道:如果在短时间内频繁切换通道,可能会导致ADC无法及时响应,影响采样精度。

4. 参考电压稳定性:ADC的转换结果依赖于参考电压的稳定性,因此在切换通道时,应确保参考电压稳定,避免因电压波动引起误差。

综上所述,ADC通道切换通常没有严格的顺序要求,但在实际应用中,合理的操作流程和配置是保证ADC正常工作的关键。建议在代码中加入适当的延时或状态检测机制,以确保ADC在切换通道后的稳定运行。

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

DebugLab 发表于 2025-8-25 14:05:20

问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换
ADC_CONTR不能连续赋值两次并且前一次存在启动转换的操作,否则后面的赋值操作处于转换未完成阶段,无效

虚无 发表于 2025-8-25 14:16:30

DebugLab 发表于 2025-8-25 14:05
问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换

开头通道选择没有问题   后面的那两个操作 我合并成一个ADC_CONTR= (ADC_CONTR & 0xF0) | 0x0E;但是结果还是一样

乘风飞扬 发表于 2025-8-25 14:17:44

没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。

虚无 发表于 2025-8-25 14:41:34

乘风飞扬 发表于 2025-8-25 14:17
没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。 ...
好的谢谢

乘风飞扬 发表于 2025-8-25 14:51:11

虚无 发表于 2025-8-25 14:41
好的谢谢

要当前通道采集完成后才能切换另外一个通道进行采集

虚无 发表于 2025-8-25 14:52:29

乘风飞扬 发表于 2025-8-25 14:51
要当前通道采集完成后才能切换另外一个通道进行采集

代码中的确是采集完成才能退出是顺序的执行

DebugLab 发表于 2025-8-25 14:59:26

虚无 发表于 2025-8-25 14:16
好的谢谢   第一个的确是通道0 那里接了探头的后面的通道我操作的思路是 先清除低4位 再写入低4位    ...
关键是清除的时候不要给ADC_CONTR寄存器赋值,就算赋值也不能启动转换
可以声明一个临时变量,ADC_CONTR读出来到该变量,在该变量内操作
也可以清除的时候一并清除ADC_START,不让ADC立即启动转换,注意不能清除ADC_POWER,否则需要延时1ms等待内部ADC电源稳定


vb2002 发表于 2025-8-25 15:49:15

还真的没碰到这样问题,一般都是一下采集完
页: [1] 2
查看完整版本: adc切换通道有顺序要求吗?