PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Differential ADC Atmega 16 initialisieren ?



Space
13.10.2004, 12:16
Hy,

weiss jemand wie ich mit Bascom die ADC0<->ADC1 Eingänge als differential ADC initialisiert bekomme?
Zusätzlich soll die Verstärkung ( Gain ) von x10 genutzt werden.

Die Hlfe in Bascom zeigt hier keine Möglichkeit auf:

CONFIG ADC = single, PRESCALER = AUTO, REFERENCE = opt :-k

Was mir auch Sorgen macht, der Satz im Datenblatt 8-[ :

"The differential input channels are not testet in PDIP Package. This feature is only garanteed to work for Devices in TQFP and MLF Package."

Hat im PDIP Gehäuse den ADC schon mal als Differential verwendet?

Um sinnvoll löten zu können setze ich natürlich den PDIP ein.

Thomas

13.10.2004, 15:34
Ich beschäftige mich auch z.Z. noch theoretisch mit diesen Thema.
Zur Auswahl mußt du auf das Register ADMUX direkt zugreifen. In BASCOM ist die Möglichkeit der Diff. Eingänge warscheinlich noch nicht enthalten.
ADMUX=&B1110101 'Bits7&6 = 11:Interne 2,56V Ref
'Bit 5 = 1:ADC Left Adjust Result
'Bits 4-0 = 01001: ADC1 pos. , ADC0 neg. , Gain 10x
Die Anmerkung ("The differential) trifft nur bei 200 facher Verstärkung zu.
Das Layout ist anders bei der TQFP and MLF Package. Wahrscheinlich notwendig. Figure 106, Siete 211, Mega16.
MfG Frank

Space
13.10.2004, 22:23
Hy Frank,

danke für die Rasche Antwort; gleich mal probiert \:D/ :


Config Adc = Single , Prescaler = Auto , Reference = Avcc

Admux = &B01110000
'Bits7&6 Ref. =AVCC' 'Bit 5 = 1:ADC Left Adjust Result' 'Bits 4-0 = 10000: ADC1 neg. , ADC0 pos. , Gain 1x'

Start Adc

Label:
Print "ADC0 ";
Tempwort = Getadc(0)
Print Tempwort
Print "ADC1 ";
Tempwort = Getadc(1)
Waitms 500
Print Tempwort

Print " "
Goto Label


Ergebnis:
Beide Werte von ADC0 oder ADC1 verhalten sich wie normale Singel ended ADC`s.
Mir stellt sich im Moment auch die Frage, wie denn der Wert des Diff-ADC abgefragt werden kann.
Ich bin in meinem Versuch davon ausgegangen, das der Wert einer der Beteiligten ADC`s den Diff-Wert enthalten muss.
Auch ist die Zeile "Config ADC ..... Referenz = AVCC " ein Muss, um Werte zu bekommen obwohl Referenz =AVCC ja auch im Register direkt gestezt wird. Das heisst das Setzen des Registers Admux wird ignoriert.

Mache ich etwas falsch, beim setzen des Registers?

Thomas
[/b]

Space
14.10.2004, 18:30
Ich hab die Lösung:

Den Wert mittels "Getadc(x)" abholen verbietet sich bei differential Channels. Der Wert muss direkt aus den beiden Registern Adcl unf Adch abgeholt werden.



Adcsra.adate = 1 'Bit5 = Auto Trigger en
' Adcsra.adif Bit4 Flag für fertige Konversation
' adcsra.adie = 1 ' Aktiviert ADC Interupt I-Bit in SREG muss gesetzt sein
Adcsra.adps2 = 1 ' prescaler 128
Adcsra.adps1 = 1 ' prescaler 128
Adcsra.adps0 = 1 ' prescaler 128
Adcsra.aden = 1 ' Bit7 1= en ADC
Adcsra.adsc = 1 ' |Bit6=1 Start Conversion(Singel o. Free )
Admux = &B01001001
Do
Loop Until Adcsr.adif = 1 ' Warten auf conversation
Adcsr.adif = 1 ' Reset flag
Lowbyte = Adcl ' Lowbyte Register
Highbyte = Adch 'High Byte Register
Print Hex(highbyte) ; Hex(lowbyte) ' Print High und Lowbyte in Hex
Print Highbyte ;
Print " ";
Print Lowbyte
Waitms 900 ' Auge zu langsam

Stop Adc


Verwendbar ist die ganze Sache für mich allerdings nicht. Da auch negative Werte ( nicht bezogen auf Masse, sondern auf die beiden verpolten Eingänge) gemessen werden, geht die Auflösung auf 9 Bit runter. Ausserdem wird +512 bei meinem M16 nie erreicht, max ist hier +488 bei Gain x10 und Uref = Vcc.
Hier scheint die Qualität des internen OpAmps nicht toll zu sein.
Update:Ein Versuch mit Uref=REFint allerdings schon, das die +512 (01FF) erreicht werden.

Thomas

spatz2222
17.01.2005, 18:13
es geht doch z.B. getadc(11) z.B. beim ATtiny26 und 20fachem Gain !!!

siehe Datenblatt

in der neuen Beschreibung von Bascom steht auch da etwas mit Offset etc. !!!

GastGast
17.01.2005, 22:14
Im Datenblatt beachtet ?
Singel Ended Conversion = 10 Bit
Differential Conversion 1x / 10x Gain = 8 Bit
Differential Conversion 200x Gain = 7 Bit

das sollte man bedenken bevor man sich zuviel Hoffnung macht

das zb. getadc(11) geht kann ich auch nur bestätigen (bei mir mega16)