Forum: Mikrocontroller und Digitale Elektronik AVR AD-Wandler Differenzmessung


von Fritz S. (alterbastler)


Lesenswert?

Hallo AVR-Meister

Habe einen ATmega16 in einem Pollin-Board
Entwicklungs SW ist AStudio 4.18
Programmiert in Assembler
Problem ist AD-Wandlung
Beschaltung:
PA0 (ADC0) Pin 40 an Anode einer Diode0
PA1 (ADC1) Pin 39 an Anode einer Diode1
beide Kathoden an GND
Dass etwas Strom fliesst, wird der interne
Pullup-Widerstand eingeschaltet
(sbi PortA,PA0  ,,PA1)
Strom gegen Gnd ca 140 mikroA,beide gleich viel
Referenz ist die interne 2,56V
also REFS1,REFS0 ==1
nun messe ich die interne Bandgap (1,22 V)
in ADMUX ist MUX4..0 also 1110
(Tab.84 im Atmel  doc2446.pdf)
Ergenis: 0x1eb
das kommt rechnerisch etwa hin
Dann wird die erste Diode  an Pin 40 gemessen
Ergebnis: 0x0d3
mit Voltmeter gemessene Spannung 0,47V
also auch in Ordnung, dann die zweite Diode an Pin 39
Ergebnis: 0x0e7
diese mit Voltmeter gemessene Spannung 0,52V
also auch in Ordnung, dann wollte ich die Differenz messen
dazu ADMUX MUX4..0 =1000  das wäre ADC0 gegen ADC1 gain=1
Ergebnis: 0x3ff und ab und an auch mal 0x3fe
dann Versuch mit gain=10
dazu ADMUX MUX4..0 =01001  das wäre ADC0 gegen ADC1 gain=10
Ergebnis: wieder 0x3ff und ab und an auch mal 0x3fe
ich kann mit den Eingängen machen was ich will,das
Ergebnis der Differenzmessung bleibt 0x3ff
zu bemerken ist noch,dass ich am Pin32== AREF keine Spannung messe

Habe ich was übersehen ??
Weiss jemand darüber Bescheid

von spess53 (Gast)


Lesenswert?

Hi

>dazu ADMUX MUX4..0 =1000  das wäre ADC0 gegen ADC1 gain=1

Nein ADC0 gegen ADC0 mit Gain=10

>Habe ich was übersehen ??

Zeig mal deine ADC-Initialisierung.

MfG Spess

von Fritz S. (alterbastler)


Lesenswert?

Hallo Spess53
Danke für die schnelle Reaktion

laut Datenblatt von Atmel
wo der ATMega16 beschrieben ist
doc2446.pdf Tab 84 Seite 218
und das Buch von G.Schmitt
Mikrokontroller der AVR Risk Familie
auf Seite 414 sagt dasselbe
MUX4..0  pos.Eing neg.Eing. Gain
10000     ADC0     ADC1      1x
------ Programmausschnitt
;;;;;;;;;;;;;;;;;;AD wandler dioden an adc 0,1
;ref ist intern 2,56 Volt lsb 7...0 , msb 9..8 >> ADLAR = 0
;;.pdf  Table 84. Input Channel and Gain Selections
 ;;   ADMUX -- REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
 ;;11110 1.22V (VBG)
ldi tmp,(1<< REFS1|1<< REFS0 | 1<<  MUX4 |1<< MUX3  |1<<MUX2 |1<< MUX1 
)
out ADMUX,tmp
-------------------
;        Table 86. ADC Auto Trigger Source Selections
;SFIOR  =      ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10
;        ADTS2 ADTS1 ADTS0 Trigger Source
;    =    0 0 0 Free Running mod ,also wie bei Reset
-------------
;   ADPS2 ADPS1 ADPS0 Division Factor 000==2...111=256
;      ADCSRA --  ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
;  ADEN ein Wandler-Start
ldi tmp,(1<< ADEN|1<<  ADSC  |1<<  ADPS2  | 1<< ADPS1  |1<<  ADPS0)
out ADCSRA,tmp

;ad wandler startet mit BandGap 1,2 V

------------Unterprogramme für abholen des AD-wertes
getadc:        ;ist (schon) gestartet,jetzt warten bis fertig und in 
bb,akku bringen
nop
;Wenn das Ergebnis in ADC rechts-ausgerichtet ist, MUSS ADCL vor ADCH 
ausgelesen werden,
;da erst ein neuer Wert in ADC geschrieben werden kann, wenn ADCH 
ausgelesen wurde.
nop
sbic ADCSRA,ADSC    ;lesen bis adsc==0
rjmp getadc  ;adsc ist noch high
in akku,adcl  ;7...0
in bb,adch    ;xxxxxx98
ret
---------neuer Kanal stellen
stadc39s:  ;adc1, pin 39, PA1 ,single
nop
cbi ddra,pa1  ;eingang
sbi porta,pa1  ;pullup ein
in tmp,admux
;;ADMUX    =  REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0
andi tmp,0b1110_0000
ori tmp,0b000_0001  ; ADC1 Pin39
out admux,tmp
sbi ADCSRA,ADSC    ; start mit 1 einschreiben ADCSRA,ADSC
ret
----------
in der "Mainloop" werden die einzelnen
Kanäle angewählt, ausgelesen in hexstring umgesetzt und auf die
 serielle Schnittstelle ausgegeben. so etwa
 loop:
rcall adc_bandgap  ; 11110 1.22V (VBG)
rcall zeigadc  ;,mit getadc
rcall stadc40s  ;adc0, pin 40, PA0 ,single
rcall zeigadc  ;,mit getadc
rcall stadc39s  ;adc1, pin 39, PA1 ,single
rcall zeigadc  ;,mit getadc
rcall stadc3940d  ;adc1, pin 39+40, PA0+11 ,differenz gain 1
rjmp loop
---------------------------ergebnis auf dem HTerm herauskopiert
1eb  0d4  0e7  3f8
|     |    |     |--> sollte Differenz sein
|     |    |  --> PA1 (ADC1)  ca 0,53 V
|     | -->> PA0 (ADC0)  ca. 0,47 V
|-->> interne Bandgap
-------------------------------------
hoffe, dass es ausreichend verständlich dargestellt ist.
Berichtigung: am Pin32 (Aref) messe ich doch wie erwartet 2,6 V
(sorry  habe mich in der Zählrichtung vertan)
-------------
externer Hinweis, leider von 2004
http://www.uni-koblenz.de/~physik/informatik/MCU/Analog.pdf
auf Seite 14 soll man bei Differenzmessung den Wandler aus und wieder 
einschalten
-->>> habe ich gemacht: gleiches Ergebnis

------------
MfG
Fritz Seiffert

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.