找回密码
 立即注册
查看: 120|回复: 19

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-26 17:44:19
已绑定手机

5

主题

13

回帖

83

积分

注册会员

积分
83
发表于 2025-8-25 13:49:49 | 显示全部楼层 |阅读模式

#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;
}


这是定时执行

这是定时执行

然后测量切换通道

然后测量切换通道

先测l_temp 出现这种情况

先测l_temp 出现这种情况

先测r_temp 显示结果就是正常的

先测r_temp 显示结果就是正常的
回复

使用道具 举报 送花

3

主题

2001

回帖

850

积分

等待验证会员

积分
850
发表于 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在切换通道后的稳定运行。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-09-03 09:00:23
已绑定手机

85

主题

6045

回帖

1万

积分

超级版主

积分
11110
发表于 2025-8-25 14:05:20 | 显示全部楼层
问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换
ADC_CONTR不能连续赋值两次并且前一次存在启动转换的操作,否则后面的赋值操作处于转换未完成阶段,无效

截图202508251401063964.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-26 17:44:19
已绑定手机

5

主题

13

回帖

83

积分

注册会员

积分
83
发表于 2025-8-25 14:16:30 | 显示全部楼层
Debu*** 发表于 2025-8-25 14:05
问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换

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

点评

关键是清除的时候不要给ADC_CONTR寄存器赋值,就算赋值也不能启动转换 可以声明一个临时变量,ADC_CONTR读出来到该变量,在该变量内操作 也可以清除的时候一并清除ADC_START,不让ADC立即启动转换,注意不能清除ADC_  详情 回复 发表于 2025-8-25 14:59
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:506
  • 最近打卡:2025-09-03 10:26:55
已绑定手机

45

主题

2195

回帖

7668

积分

论坛元老

积分
7668
发表于 2025-8-25 14:17:44 | 显示全部楼层
没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-26 17:44:19
已绑定手机

5

主题

13

回帖

83

积分

注册会员

积分
83
发表于 2025-8-25 14:41:34 | 显示全部楼层
乘风*** 发表于 2025-8-25 14:17
没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。 ...

好的谢谢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:506
  • 最近打卡:2025-09-03 10:26:55
已绑定手机

45

主题

2195

回帖

7668

积分

论坛元老

积分
7668
发表于 2025-8-25 14:51:11 | 显示全部楼层

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-26 17:44:19
已绑定手机

5

主题

13

回帖

83

积分

注册会员

积分
83
发表于 2025-8-25 14:52:29 | 显示全部楼层
乘风*** 发表于 2025-8-25 14:51
要当前通道采集完成后才能切换另外一个通道进行采集

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-09-03 09:00:23
已绑定手机

85

主题

6045

回帖

1万

积分

超级版主

积分
11110
发表于 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电源稳定
截图202508251459321248.jpg

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:474
  • 最近打卡:2025-09-03 00:03:38
已绑定手机

153

主题

1858

回帖

2246

积分

金牌会员

积分
2246
发表于 2025-8-25 15:49:15 来自手机 | 显示全部楼层
还真的没碰到这样问题,一般都是一下采集完
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-3 10:52 , Processed in 0.145035 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表