Sida 1 av 1

Mäta bandgapsspänning 1.23V med ADC på ATmega128

Postat: 28 december 2007, 14:17:24
av Andax
Jag har ett projekt där jag använder ADC i en ATmega128 för att omvandla en del analoga värden i intervallet 0-5V till digitalt. För att få bästa möjliga noggrannhet tänkte jag eventuellt mäta AVCC som används som analog referens genom att mäta den interna 1.23V bandgap-referensen som finns som valbar ingång till ADC-muxen.

Jag får konstiga resultat. Jag får inte ett digitalt värde kring 1.23/5*1024 = 252 som jag borde få vid 5V matning utan får ett värde kring 903, och värdet ändras knappt när jag ändrar på VCC (som är kopplad till AVCC via en drossel och med avkopplingskodning till jord)

Någon som har erfarenhet eller tips?

Postat: 28 december 2007, 15:23:04
av cykze
Det skulle underlätta om du kunde posta lite kod (så lite som möjligt).

Postat: 28 december 2007, 15:27:52
av blueint
Vad säger multimetern om bandgapet?

Postat: 28 december 2007, 15:59:04
av sodjan
Lite svårt att få in multimetern i AVR'en... :-)

Postat: 29 december 2007, 00:52:02
av Andax
Här kommer lite kod för hur jag gör;
Init_ADC anropas vid initiering av MCU och Read_ADC varje gång jag vill göra en A/D-omvandling. AL innehåller vilken ADC-kanal som ska omvandlas. AL och AH är bara .def av r16 och r17 processor-register.
Jag anropar Read_ADC med AL satt till 0 för ADC0, 1 för ADC1 och 30 för bandgap-referensen. ADC0 och ADC1 verkar ge vettiga värden. (Blueint, där kan jag använda multimetern för att kontrollera! :) )

Kod: Markera allt

Init_ADC:
	; Setup for AVCC as reference
	ldi		AL, (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)
	out		ADMUX, AL
	; Enable ADC and set prescaler to ck/64 => 125 kHz for 8MHz crystal
	ldi		AL, (1<<ADEN)|(0<<ADFR)|(0x03<<ADPS0)
	out		ADCSRA, AL
	ret

Read_ADC:
	andi	AL,0x1f
	in		AH, ADMUX
	andi	AH,0xe0
	or		AH,AL
	out		ADMUX, AH

	sbi		ADCSRA, ADSC

wait_on_adc:
	sbic	ADCSRA, ADSC
	rjmp	wait_on_adc

	in		AL, ADCL
	in		AH, ADCH
	ret

...

	; Read	1.23V Band Gap
	ldi		AL,30
	call	Read_ADC
	push 	AL
	mov		AL,AH
	call	Send_Hex
	pop		AL
	call	Send_Hex

...

Postat: 29 december 2007, 01:19:12
av cykze
Såvitt jag kan se har du en prescaler på 8, inte 64. :?

Postat: 29 december 2007, 01:43:55
av Andax
Ja det har du rätt i. En miss helt klart. Får testa i morgon om det löser problemet. Tackar!

Lite konstigt är det att ADC0 och ADC1 ger bra värden...

Postat: 2 januari 2008, 08:46:25
av Andax
Cykze, det verkar varit prescalerbuggen som spökade. Nu funkar det! Tackar...