Zápisník experimentátora
Hierarchy: A/D prevodník
A/D převodník v Arduino Uno má rozlišení 10 bitů. Pokud nepotřebujeme takové velké rozlišení, můžeme použít i rozlišení 8 bitů. Získáme tak převod analogové hodnoty na digitální hodnotu, která má přesně 8 bitů. Dosáhneme to tak, že si upravíme zarovnání bitů ve výsledném 16 bitovém registru. Používání 8 bitového A / D převodu má výhodu v tom, že nemusíme dodržovat doporučenou frekvenci převodu 50 kHz - 200 kHz a můžeme používat i vyšší frekvence.
Nastavení bitu ADLAR upravuje způsob zarovnání výsledků.
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 |
Příklad je skoro stejný jako předchozí příklady (A/D převodník bez blokování). Liší se pouze v nastavení bitu ADMUX.ADLAR
, které upravuje zarovnání výsledku. Při tomto nastavení stačí přečíst obsah registru ADCH
, abychom získali výsledný 8 bitový výsledek.
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 se nachází na serveru GitHub.
03.11.2018