Zápisník experimentátora
Hierarchy: A/D prevodník
A/D prevodník v Arduino Uno má rozlíšenie 10 bitov. Ak nepotrebujeme také veľké rozlíšenie, môžeme použiť aj rozlíšenie 8 bitov. Získame tak prevod analógovej hodnoty na digitálnu hodnotu, ktorá má presne 8 bitov. Dosiahneme to tak, že si upravíme zarovnanie bitov vo výslednom 16 bitovom registri. Používanie 8 bitového A/D prevodu má výhodu v tom, že nemusíme dodržiavať doporučenú frekvenciu prevodu 50 kHz - 200 kHz a môžeme používať aj vyššie frekvencie.
Nastavenie bitu ADLAR upravuje spôsob zarovnania výsledkov.
bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
ADCH | - | - | - | - | - | - | ADC9 | ADC8 |
ADCL | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 | ADC1 | ADC0 |
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
ADCH | ADC9 | ADC8 | ADC7 | ADC6 | ADC5 | ADC4 | ADC3 | ADC2 |
ADCL | ADC1 | ADC0 | - | - | - | - | - | - |
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Príklad je skoro rovnaký ako predchádzajúce príklady (A/D prevodník bez blokovania). Líši sa len v nastavení bitu ADMUX.ADLAR
, ktoré upravuje zarovnanie výsledku. Pri tomto nastavení stačí prečítať obsah registra ADCH
, aby sme získali výsledný 8 bitový výsledok.
const byte adcPin = A0; // = 14 (pins_arduino.h)
bool adc_conversion_working = false;
void setup() {
Serial.begin(115200);
Serial.println("ADC without blocking 8bit");
ADCSRA = bit(ADEN) // Turn ADC on
| bit(ADPS0) | bit(ADPS1) | bit(ADPS2); // Prescaler of 128
ADMUX = bit(REFS0) // AVCC
| bit(ADLAR) // ADC Left Adjust Result
| ((adcPin - 14) & 0x07); // Arduino Uno to ADC pin
}
void loop() {
if (!adc_conversion_working) {
bitSet(ADCSRA, ADSC); // Start a conversion
adc_conversion_working = true;
}
// The ADC clears the bit when done
if (bit_is_clear(ADCSRA, ADSC)) {
int value = ADCH; // Read result
adc_conversion_working = false;
Serial.println(value);
delay(500);
}
}
Zdrojový kód sa nachádza na serveri GitHub.
03.11.2018