我已经删除了我确定与下面的代码无关的所有内容。基本上我们通过引脚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);
}
答案 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