El siguiente programa tiene por objetivo mostrar una forma simple del uso del ADC y de las interrupciones en particular la interrupción INT1 la cual ha sido utilizada en este momento para cambiar el modo de respuesta al valor del ADC, para ello se ha configurado para que las salidas muestren el valor de la entrada analógica en forma binaria o mediante la activación de las salidas de forma incremental.
DESCRIPCIÓN
El programa esta compuesto principalmente de tres partes para su funcionamiento, se dividirá la información para que la descripción sea mas legible.
1. ADC
initADC(2,1,5);
El ADC ha sido configurado para funcionar en el modo corrida libre; también utiliza como voltaje de referencia en el pin AVcc conectado a una fuente de voltaje la cual sera considerada el voltaje de referencia superior, el voltaje de referencia menor sera en este caso GND conectando entre tierra y el pin Aref un capacitor, esto es principalmente para disminuir el ruido eléctrico. Para la lectura de los resultados se justificara el valor de la conversión a la izquierda para así solo tomar 8 bits de la conversión, de no desear esto puede cambiar el valor 1 que se ha declarado en la función por un 0. La siguiente parte configura el preescalamiento de reloj del ADC, en este programa sera de 32.
canalADC(1);
Se selecciona el canal deseado para realizar la conversión, en este caso sera el canal 1.
2. INTERRUPCIÓN
cambio();
Se habilita la interrupción externa INT1 configurada para funcionar en modo de flanco de bajada, esto significa que se realizara una interrupción únicamente si en el pin PD3 se ha aplicado un flanco de bajada.
3. CICLO WHILE
var=convADC();
Se realiza la lectura del canal 1 y a continuación dependiendo de el valor de la variable n se mostrara el modo salida binaria o el incremento de las salidas.
Alguna duda o sugerencia pueden ingresarla en los comentarios.
Nota:
El programa completo y la simulación serán puestos al final para ser descargado.
PROGRAMA
/*
* ADC_LEDS.c
*
* Created: 02/02/2014 18:33:01
* Author: TERRAFORMARS
*/
#ifndef F_CPU
#define F_CPU 8000000UL // XTAL de 8 MHz
#endif
#include <avr/io.h>
#include <avr/iom48.h>
//libreria para configurar el ADC
#include "InitADC.h"
//macros para hacer un uso mas legible del control de puertos.
#define setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))
#define clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
#define bittoggle(sfr,bit)(_SFR_BYTE(sfr)^=_BV(bit))
#include <avr/interrupt.h> /* Libreia para el funcionamiento de las interrupciones*/
unsigned char n,var;
ISR(INT1_vect){
if (n==0)
{
n=1;
}
else
{
n=0;
}
}
void cambio(void){
//configuracion para flanco de bajada
setbit(EICRA,ISC11);
clearbit(EICRA,ISC10);
//Enmascaramiento
setbit(EIMSK,INT1);
}
int main(void)
{
//CONFIGURAR ADC
cambio(); //configuración de interrupción
sei(); //habilitación de interrupciones global
initADC(2,1,5);
canalADC(1);
DDRB=0xFF; //salidas de la conversión
while(1)
{
//TODO:: Please write your application code
var=convADC(); //lectura del canal 0
//selección de muestra de datos de las salidas
if (n==0)
{
PORTB=var;
}
else
{
if (var<=4) //este valor fue arbitrario, se puede elegir un 1 o algún otro valor
{
PORTB=0x00;
}
if (var<=31&&var>4)
{
PORTB=0x01;
}else if (var>31&&var<=63)
{
PORTB=0x03;
}
else if (var>63&&var<=95)
{
PORTB=0x07;
}else if (var>95&&var<=127)
{
PORTB=0x0f;
}else if (var>127&&var<=159)
{
PORTB=0x1f;
}else if (var>159&&var<=191)
{
PORTB=0x3f;
}else if (var>191&&var<=223)
{
PORTB=0x7f;
}else if (var>223&&var<=255)
{
PORTB=0xff;
}
}
//termina else
}
}
IMAGENES
SIMULACIÓN EN ATMEL STUDIO 6
PREESCALAMIENTO DEL ADC
SIMULACION EN PROTEUS
LINK
https://mega.co.nz/#!MpFGVaDA!G-oYNk5kol7SdQtdvHWllzN0mckrIth39fTW2Ko1S7Y
IMAGENES
SIMULACIÓN EN ATMEL STUDIO 6
PREESCALAMIENTO DEL ADC
SIMULACION EN PROTEUS
LINK
https://mega.co.nz/#!MpFGVaDA!G-oYNk5kol7SdQtdvHWllzN0mckrIth39fTW2Ko1S7Y
No hay comentarios:
Publicar un comentario