Odkazy:
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
name | REFS1 | REFS0 | ADLAR | MUX4 | MUX3 | MUX2 | MUX1 | MUX0 |
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
name | ADEN | ADSC | ADATE | ADIF | ADIE | ADPS2 | ADPS1 | ADPS0 |
ADEN zapíná a vypíná AD převodník. (1 = zapnuto)
ADSC startuje převod v průběhu převodeu čteme 1. Pokud se bit změní na 0 je převod ukončen.
adc_init: ADMUX = ADCSRA = rts adc_read: admux = kanal adcsra |= 0x40; while ((adcsra & 0x10) == 0); // Wait ADCSRA |= 0x10; // result in ADCW
#include <avr/io.h> #include <inttypes.h> uint16_t readADC(uint8_t channel) { uint8_t i; uint16_t result = 0; // Den ADC aktivieren unr Teilungsfaktor auf 64 stellen ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); // Kanal des Multiplexers waehlen ADMUX = channel; // Interne Referenzspannung verwenden (also 2.56 V) ADMUX |= (1<<REFS1) | (1<<REFS0); // Den ADC initialisieren und einen sog. Dummyreadout machen ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)); for (i=0; i<3; i++) { ADCSRA |= (1<<ADSC); while (ADCSRA & (1<<ADSC)); result += ADCW; } ADCSRA &= ~(1<<ADEN); result /= 3; return result; } int main(void) { uint16_t result = readADC(0) return 0; }
Měření napětí
#include <avr/io.h> #include <inttypes.h> /* * Inicializace ADC převodníku. Tato inicializace je specifická pro * naši aplikaci a způsob použití převodníku. */ void initADC(void) { ADCSR |= (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); /* Prescale = 16 */ ADMUX |= (1<<REFS1) | (1<<REFS0); /* Voltage refference 0b11 = 2.56V */ // ADCSR |= (1<<ADFR); /* Enable free-running mode */ ADMUX = currentChannel; /* Initial channel selection */ // ADCSR |= (1<<ADIE); /* Enable ADC conversion complete interrupt */ // _SEI(); /* Enable global interrupts */ // ADCSR |= (1<<ADSC); /* Start first conversion } /* initADC() */ uint16_t readADC(uint8_t channel) { ADMUX = channel; ADCSRA |= (1<<ADSC); ADCSRA |= (1<<ADEN); /* Start ADC conversion */ while (ADCSRA & (1<<ADSC)); result = ADCW; ADCSRA &= ~(1<<ADEN); /* Stop ADC conversion */ }