Tengo un problema con el ADC, estoy usando un AVR ATmega48p
Tengo un programa que me muestra el valor del ADC, de 0000 hasta 1024 ya que mi ADC tiene una resolucion de 10 bits. Mi voltaje de referencia es de 5 V. Y se puede mostrar en una LCD de 2x16.
Por lo que he leido hasta ahorita, debo multiplicar el valor del ADC con la resolucion, paara mostrar el voltaje, esto es Vres=5/1024=4.88mV, y eso por el valor ADC.
El problemas que que quiero mostrar este dato en el LCD y debido a que la respuesta tiene decimales, no se como hacer la conversión para mostrarlo.
que se muestre de la siguiente manera V= x.xx V
es por que la variable es "int"? por lo que entiendo solo acepta numeros enteros.
inicio en esto de la programacion avr gcc
Anexo mi programa
Tengo un programa que me muestra el valor del ADC, de 0000 hasta 1024 ya que mi ADC tiene una resolucion de 10 bits. Mi voltaje de referencia es de 5 V. Y se puede mostrar en una LCD de 2x16.
Por lo que he leido hasta ahorita, debo multiplicar el valor del ADC con la resolucion, paara mostrar el voltaje, esto es Vres=5/1024=4.88mV, y eso por el valor ADC.
El problemas que que quiero mostrar este dato en el LCD y debido a que la respuesta tiene decimales, no se como hacer la conversión para mostrarlo.
que se muestre de la siguiente manera V= x.xx V
es por que la variable es "int"? por lo que entiendo solo acepta numeros enteros.
inicio en esto de la programacion avr gcc
Anexo mi programa
Código:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.h"
int adc_value;
uint16_t readADC(uint8_t channel);
void init_adc(void)
{
DDRC &= ~(1 << 4);
ADMUX=0b00100100;
ADCSRA=_BV(ADEN)|_BV(ADEN)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADSC);
sei();
}
void to_ascii(void)
{
uint16_t resultado;
resultado=readADC(4);
LCDWriteIntXY(10,0,resultado,4);
_delay_loop_2(0);
}
int main(void)
{
InitLCD(LS_BLINK|LS_ULINE);
init_adc();
LCDWriteString("Dato:");
while (1)
{
to_ascii();
}
}
uint16_t readADC(uint8_t channel)
{
uint16_t result;
uint8_t i;
ADCSRA = (1 << ADEN) | (1 << ADPS2); //ADC aktiv, Prescaler 16
ADMUX = channel; //ADC0 kein mutiplexing
ADMUX |= (1 << REFS0); // AVcc als Versorgungspannung
ADCSRA |= (1 << ADSC); //ADC starten mit Dummyreadout
while(ADCSRA & (1 << ADSC));
result = 0;
for(i = 0; i < 5; i++)
{
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
result += ADCW / 5;
_delay_us(1);
}
ADCSRA &= ~(1 << ADEN) ;//ADC aus
return result;
}
Adjuntos
Última edición por un moderador: