0% found this document useful (0 votes)
80 views2 pages

Init ADC

Este documento define las funciones necesarias para configurar y usar un conversor analógico-digital (ADC) y un temporizador en un microcontrolador AVR para medir y almacenar 6 muestras de tensión de entrada cada segundo. Inicializa el ADC y el temporizador 2, y define interrupciones para capturar los resultados de conversión y reiniciar el proceso de muestreo cada segundo.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
80 views2 pages

Init ADC

Este documento define las funciones necesarias para configurar y usar un conversor analógico-digital (ADC) y un temporizador en un microcontrolador AVR para medir y almacenar 6 muestras de tensión de entrada cada segundo. Inicializa el ADC y el temporizador 2, y define interrupciones para capturar los resultados de conversión y reiniciar el proceso de muestreo cada segundo.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 2

#include <avr/io.

h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define START_CONV (ADCSRA |= (1<<ADSC))
void initADC(); // initializare ADC
void initTimer2(); // initializare timer
void MAIN();
unsigned
unsigned
unsigned
unsigned
unsigned

int
int
int
int
int

resADC[6]; // valori ADC convertite


Vin = 0; // valoarea de la tensiunea de intrare
result = 0; // valoare conversie ADC
counter = 0; // counter pentru a stabili timpul la timer
poz; // index valori convertite ADC

int main() {
MAIN();
return 0;
}
void MAIN() {
sei(); // ISR
DDRA &= 0xC0; // 11000000
DDRD = 0xFF; // 11111111
initADC();
initTimer2();
while(1) {
if(resADC[5] > 2000) {
PORTD |= 255;
} else {
PORTD = 0;
}
}
}
void initADC() {
// setam prescale
ADCSRA |= (1<<ADPS2);
// setam adc enable
ADCSRA |= (1<<ADEN);
// setam intreruperea pe enable
ADCSRA |= (1<<ADIE);
// start conversion
// ADCSRA |= (1<<ADSC);
}
void initTimer2() {
TCNT2 = 5; //counter from 5 to 250
TIMSK2 |= (1<<TOIE2); // Overflow Interrupt Enable
TCCR2B |= (1<<CS20); // no prescaling Fcpu 1Mhz
}

ISR(ADC_vect) {
result = ADCL +( ADCH * 256);
Vin = (unsigned int)((5000.0-0.0) / 1023.0 * (float)(result));
if(poz == 0) { // ADMUX = 0, poz = 0;
resADC[poz] = Vin;
poz++;
ADMUX = 1;
START_CONV;
} else if(poz == 1) { // ADMUX = 1, poz = 1;
resADC[poz] = Vin;
poz++;
ADMUX = 2;
START_CONV;
} else if(poz == 2) { // ADMUX = 2, poz = 2;
resADC[poz] = Vin;
poz++;
ADMUX = 3;
START_CONV;
} else if(poz == 3) { // ADMUX = 3, poz = 3;
resADC[poz] = Vin;
poz++;
ADMUX = 4;
START_CONV;
} else if(poz == 4) { // ADMUX = 4, poz = 4;
resADC[poz] = Vin;
poz++;
ADMUX = 5;
START_CONV;
} else if(poz == 5) { // ADMUX = 5, poz = 5;
resADC[poz] = Vin;
poz++;
ADMUX = 5;
START_CONV;
} else {
ADC = 0;
}
}
ISR(TIMER2_OVF_vect) {
TCNT2 = 5;
counter++;
if(counter == 800) { //1000ms
poz = 0;
ADMUX = 0;
START_CONV;
counter = 0;
}
}

You might also like