40.7.4. Měření napětí (použití ADC)

Odkazy:

bit76543210
nameREFS1REFS0ADLARMUX4MUX3MUX2MUX1MUX0
bit76543210
nameADENADSCADATEADIFADIEADPS2ADPS1ADPS0

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 */
}

Obrázek 40.23. Oddělení vstupu

  VCC
  ---
   |
   |
   |
   /
   \  10K Ohm          |\
   /                   | \
   \<------------------|+ \
   /                   |   \
   \           LF355   |    +-------+-------> ADC Input
   /                   |   /        |
   |           --------|- /         |
   |           |       | /          |
   |           |       |/           |
  ---          |                    |
  GND          |                    |
               +--------------------+
Licence Creative Commons
Elektronika a počítače, jejímž autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .