-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Spannungs Test ATmega16

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36

    Spannungs Test ATmega16

    Anzeige

    Also
    Ich möchte gerne die Spannung testen bei meinem ATmega16

    also über den Pin (PC5/ADC5) möchte ich mit dem AD-Converter den Digitalen Wert meiner Spannung haben.

    der sollte so habe ich mich informiert nicht unter <4 V sein also Digital 800 aber wie rechnet man das um?? im Datenblat habe ich eine Formel gefunden : ADC=(Vin * 1024)/Vref

    Habe auf eine Interne Referenz gestellt sollte ich (warum eigentlich?)
    naja aber wie komm ich nun auf einen wert von 800 im ADC
    Vin ist damit doch die Betriebsspannung die gemessen wird ich nehm jetzt mal 4V
    Vref ist dann die 2.56 V
    kommt bei mir aber 1600 raus und nicht 800 ?
    Warum und wie komm ich auf den richtigen Wert

    Und hat vlt jemand ein solches Program ?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Da der ADC nur 10 Bit hat ist der größte Wert den er haben kann 1023.
    Wenn Du die interne Refernz nimmst kannst Du keine Spannungen messen die größer als die Refernz sind. Also kannst Du deine 4V nicht direkt mesen da brauchst Du noch nen Spannungsteiler.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.07.2006
    Ort
    Mannheim
    Beiträge
    454
    Du kannst dich nicht selbst messen. Ist deine VCC = AVCC z.B. 4Volt, so ist das 100% Referenzspannung, genau so wenn es 5 Volt sind. Du brauchst eine unabhängige Referenz, z.B. die interne Ref von 2,56Volt oder eben eine externe stabile Spannung. Bei Verwendung von 2,56V brauchst du zur Messung der Versorgungsspannung noch einen Spannungsteiler von 2:1, da die Messspannung nicht höher sein darf, als die Ref-Spannung, wie Rofo88 auch schon geschrieben hat.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Hmmm ok warum ich die interne Referenzspannung brauche hab ich nun verstanden aber einen ? Spannungs teiler O.O wie soll ich das denn machen ?

    habe mir die funktion Battery() angeguckt ist in der adc.c aber dort kann ich nicht erkennen wo dort ein Spannungsteiler ist`? ok es ist C aber es müsste doch trozdem dort anzeichen von sonem teiler geben?

    Habe hier nen Code in asm gefunden wo ist da der Spannungsteiler
    Code:
    	;ADC Enable und ADC Prescaler auf 128
    	ldi		temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS1)	// adc-clk = sys-clk/64 
    	out		IO_REG(ADCSRA), temp1
    	;Reference Spannung auf Interne 2,56 Volt setzen und ADC5 als Input pin 
    	ldi 	temp1, (1<<REFS0) | (1<<REFS1) | (1<<MUX2) | (1<<MUX0);
    	out		IO_REG(ADMUX), temp1
    Code:
    ;Batt test
    	sbi		IO_REG(ADCSRA), ADSC   
    batt_loop:
    	sbic	IO_REG(ADCSRA), ADSC
    	rjmp	batt_loop
    	in	temp1, 	   ADCL
    	in	INT_REG_H, ADCH
    	clr	INT_REG_L
    	add	INT_REG_L, temp1
    	adc	INT_REG_H, r1
    	subi	INT_REG_L, lo8(BATT_MIN)
    	sbci	INT_REG_H, hi8(BATT_MIN) 
    	brcc	batt_ok
    [/code]

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.10.2004
    Ort
    Baoding
    Alter
    37
    Beiträge
    687
    Der Spannungsteiler hat nix mit Software zu tun. Den mußt Du extern aufbauen z.B. mit 2 Widerständen a 10kOhm. Damit bekommst Du deine 4V auf 2V und die kannst Du mit dem ADC auswerten.

    http://de.wikipedia.org/wiki/Spannungsteiler

    Gibts sicher auch noch mehr Infos hier im Forum.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    AHHH danke ist ja schon dran
    Also mein problem ist gelöst aber da wäre noch so ne kleine Frage?
    was passiert in diesen Zeilen
    ich versteh dasmit dem carry nicht und was in r1 ist auch nicht so richtig?
    also hier
    Code:
       in   temp1,       ADCL 
       in   INT_REG_H, ADCH 
       clr   INT_REG_L 
       add   INT_REG_L, temp1 
       adc   INT_REG_H, r1 
       subi   INT_REG_L, lo8(BATT_MIN) 
       sbci   INT_REG_H, hi8(BATT_MIN) 
       brcc   batt_ok

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.07.2006
    Ort
    Mannheim
    Beiträge
    454
    Ohne def-tabelle kann man doch nur raten.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Also temp1 ist r16 INT_REG_L und H sind r24 und r25
    BATT_MIN sind dann jetzt 810 wegen 4.455 V mindest Spannung
    r1 wird im ghanzen prog vorher nicht verwendet. In ADC also ADCL und ADCH ist der wert für die Betriebsspannung der vorher gemessen wurde

    habe in den post vorher mehr von den quelltext geposted hier nur der teil den ich nicht verstehe

    ich vermute das einfach die gemessene spannung - der mindest spannung und dann geguckt wird ob es >0 oder =0 aber was da mit den Carry gemacht wird das verwirrt mich total

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.07.2006
    Ort
    Mannheim
    Beiträge
    454
    So wie beim addieren das Carry Fag einen Übertrag anzeigt, so ist das gleiche Flag bei der Subtraction ein "Borrow". Wenn du also (mal dezimal gesehen) von 3 die 4 subtrahierst ist das Ergebnis = 9, aber du must von der nächst höheren Stelle eins borgen.
    Wenn du vom Messwert einen Vergleichswert abziehst und carry ist nicht gesetzt, heißt das, das der Messwert höher ist.
    mal sehen ob ich hier einen Teilcode hinkriege:

    Code:
       in      INT_REG_L,       ADCL        ;lies lo Wert
       in      INT_REG_H,       ADCH       ;lies hi wert
       subi   INT_REG_L,    BATT_MIN    ;Subtrahiere lo Wert (oder Register)
       sbci   INT_REG_H,    BATT_MIN    ;Subtrahiere hi Wert (oder Register)
       brcc   batt_ok                             ;Messwert größer als Vergleich (kein borrow)

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Also das Carry Flag zeig dann an ob eine zahl negativ oder positiv ist
    bei minus ist dann das Carry Flag gesetzt soweit ok

    aber wie funzt brcc das der beide Register also INT_REG_L und INT_REG_H vergleicht ?

    und warum muss man den low mit subi und den andern mit sbci subtrahieren?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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