- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: Differential ADC Atmega 16 initialisieren ?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2004
    Beiträge
    14

    Differential ADC Atmega 16 initialisieren ?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

    Was mir auch Sorgen macht, der Satz im Datenblatt :

    "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

  2. #2
    Gast
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2004
    Beiträge
    14
    Hy Frank,

    danke für die Rasche Antwort; gleich mal probiert \/ :
    Code:
    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]

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2004
    Beiträge
    14
    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.

    Code:
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    14.09.2004
    Beiträge
    38
    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. !!!

  6. #6
    GastGast
    Gast
    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)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress