- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Aufgaben zur Elektronik --> Batterieprüfung (A/D-Wandler)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.06.2007
    Ort
    zwischen Hannover und Hildesheim
    Alter
    32
    Beiträge
    135

    Aufgaben zur Elektronik --> Batterieprüfung (A/D-Wandler)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,
    ich habe das erste Begleitbuch zum ASURO und hinten bei den Elektronik-Aufgaben steht unter Punkt 5.2 "Batterieprüfung", dass man im Handbuch [5] zu dem eingesetzen Prozessor das Kapitel über den A/D Wandler durchlesen soll.

    Ich habe bisher zwar soviel mitbekommen, dass ein A/D Wandler dazu da ist, analoge in digitale Signale umzuwandeln, aber daraus werde ich noch nicht so ganz schlau, wozu das Teil eigentlich nötig ist, geschweige denn wie man mit Hilfe dessen die Batterie prüfen kann.

    Ich habe mir das Handbuch zum AtMega8 von der CD angeguckt aber da steht alles auf Englisch und ich konnte nichts über den A/D Wandler finden, dass mir irgendwie weitergeholfen hätte.

    Es wäre schön, wenn ihr mir detailliert für Anfänger erklären könntet, wozu das Ding da ist und wie man damit die Spannung auslesen kann oder wenn ihr mich zu einer guten Erklärung verweisen könntet. [-o<


    Vielen Dank
    jawo3

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    39
    Beiträge
    685
    Du kannst die Spannung mit einem Spannungsteiler (zB. wie dem vom RN-Board) ermitteln:

    init:
    Code:
    void adc_init(void)
    {
         ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);    //  Teilungsfaktor 73.728 <= X <= 294,912  ---> X=128
    	 /*  ADMUX &=~ ((1<<REFS1) | (1<<REFS0)); // Referenzspannung off  */ 
    }
    
    //-----------------------------------------------------
    
    float adc_Kanal_messen(uint8_t mux)
    {
         adc_result = 0; 
         ADMUX = mux;                      // Kanal waehlen
         ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
         while ( ADCSRA & (1<<ADSC) ) {;}     // auf Abschluss der Konvertierung warten 
         adc_result = ADCW;  // ADCW muss einmal gelesen werden
         adc_result = 0;     // Dummy
         for( adc=0; adc<4; adc++ )
         {
             ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
             while ( ADCSRA & (1<<ADSC) ) {;}   // auf Abschluss der Konvertierung warten
             adc_result += ADCW;		    // Wandlungsergebnisse aufaddieren
         }
         adc_result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
         adc_result = adc_result*(5.00/1023);    
         return adc_result;
    }
    auslesen:
    Code:
    adc_Kanal_messen(1);
    			 adc_result=adc_result*5.00736;
    			 dtostrf(adc_result,2,2,puffer_tostr);
    			 lcd_gotoxy(0,1);
    			 lcd_puts("Spannung: ");
    			 lcd_puts(puffer_tostr);
    			 lcd_puts(" Volt \n\r");
    Die Code-Schnipsel findest du hier im Forum (sowie die Spannungsteiler-Berechnung) und hier: http://www.mikrocontroller.net/artic...l_Converter.29

    Gruß
    Stefan

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    der adc nimmt eine analoge spannung (also eine spannung zwischen 0V und 5V) und berechnet daraus einen wert zwischen 0 (0V) und 1023 (5V).

    damit kann man zB die liniensensoren nutzen:

    der sensor selbst ist ein lichtabhängiger widerstand. je mehr licht drauf fällt (bzw vom boden reflektiert wird, was halt bei weisser fläche besser ist als bei schwarzem strich), desto kleiner ist der widerstand. desto höher ist also die spannung die am adc ankommt.

    sagen wir mal, der sensor hat einen ausreichenden widerstand um nur 2,5 v ankommen zu lassen, wir sprechen also von einer recht grauen fläche bzw. ungefähr dem zustand wenn der sensor genau auf der kante der linie ist.

    der adc berechnet dann ungefähr 500. mit diesem wert kann man arbeiten und rechnen, im gegensatz zur analogen spannung von 2,5 v.

    ganz grob gesehen kann man also sagen, dass der adc eine spannung misst und das ergebnis ausgibt.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.06.2007
    Ort
    zwischen Hannover und Hildesheim
    Alter
    32
    Beiträge
    135
    Okay, dann weiß ich jetzt schon mal ein bisschen mehr.

    @Reeper
    In dem Code stehen ganz viele Befehle drin, von denen ich noch nie etwas gehört habe. Was sind das für Dinger mit dem "lcd"? Dient das zur Ausgabe auf einem Display? Wie kann man das dann umschreiben, sodass es als SerWrite gesendet wird?

    In dem von dir geposteten Link stand etwas von 8Bit und 10Bit A/D-Wandlern. Formen die dann aus der Spannung nur einen Wert von 0 bis 8 statt von 0 bis 1024? Wie viel Bit hat denn ASUROs A/D Wandler?


    @damaltor
    der adc nimmt eine analoge spannung (also eine spannung zwischen 0V und 5V) und berechnet daraus einen wert zwischen 0 (0V) und 1023 (5V).
    Also würde er dann die Batteriespannung auslesen und daraus dann einen Wert zwischen 0 und 1024 machen?
    Aber wie kann ich die Auslesung starten bzw. welche Funktion muss ich dafür aufrufen und wie kann ich dann auf den ermittelten Wert zugreiffen und mit ihm rechnen.

    Und wenn er aus einer Spannung zwischen 0V und 5V einen Wert errechnet, wie macht er das dann mit vollen Batterien, die dann ja so um die 6V haben dürften?


    Und dann hätte ich noch eine kleine Frage für die ich nicht extra einen neuen Thread aufmachen möchte:
    Wie greifft man auf einem BESTIMMTEN Taster zu. Mit PollSwitch() fragt man ja ab, ob IRGENDEINE Taste gedrückt wurde, aber wie ist das, wenn man eine BESTIMMTE Taste haben möchte? Sind die einfach durchnummeriert?
    Ich habe irgendwo schonmal was von unterschiedlichen Wiederständen gehört. In welcher Weise spielen die dabei eine Rolle?


    Es tut mir wahnsinnig Leid, dass ich euch mit so vielen Fragen überrumpeln muss, aber ich freue mich immer sehr, wenn ich etwas sinnvolles dazulernen kann.

    Schon mal vielen Dank im Voraus
    jawo3

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    der adc hat nicht festgelegt, dass 1023 = 5V sind. dies kann man mithilfe einer extern anzulegenden vergleichsspannung einstellen, ausserdem kann der prozessor selbst eine exakte spanung von 2,56V intern generieren. dieser zählt dann glaube ich als "256".

    due batteriespannung ist ausserdim etwa 6V, aber wird durch die große diode um etwa 0,7V heruntergeregelt.

    mit pollswitch fragt man nicht alle taster ab. sondern man startet den analog-digital-wandler =)

    jeder taster ist mit einem widerstand verbunden. dabei ist der wert, den pollswitch zurückgibt, die SUMME aller taster. die taster haben folgende werte:

    Taster1: 1
    Taster2: 2
    Taster3: 4
    Taster4: 8
    Taster5: 16
    Taster6: 32

    Wenn Pollswitch also "16" zurückgibt, dann ist taster 5 gedrückt. wenn pollswitch "44" zueück gibt, dann sind die taster 6,4,3 gedrückt.

    für jede zurückgegebene zahl gib es ur eine mögliche tasterkombination.


    die asuro adcs haben 10 bit, man kann aber auch nur 8 bit auslesen wenn man will. dann ist der wert nicht so genau, er geht nur von 0 bis 255. das reicht oftmal aus.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.06.2007
    Ort
    zwischen Hannover und Hildesheim
    Alter
    32
    Beiträge
    135
    der adc hat nicht festgelegt, dass 1023 = 5V
    Schade eigentlich...

    dies kann man mithilfe einer extern anzulegenden vergleichsspannung einstellen, ausserdem kann der prozessor selbst eine exakte spanung von 2,56V intern generieren. dieser zählt dann glaube ich als "256".
    Sorry, aber den Satz verstehe ich inhaltlich nicht so ganz. Was ist das für Vergleichsspannung und wo kommt die her? Und wozu kann der Prozessor 2,56V generieren?

    due batteriespannung ist ausserdim etwa 6V, aber wird durch die große diode um etwa 0,7V heruntergeregelt.
    Achso, okay!

    mit pollswitch fragt man nicht alle taster ab. sondern man startet den analog-digital-wandler =)

    jeder taster ist mit einem widerstand verbunden. dabei ist der wert, den pollswitch zurückgibt, die SUMME aller taster. die taster haben folgende werte:

    Taster1: 1
    Taster2: 2
    Taster3: 4
    Taster4: 8
    Taster5: 16
    Taster6: 32

    Wenn Pollswitch also "16" zurückgibt, dann ist taster 5 gedrückt. wenn pollswitch "44" zueück gibt, dann sind die taster 6,4,3 gedrückt.

    für jede zurückgegebene zahl gib es ur eine mögliche tasterkombination.
    Juhu, das habe ich verstanden.
    Allerdings macht mir trotzdem eines meiner Übungsprogramme Probleme.
    Was ist hier dran falsch:
    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	Init();
    	
    while(1)
    {
    	if (PollSwitch()==1) 
    	{
    	StatusLED(YELLOW);
    	BackLED(OFF,OFF);
    	FrontLED(OFF);
    	}
    	else if (PollSwitch()==2) 
    	{
    	StatusLED(RED);
    	BackLED(OFF,OFF);
    	FrontLED(OFF);
    	}
    	else if (PollSwitch()==4) 
    	{
    	BackLED(ON,OFF);
    	FrontLED(OFF);
    	}
    	else if (PollSwitch()==8) 
    	{
    	BackLED(OFF,ON);
    	FrontLED(OFF);
    	}	
    	else if (PollSwitch()==16) 
    	{
    	BackLED(ON,ON);
    	FrontLED(OFF);
    	}	
    	else if (PollSwitch()==32) 
    	{
    	BackLED(OFF,OFF);
    	FrontLED(ON);
    	}	
    	else StatusLED(GREEN);
    }
    return 0;
    }
    Hier soll bei einem bestimmten Tastendruck eine bestimmte LED leuchten, aber da gibt´s zwischendurch immer Probleme. Die StatusLED Anweisungen laufen sauber, aber wenn ich zB Taster3 drücke und danach Taster4 verändert sich gar nichts. Es wäre nett, wenn ihr da mal kurz drüber gucken könntet.

    die asuro adcs haben 10 bit, man kann aber auch nur 8 bit auslesen wenn man will. dann ist der wert nicht so genau, er geht nur von 0 bis 255. das reicht oftmal aus.
    Habe, ich glaube ich auch verstanden.

    Aber jetzt muss ich noch mal kurz genauer nachfragen:
    Also wenn dem ADC zum Beispiel über die Taster eine Spannung zugeführt wird, was macht er dann damit? Wandelt er dass dann in einen Wert zwischen 0 und 1023 um, oder läuft die Sache anders.



    Vielen Dank
    jawo3

    PS: Ich komme mir irgendwie so unwissend vor, aber jeder wird ja hoffentlich mal so angefangen haben, oder

  7. #7
    Neuer Benutzer Öfters hier Avatar von Werner++
    Registriert seit
    05.05.2007
    Ort
    Freising
    Beiträge
    8
    Zitat Zitat von jawo3
    Allerdings macht mir trotzdem eines meiner Übungsprogramme Probleme.
    Was ist hier dran falsch:
    Wenn Du gleichzeitig Taster 3 und 4 drückst, so liefert Pollswithc() die Summe von 4 (für Taster 3) und 8 (für Taster 4) zurück - also 12. In Deinem Programm wird nie auf 12 abgefragt, also bleibt die StatusLED grün - der letzte else-Fall.

    Um das gleichzeitige Drücken der Tastern feststellen zu können, kannst Du den Returnwert von Pollswitch binär undieren. Also etwa so:
    Code:
        unsigned char taster = Pollswitch();
        if( taster & 4 )  /* Taster 3 */
        {
            /* zeige LED für Taster 3 */
        }
        else
        {
            /* LED für Taster 3 OFF */
        }
        if( taster & 8 )  /* Taster 4 */
        {
            /* zeige LED für Taster 4 */
        }
        else
        {
            /* LED für Taster 4 OFF */
        }
        /* usw. */
    Zitat Zitat von jawo3
    Ich komme mir irgendwie so unwissend vor, aber jeder wird ja hoffentlich mal so angefangen haben, oder
    na ja - Du bist ja noch jung - oder?

    Gruß
    Werner

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    39
    Beiträge
    685
    Hallo jawo3,

    der Code soll stellvertretend sein (merke gerade, dass nicht der rp6, sondern der Asuro gemeint war, deshalb müssten evtl. die Register-Einstellungen geändert werden).

    Ersteinmal die Spannungsteiler - Berechnunge (ohne Spannungsteiler darf höchstens bis zur Referenzspannung gemessen werden):
    https://www.roboternetz.de/phpBB2/ze...ler+berechnung

    Variable:
    Code:
    uint8_t bPortd,adc;
    float adc_result; 
    char puffer_tostr[20];
    init (Register setzen):
    Code:
    void adc_init(void)
    {
         ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);    //  Teilungsfaktor 73.728 <= X <= 294,912  ---> X=128
    	 /*  ADMUX &=~ ((1<<REFS1) | (1<<REFS0));                          // ---> Referenzspannung off  */ 
    }
    messen:
    Code:
    float adc_Kanal_messen(uint8_t mux) 
    { 
         adc_result = 0; 
         ADMUX = mux;                           // Kanal waehlen und VCC=Referenzspannung
         ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung starten
         while ( ADCSRA & (1<<ADSC) ) {;}     // auf Abschluss der Konvertierung warten 
         adc_result = ADCW;                    // ADCW muss einmal gelesen werden 
         adc_result = 0;                       // Dummy -> adc_result nullen
         for( adc=0; adc<4; adc++ )           // 4x eine ADC-Wandlung durchführen
         { 
             ADCSRA |= (1<<ADSC);              // eine Wandlung "single conversion" 
             while ( ADCSRA & (1<<ADSC) ) {;} // auf Abschluss der Konvertierung warten 
             adc_result += ADCW;                // Wandlungsergebnisse aufaddieren 
         } 
         adc_result /= 4;                       // Summe durch vier teilen = arithm. Mittelwert 
         adc_result = adc_result*(5.00/1023);   // 5,00 Volt nach Spannungswanlder gemessen -> wenn kein Spannungsteiler verwendet = Endergebnis   
         return adc_result; 
    }

    auslesen (zB. im main-Teil):
    Code:
    adc_Kanal_messen(1);                                // PORTA1 auswählen
              adc_result=adc_result*5.00736;            // 5,00736 = bei den gewählten Widerständen bester Wert (vom Spannungsteiler)
              dtostrf(adc_result,2,2,puffer_tostr);     // float to string umwandlung -> LCD und UART Ausgabe (verständlich Zeichen)
              /*
    		  lcd_gotoxy(0,1);                                
              lcd_puts("Spannung: "); 
              lcd_puts(puffer_tostr); 
              lcd_puts(" Volt \n\r");
    		  */
    Habe den Code nochmal besser kommentiert (am besten in einen Editor wie Programmers Notepad kopieren -> besser lesbar).
    Die LCD Kommandos wurden ausgeklammert.

    Der Code oben ist für einen Atmega32 (Register könnten andere sein).
    Wie o.g. ist es hier recht gut erklärt:
    http://www.mikrocontroller.net/artic...l_Converter.29

    Gruß
    Stefan

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    ja, so sieht das ganze auf registerebene aus... =)

    über die taster wird immer eine spannung an den adc gelegt. dieser wird durch die funktion pollswitch nur dazu aufgefordert, den wert umzuwandeln.

    um eine spannung zu messen braucht man immer eine vergleichspannung. diese vergleichspannung wird i.a. als 1023 festgelegt. die hälfte dieser spannung wäre dann z.b.511 und ein viertel dieser spannung wäre 255. ein tausendstel der spannung wäre theoretisch der wert 1.

    wenn man jedoch die batteriespannung messen will braucht man eine vergleichsspannung - es macht ja wenig sinn die batteriespannung mit sich selbst zu vergleichen. dazu hat der prozessor eine interne schaltung, die jederzeit exakt 2,56V generiert. diese kann man als vergleichsspannung nutzen.


    zurück zu pollswitch: das interessante an ebendiesen werten ist die binäre darstellung.
    1 = 00000001
    2 = 00000010
    4 = 00000100
    8 = 00001000
    16 = 00010000
    32 = 00100000

    dadurch kann man ganz gut herausfinden, welche taster nun gedrückt sind. dazu solltest du dich mal mit LOGISCHEN OPERATOREN beschäftigen, das sind & (und) sowie | (oder).
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.06.2007
    Ort
    zwischen Hannover und Hildesheim
    Alter
    32
    Beiträge
    135
    ja, so sieht das ganze auf registerebene aus... =)
    Gibt es zu der Darstellung auf Registerebene hilfreiche Tutorials/Anleitungen/Erklärungen/Lehrtexte. Das würde mir das Verständnis wohl um einiges erleichtern.

    über die taster wird immer eine spannung an den adc gelegt. dieser wird durch die funktion pollswitch nur dazu aufgefordert, den wert umzuwandeln.
    Läuft das auch so zum Beispiel bei den Fototransistoren, dass je nach Helligkeit eine unterschiedlich große Spannung erzeugt un an den ADC gelegt wird und je nachdem wie groß die Spannung ist die ihn erreicht ein Wert ermittelt wird, indem er die erhaltene Spannung mit einer vom Prozessor generierten Vergleichsspannung vergleicht?
    (Bitte sagt mir, dass das richtig war )

    zurück zu pollswitch: das interessante an ebendiesen werten ist die binäre darstellung.
    1 = 00000001
    2 = 00000010
    4 = 00000100
    8 = 00001000
    16 = 00010000
    32 = 00100000

    dadurch kann man ganz gut herausfinden, welche taster nun gedrückt sind. dazu solltest du dich mal mit LOGISCHEN OPERATOREN beschäftigen, das sind & (und) sowie | (oder).
    Okay, danke. Das habe ich soweit jetzt alles verstanden. Mit logischen Operatoren habe ich mich während des Lernens der C Grundlagen schon beschäftigt und das Binär-System habe ich mittlerweile ziemlich gut drauf.


    Aber wie gesagt, es wäre schön, wenn ihr mir mit dem Programmieren auf Registerebene helfen könntet.


    Vielen Dank
    jawo3

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test