ADC i ATMEGA48

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sigma84
Inlägg: 54
Blev medlem: 13 maj 2005, 15:26:32

ADC i ATMEGA48

Inlägg av sigma84 »

Tja jag håller på med ett projekt där jag ska läsa av ett värde på ADC:n. Jag har en analog insignal på pinne 26 (ADC kanal 3). Men det funkar inte.
ADC:n ger bara ut en massa 1 or både på höga och låga byten.

Kod: Markera allt

#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#include <lcd.h>
#include <stdlib.h>
#include <stdio.h>

#define BIT_TEST(x,b) ((x)&(1<<(b)))

void vanta(int);
void hamta_ohm_varde(void);
int main(void);
void bin2bcd(unsigned int);
void initiera_adc(void);

int main(void)
{

	asm volatile ("nop");
	asm volatile ("nop");
	DDRB=0xFF; //PORTB= utgång
	PORTB ^= 0xFF; //Växla värde på portb
	LCD_init();
	initiera_adc();

	while(1==1) 
	{
	LCD_command(0x01); //rensa displayen
	hamta_ohm_varde();
	PORTB ^= 0xFF; //Växla värde på portb
	vanta(500);
	}
	
	return 1;
}
void initiera_adc(void)
{
	PRR &= ~(1<<PRADC); //aktivera adomvandlaren ; NOLLA TILL PRADC
	_SFR_BYTE(ADCSRB) = 0x00;
	_SFR_BYTE(ADMUX)  = 0x00;
	_SFR_BYTE(DIDR0)  = 0x00;
	DIDR0 |= (1<<ADC3D);
	ADCSRA |= (1<<ADEN);
}
void hamta_ohm_varde(void)
{
	unsigned int varde;
	
	_SFR_BYTE(ADMUX)  = 0x00;
	ADMUX |= (1<<REFS0) | (1<<REFS1) | (1<<MUX1)| (1<<MUX0);           //ADC3 är ingång
	asm volatile ("nop");
	ADCSRA |= (1<<ADSC);
	loop_until_bit_is_set(ADCSRA,ADIF);
	asm volatile ("nop");
	//Nu finns ett vardet i ADC
	LCD_write("0:");
	bin2bcd(ADCH);
	LCD_write(",");
	bin2bcd(ADCL);
	
	varde=ADCH;//dummy kommando för att ADC ska gå att uppdatera
}

void bin2bcd( unsigned int val )//Funkar
{
	char digit[4];
	itoa(val,digit,16); 
	LCD_write(digit);//skriv ut på lcd
} 

void vanta(int val)
{	
	uint16_t i;
	for (i=0;i<val;i++)
      {
         _delay_loop_2(500); 
      }
	
}
Mistänker att det är nåt jag missat när jag initierar ADC:n.
Jag har inte anslutit kondingar på matningen till ADC:N och inte heller vid analoga ingången men det ska ju bara vara för att reducera brus som jag förstått det.
Hjälp mig har tillbringat för många timmar med att felsöka koden. :-x
Kan tillägas att jag har en lysdiod på portb
mullemeck
Inlägg: 1306
Blev medlem: 27 maj 2003, 23:52:06
Ort: Lund
Kontakt:

Inlägg av mullemeck »

Enligt vad jag läst ut från databladet lite snabbt nu så hittar jag inga uppenbara fel.

Men du kan ju testa ändra spänningsreferensen till nått annat och se om det hjälper, alternativt koppla in en kondensator till AREF pinnen som det står i databladet om du inte redan gjort det.

Sen kan du ju testa ändra prescalern till lite högre, ur din kod tolkar jag det som att den står på 2 nu.
Enligt databladet ska den ha en klocka mellan 50-200kHz, kör du din avr på 10Mhz så tycker jag man behöver en prescaler på 64 för att komma ner i det intervallet.

Reserverar mig för möjliga fel som trötthet kan frambringa.
frejo
Inlägg: 496
Blev medlem: 21 april 2004, 21:43:01
Ort: Linköping

Inlägg av frejo »

I avrlib finns det färdig exempelkod för AD-omvandlaren.
Det du kan göra är att kompilera den och om den fungerar kan du se vad som skiljer den mot din kod.

http://hubbard.engr.scu.edu/embedded/avr/avrlib/
sigma84
Inlägg: 54
Blev medlem: 13 maj 2005, 15:26:32

Inlägg av sigma84 »

Nu har jag löst det.
Jag hade anslutit Vref till jord, ville ha spänningen relaterad till jord va min tanke. Jag satt och simulera med Wmlab (för övrigt en jättebra utveklingsmiljö när man väl får det att funka) där prova jag att ansluta Vref till + 5V och det funka. Sen hitta jag i manualen att ADC=(Vin*1024)/Vref.

:evil: :evil: :evil:
Skriv svar