Mäta bandgapsspänning 1.23V med ADC på ATmega128
Mäta bandgapsspänning 1.23V med ADC på ATmega128
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?
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?
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!
)
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
...