AD-Wanlder über Atemga168?

Gast #792313
Lesenswert?

Hallo erstmal,
ich fange ambesten zuerst mit den Daten an.

MCU: atmega 168 + STK500 mit 16MHZ Crystal (habe den Teiler 8 für die 
Frequenz ausgeschaltet)

Ziel:
Ich möcht den AD-Wandler benutzen mit externer Rerferenzspannung von 
10V.

das habe ich schon geschaft:
Wandlungen über den interen Spannung (Vcc) mit dem Eingang VBG=1.1 hat 
schon geklappt.

Problem:
1) ich habe eine Spannung von 23V, die habe ich mit einem 
Spannungsteiler (R1= 1,3K OHM und R2= 1K Ohm) auf ca. 10 V gebracht 
sobalt ich es den Pin "REF" (STK500) anlege sinkt die Spannung am R2, 
warscheinlich weil            der Widerstand vom Pin viel kleiner ist 
als R2= 1K Ohm (parallel Schaltung). Zurstabilität habe ich einen 
Kondensator mit 10nF angelegt(hatte keinen Anderen da).
Frage:
Kann ich dies mit einem Op-Verstärker (positive Verstärkung) 
realisieren, ohne das die Spannung einbricht? -> (OP-Verstärker kleiner 
Ausgangswiderstand)Oder liegt es doch an etwas Anderm?

2) ich habe es geschaft an Pin "Ref" 7V anzulegen und habe die 
Referenzspannung vo STK500 auf 0 gestzt und die Aref brücke geschlossen, 
aber alle Messungen waren Falsch. Als Fehler habe ich 3LSB 
angenommen,aber
die Werte waren nicht mal inder nähe.
Frage:
Woran kann das Liegen? Kann ich überhaupt Referenzspannungen über 6V 
benutzen?

3) Trotz der Schleife (sehe unten Code) wandelt anscheinend der 
AD-Wanlder nur einmal.
Frage:
Woran kann das Leigen, muss ich den ADIF löschen obwohl ich kein 
Interrupt benutze?


Ich bin dankebar für jede Hilfe.

PS. der Code und Doku liegt im Anhang als zip :

.include "m168def.inc"

.def        temp_1      = r16
.def        temp_2      = r17
.def        data_H      = r18
.def        data_L      = r19

.cseg

MAIN:
 ;Stackpointer initialisieren
    ldi     temp_1,low(ramend)
    out     spl,temp_1
    ldi     temp_1,high(ramend)
    out      sph,temp_1

 ;PortD liegt an LED's an
    ldi     temp_1,0xFF
    out     DDRD,temp_1
 ;Init AD-Wandler
        ;Reverenz Spannung und Mux-Eingang einstellen
            ldi     temp_1,(0<<REFS1)|(0<<REFS0)|0x0E
            ldi     XH,high(ADMUX)
            ldi     XL,low(ADMUX)
            st      X,temp_1

         ;Alle Digitalbuffer ausschalten für PortC
            ldi     temp_1,0xff
            ldi     XH,high(DIDR0)
            ldi     XL,low(DIDR0)
            st      X,temp_1

         ;
            ldi     temp_1,0x00
            ldi     XH,high(ADCSRB)
            ldi     XL,low(ADCSRB)
            st      X,temp_1

loop:
  ;Start ADC, Single
     ldi     temp_1,(1<<ADEN)|(1<<ADSC)|0x03
     ldi     XH,high(ADCSRA)
     ldi     XL,low(ADCSRA)
     st      X,temp_1
  ;Warten bis messung vertig
     ldi     XH,high(ADCSRA)
     ldi     XL,low(ADCSRA)
   w_L_1:
     ld      temp_1,X
     sbrc    temp_1,ADSC
     rjmp    W_L_1
  ;Daten lessen
     ldi     XH,high(ADCH)
     ldi     XL,low(ADCH)
     ld      data_H,X
     ld      data_L,-X
  ;Invertieren und an Ergebnisausgeben, LED leuchtet bei 0
    com data_L
    out PORTD,data_L

rjmp    loop
#793105
Lesenswert?

Vielleicht sollte jemand mal einen ähnlichen Satz wie diesen ins 
Tutorial schreiben, der, bis auf ein paar Ausnahmen, immer gilt:
Keine Eingangsspannung DARF größer sein als die Versorgungsspannung,
keine Ausgangsspannung KANN größer sein als die Versorgungsspannung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren