ADC

Použití AD převodníku

28. 3. 2013
volatile int adc[8];  // pole pro ukladani vysledku prevodu
volatile int iadc;     // index adc inputu

/*
 *  Inicializace AD prevodniku
 *------------------------------------------------------------------------------*/
void ADC_init(void)
{
    // reference je z pinu Avcc ([REFS1, REFS0] = [0 , 1]), vstup je ADC6 (MUX3 - MUX0 = 0110)
    ADMUX  =  (1<<REFS0) | 6;
    // cislo (0 - 8) odpovida primo cislu vstupu (ad0 - ad8) jelikoz jdou od 0;
    // 6 = 0110; nebo jinak ... | (1<<MUX1) |  (1<<MUX2)

    // zapnuti ADC, a nastveni division factoru na 64
    ADCSRA = (1<<ADEN)  | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    // ADC chce clock frequency mezi mezi 50 - 200 kHz, ja mam krystal 12 MHz
    // … tedy delim 64mi (12Mhz/64 = 187,5 kHz)
}

/*
 *  Spusteni ADC konverze daneho kanalu
 *------------------------------------------------------------------------------*/
void ADC_convert_start(char chan)
{
    ADMUX  &= ~0x07;       // vynuluje posledni 3 bity ADMUX registru (MUX2 - MUX0)
    ADMUX  |= chan;        // nastavi kanal (ADC0 - ADC7)

    /*  Konverze    */
    ADCSRA |= (1<<ADSC);                  // zacatek konverze
}

/*
 *  obsluha preruseni od ADC (vyvolane po skonceni prevodu)
 *------------------------------------------------------------------------------*/
ISR (ADC_vect)                   // obsluha preruseni (dle zadaneho vektoru preruseni - definovano v iomx8.h)
{
  iadc = ADMUX & 0x07;  // zjisti cislo kanalu ktery byl preveden
  adc[iadc] = ADC;             // ulozi vysledek
}