아래 코드 중 관련없는 항목은 모두 제거했습니다. 기본적으로 핀 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);
}
당신은'ADCL'을 읽을 필요가 없습니다 라이브러리에서 128으로 설정되어 있습니다 사용할 때 일하고 이유 . 또한 자유 실행 모드이므로 매번 전환을 시작할 필요가 없습니다. (이것은 심지어 문제가 될 수 있습니다.) 실제로 당신은 ISR을'Serial.write (ADCH);'로 변경하고 loop()를 비워 둘 수 있습니다. – UncleO
귀하의 제안에 따라 왔지만 문제는 계속됩니다. 자동 트리거 모드를 사용하여 도움이되는지 확인했습니다. – Braains
변경 사항이 불완전합니다. 프리 - 러닝 모드가 디폴트이므로, 이것이 일어나고 있습니다. (ADC0도 기본값이기 때문에 MUX 비트를 지울 필요가 없습니다.) 인터럽트 처리기는 플래그를 자동으로 지우므로 사용자가 할 필요가 없습니다 (플래그가 1이 아닌 0을 쓰면 지워짐). 당신은 여전히 처음으로 새로운 전환을 시작하고 싶지 않습니다. 이제 prescalar를 설정하지 않으므로 작업이 더욱 빨라질 것입니다. 문제는 시리얼이 처리 할 수있는 것보다 더 빠르다는 것일 수 있습니다. – UncleO