2014-12-13 4 views
0

아래 코드 중 관련없는 항목은 모두 제거했습니다. 기본적으로 핀 A0을 통해 신호를 입력하고 직렬로 샘플을 전송합니다. 상대적으로 간단한 프로젝트이지만 속도를 최대화하기 위해 analogRead() 사용을 피하려고합니다. 그러나 커브를 되 찾는 대신 입력 값에 응답하지 않는 플랫 라인을 얻을 수 있으며 프리스케일러 값만 사용할 수 있습니다.Arduino UNO ADC의 ADCH는 자유 실행 모드에서 상수 값을 반환합니다.

모든 등록 변경 사항을 확인했으며 모두 올바르게 설정되었습니다. 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

당신은'ADCL'을 읽을 필요가 없습니다 라이브러리에서 128으로 설정되어 있습니다 사용할 때 일하고 이유 . 또한 자유 실행 모드이므로 매번 전환을 시작할 필요가 없습니다. (이것은 심지어 문제가 될 수 있습니다.) 실제로 당신은 ISR을'Serial.write (ADCH);'로 변경하고 loop()를 비워 둘 수 있습니다. – UncleO

+0

귀하의 제안에 따라 왔지만 문제는 계속됩니다. 자동 트리거 모드를 사용하여 도움이되는지 확인했습니다. – Braains

+0

변경 사항이 불완전합니다. 프리 - 러닝 모드가 디폴트이므로, 이것이 일어나고 있습니다. (ADC0도 기본값이기 때문에 MUX 비트를 지울 필요가 없습니다.) 인터럽트 처리기는 플래그를 자동으로 지우므로 사용자가 할 필요가 없습니다 (플래그가 1이 아닌 0을 쓰면 지워짐). 당신은 여전히 ​​처음으로 새로운 전환을 시작하고 싶지 않습니다. 이제 prescalar를 설정하지 않으므로 작업이 더욱 빨라질 것입니다. 문제는 시리얼이 처리 할 수있는 것보다 더 빠르다는 것일 수 있습니다. – UncleO

답변

1

미안하지만 dig digging하지만 다른 사람들을 도울 수있는 정보를 발견했습니다. @UncleO가 올바른 위치에있는 것 같습니다. 당신은 프리스케일러 ADPS 설정되지 않기 때문에 [2 : 0] 내가 너무 빨리 ADC 안정적 값에 근접하기 위해, 그들은 디폴트로 0 (분배 인자 2), (http://www.gammon.com.au/adc) :

참고 그 데이터 시트 (표 28-7 ADC 특성)는 ADC 클록 주파수 범위가 50kHz ~ 1000kHz임을 언급합니다. 따라서 (16MHz의 CPU 클럭 속도에서) 사용할 수있는 가장 작은 프리스케일러는 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 기능은 프리 스칼라 당신이 그것을 사용하지 않기 때문에

+0

내가 이것을 조사 할 때 이것은 대단히 도움이되었을 것입니다! 나는 그것이 다음 사람을 돕기를 바랍니다. – Braains