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;
}
ADC切换通道是否具有顺序要求,取决于具体的ADC硬件设计及配置方式。在大多数情况下,ADC通道的切换并无严格的顺序限制,但为了确保采样精度与系统稳定性,仍需遵循一定的操作规范。
首先,从硬件角度来看,ADC通常具备多个输入通道(如CH0、CH1、CH2等),每个通道对应不同的模拟输入信号。在进行通道切换时,ADC控制器会根据当前配置选择对应的通道进行采样。如果通道切换频繁或未正确配置,可能导致采样误差或数据不稳定。
其次,在软件层面,ADC的通道切换通常通过设置寄存器中的通道选择位(如ADCH)来实现。例如,在一些单片机中,ADCCONTR寄存器中的ADCH位用于选择当前转换的通道。此时,只要正确设置该寄存器,即可完成通道切换,无需特定顺序。
然而,在实际应用中,仍需注意以下几点:
1. 通道切换前应确保ADC处于空闲状态:在切换通道之前,建议等待当前转换完成,避免因通道切换导致采样中断或数据错误。
2. 通道切换后应重新启动ADC转换:某些ADC架构在通道切换后需要重新触发一次转换,以确保新通道的数据采集正常进行。
3. 避免连续快速切换通道:如果在短时间内频繁切换通道,可能会导致ADC无法及时响应,影响采样精度。
4. 参考电压稳定性:ADC的转换结果依赖于参考电压的稳定性,因此在切换通道时,应确保参考电压稳定,避免因电压波动引起误差。
综上所述,ADC通道切换通常没有严格的顺序要求,但在实际应用中,合理的操作流程和配置是保证ADC正常工作的关键。建议在代码中加入适当的延时或状态检测机制,以确保ADC在切换通道后的稳定运行。
[本文内容由国芯人工智能辅助生成,仅供参考] 问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换
ADC_CONTR不能连续赋值两次并且前一次存在启动转换的操作,否则后面的赋值操作处于转换未完成阶段,无效
DebugLab 发表于 2025-8-25 14:05
问题代码:
ADC_CONTR &=0XF0;
该操作会直接启动通道0的转换
开头通道选择没有问题 后面的那两个操作 我合并成一个ADC_CONTR= (ADC_CONTR & 0xF0) | 0x0E;但是结果还是一样
没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。 乘风飞扬 发表于 2025-8-25 14:17
没有顺序要求,采集完一个通道后,就可以切换到其他任意一个通道进行下一次采集。 ...
好的谢谢
虚无 发表于 2025-8-25 14:41
好的谢谢
要当前通道采集完成后才能切换另外一个通道进行采集 乘风飞扬 发表于 2025-8-25 14:51
要当前通道采集完成后才能切换另外一个通道进行采集
代码中的确是采集完成才能退出是顺序的执行
虚无 发表于 2025-8-25 14:16
好的谢谢 第一个的确是通道0 那里接了探头的后面的通道我操作的思路是 先清除低4位 再写入低4位 ...
关键是清除的时候不要给ADC_CONTR寄存器赋值,就算赋值也不能启动转换
可以声明一个临时变量,ADC_CONTR读出来到该变量,在该变量内操作
也可以清除的时候一并清除ADC_START,不让ADC立即启动转换,注意不能清除ADC_POWER,否则需要延时1ms等待内部ADC电源稳定
还真的没碰到这样问题,一般都是一下采集完
页:
[1]
2