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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

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

Inlägg 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?
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Det skulle underlätta om du kunde posta lite kod (så lite som möjligt).
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Inlägg av blueint »

Vad säger multimetern om bandgapet?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Lite svårt att få in multimetern i AVR'en... :-)
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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

...
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Såvitt jag kan se har du en prescaler på 8, inte 64. :?
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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...
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Cykze, det verkar varit prescalerbuggen som spökade. Nu funkar det! Tackar...
Skriv svar