Arduino UNO ADC的ADCH在自由运行模式下返回一个常量值

时间:2014-12-13 21:56:56

标签: arduino arduino-uno adc

我已经删除了我确定与下面的代码无关的所有内容。基本上我们通过引脚A0输入信号并通过串行发送采样。这是一个相对简单的项目,但因为我们想要最大化速度,我们试图避免使用analogRead()。然而,我们得到的平坦线不会响应任何输入,只会对预分频器值产生反应,而不是曲线。

我已经验证了所有寄存器更改并且它们都已正确设置。如果我们使用analogRead()代码运行系统,那么它可以工作,所以我知道电路正在工作。我无法找到关于为什么会发生这种情况的明确信息。我已经玩过ADMUX频道选择,看看我是否在错误的频道,但我不是。总的来说,我现在非常困惑!

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// Opens up the serial port with a baud of 115200
  Serial.begin(115200, SERIAL_8E2);
  pinMode(A0, INPUT);
  digitalWrite(A0, HIGH);
  // Enable ADC Completion Interrupt
  sbi(ADCSRA,ADIE) ;
  sei() ;

  // Select the correct pin for the ADC
  cbi(ADMUX,MUX3);
  cbi(ADMUX,MUX2);
  cbi(ADMUX,MUX1);
  cbi(ADMUX,MUX0);

  // Set the ADC to left adjust so that MSB is in low Byte
  sbi(ADMUX,ADLAR) ;

 sbi(ADCSRA,ADEN) ;
 sbi(ADCSRA,ADSC) ;
}

void loop() 
{
}

ISR(ADC_vect)
{
  Serial.write(ADCH);
  cbi(ADCSRA,ADIF);
  sbi(ADCSRA,ADSC);
}

1 个答案:

答案 0 :(得分:1)

很抱歉去挖掘,但我发现了一些可能对其他人有帮助的信息。看起来@UncleO在那里正确。由于您没有设置预分频器ADPS [2:0],因此它们默认为0(分频因子2),这对于ADC来说太快而无法可靠地逼近该值(http://www.gammon.com.au/adc):

  

请注意,数据表(表28-7.ADC特性)提到ADC时钟频率范围为50 kHz至1000 kHz。因此(在此CPU时钟速度为16 MHz时)允许使用的最小预分频器为16,这是通过下面的测试产生的。

Prescaler 2

Analog port = 0, average result = 1023
Analog port = 1, average result = 1023
Analog port = 2, average result = 1023
Analog port = 3, average result = 1022
Time taken = 26220

Prescaler 16

Analog port = 0, average result = 1022
Analog port = 1, average result = 672
Analog port = 2, average result = 509
Analog port = 3, average result = 0
Time taken = 73164

使用analogRead函数时它工作的原因是该库中预分频器设置为128