- 3D-Druck Einstieg und Tipps         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: Batteriestrom messen mit AVR

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Anzeige

    Praxistest und DIY Projekte
    Oh Mann,
    dieses kleine Ding ist 4mm lang, keine 3mm Breit und hat 8 Beine.
    Ich hab den LMP8270 eingesetzt. Aber irgendwie kommt hinten noch nicht das raus, was ich erwarte.

    -Durch den Shunt fließt ein Strom von 2,1 A.
    -An den Eingängen +IN/ -IN des LMP8270 liegen 2,1mV. Das ist ok.
    -Am OUT des LMP8270 und am ADC Eingang des AVR sind 45,4mV.
    Wegen V=20 des LMP8270 scheint das auch ok zu sein.
    -Damit ich jetzt auf meine 2,1A komme muß ich nochmal den Faktor 2
    einfügen, das ist mir noch nicht so recht klar.

    Außerdem hab ich Probleme wenn ich mit dem Funkgerät das an der Batterie angeschlossen ist auf Senden gehe.
    Hier gibts vermutlich direkt Einstrahlung in den fliegenden Aufbau.

    Gruß
    Hans


    So schauts aus:
    Code:
    '///////////////////////////////////////////////////////////////////////////////
    'Die Taster 0,1,2,3 mit Intr Routine abfragen
    ' STK200 und ATMEGA8535
    '///////////////////////////////////////////////////////////////////////////////
    $regfile = "M8535.dat"
    $crystal = 8000000            ' Interner Takt des AVR
    
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
    Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    Config Portd = Input
    Config Portb = Output
    Portb = 255
    Cls
    Wait 1
    
    Umess:
    Dim Adu_wert2 As Word
    Dim Uadc2 As Single
    Dim Umes2 As Single
    Dim I As Single
    
    Config Adc = Single , Prescaler = Auto , Reference = Off
    Start Adc
    
    Do
     Adu_wert2 = Getadc(2)
     Uadc2 = Adu_wert2 * 0.00391  'AREF=4V ==> 4/1024=0.00391
     Umes2 = Uadc2 * 21.48        'Verstärkungsfaktor LMP8270
     ' Umrechnung für Strom
     I = Umes2 * 2                ' Da bei einer UADC= 40mV gleich 2A entspricht
    
    
    'LCD Anzeige
     Cursor Off Noblink
     Locate 1 , 1 : Lcd "Uadc2= " ; Fusing(uadc2 , "##.#####")
     Waitms 300
     Locate 2 , 1 : Lcd "Umes2= " ; Fusing(umes2 , "##.#####")
     Waitms 300
     Locate 3 , 1 : Lcd "I=     " ; Fusing(i , "##.#")
     Waitms 300
    
    ' LCD Anzeige wenn kein Strom fließt:
    '//////////////////////////////////////
    '// Uadc2= 0.00391                  
    '// umes2= 0.08844                 
    '// I=                              
    '//                                 
    '//////////////////////////////////////
    ' d.h die Anzeige kommt von toggeln eines Digits, 0.00391 x 22.62 =0.08844
    
    ' LCD Anzeige wenn 2,1A durch den Shunt fließen:
    '//////////////////////////////////////
    '// Uadc2= 0.00391    
    '// umes2= 0.08844   
    '// I=     1,9              
    '//                            
    '//////////////////////////////////////
    '

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101

    Warum muß ich nochmal den Faktor 2 einfügen?

    Hallo!
    Jetzt hab ich den Fehler mit den Faktor 2 gefunden
    Im Programm an der Selle: I = Umes2 * 2.
    Ich wußte nicht warum ich nochmal den Faktor 2 brauche um die Richtige Anzeige für I zu erhalten.
    Immer dann, wenn im Nachbarkanal ADC0 auch die Spannung 12V gleichzeitig gemessen wird, verringert sich die gemessene Stromstärke um den Faktor 2.
    Wenn ich die Eingänge für die Spannungsmessung (+ und -) am ADC0 abziehe ist alles so wie es sein soll bei der Strommessung.
    Was ist denn das für ein Käse? Kann ich da was entstören?
    Gruß
    Hans

  3. #13
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    In dem Basicprogramm ist ein Fehler ebi der Stromberechnung:
    Man muss duch den Verstärkungsfaktor teilen,nicht damit multiplizieren. Außerdem muß man noch duch den Widerstandswert (1mOhm) teilen. Dann fällt auch der komische Faktor 2 weg. So kommt für 21.48^2 * 2 halt ungefähr 1000 raus und der Fehler fällt nicht sofort auf. Eventuell muss man auch noch einen kleinen Offset berücksichtigen.

    Zum Entstören sollte man zwischen OP bzw. Strommessverstärker und den ADC Eingang ein Widerstand von ca. 5-10 kOhm sein. Ggf kommt noch ein kleiner Kondensator (100pF-1nF) vom adc-Eingang nach AGND. Manche langsame OPs reagieren auf HF Störungen vom ADC Eingang. Der Wiederstand begrenzt außerdem den möglichen Eingangsstrom falls der OP mehr Spannung als der Controller hat.
    Wenn man Zeit hat sollte man den ADC mehrfach auslesen: ggf. den ersten Wert nach dem Umschalten verwerfen, und dann z.B. 50 Werte aufsummieren. Man kriegt dadurch etwas mehr Auflösung und wird weniger empfindlich gegen Störungen.

    Die Wechselwirkung mit der Spannungsmessung am Nachbarkanal könnte durch eine Masseschleife zustande kommen.

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Das versteh ich nicht.

    Bei einem Strom von 2A durch den Shunt (Rs=1mOhm) liegen 2mV am Eingang des OPV.
    Wenn der ein V =20 hat muß ich denn das nicht mit dem eingelesenen Wert Multiplizieren?

    Irgendwie kapier ich gar nix mehr.

    Ist das denn nicht so?:
    ===============
    Adu_wert2 = Getadc(2)
    'AREF=4V ==> 4/1024=0.00391

    Uadc2 = Adu_wert2 * 0.00391

    'Verstärkungsfaktor LMP8270
    Umes2 = Uadc2 * 20

    Aber irgendwas ist falsch, ich bekomme nur Hausnummern raus sobald sich der Strom ändert.

    Wie müßte es sein wenn ich bei 1mV = 1A angezeigt haben will und bei 50mV = 50A?

  5. #15
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man will die Spannung am Widerstand berechnen. Die Spannung am Ausgang des Verstärkers ist 21 mal größer als die am Widerstand. Die gesuchte spannung ist also um den Faktor 21 kleiner. Also:
    Uadc = 21 * Umess => Umess = Uadc / 21

    Bei 4 V ref. entspricht ein LSB beim AD gerade 3.91 mV. Um die Spannung im mV zu bekommen also:
    U(mV) = 3.91 * Getadc(2) / 21

    Die Verstärkung ist übrigens noch etwas klein. Man könnte auch eine kleinere Referenzspannung wählen.

    Sowohl der ADC als auch der Verstärker haben als Fehler einen kleinen, Offset. D.h. auch wenn kein Strom fließt wird der ADC nicht unbedingt 0 anzeigen. Wenn doch, ist der Offset eventuell negativ und man müßte das analog ändern.

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Hallo!
    Nun hab ichs glaube ich verstanden. Danke!
    Die Vref hab ich auf 2,56V verkleinert. Könnte bitte nochmal jemand den Code ansehen, ob man das so macht. Ich hab was mit Mittelwertbildung reingemacht, merke aber nicht allzuviel Unterschied bei der Anzeige.
    Nimmt das Programm eigentlich immer einen neuen gewandelten Wert vom ADU für Umes? Oder ist das immer der gleiche? Dann hats wenig Sinn Oder?

    Code:
    '///////////////////////////////////////////////////////////////////////////////
    'STK200 und ATMEGA8535
    'Strommmessung
    '///////////////////////////////////////////////////////////////////////////////
    '  I
    '  !           !\  V=20  (LMP8270)
    '  +----+------+  \
    '  #    !      !    \
    '  #Rs  ! Umes !     +-------####----+------>  ADC Kanal2
    '  #    ! =50mV!    /         5k     !         Uadc=1000mV (Wenn 50A Strom fließt)
    '  +----Y------+  /                 === 1n
    '  !           !/                    !
    ' -+-                               -+-
    '  Rs=1mOhm
    '
    '  1mV   =======> x 20 ==================> = 20mV   = 1A
    '  10mV  =======> x 20 ==================> = 200mV  = 10A
    '  50mV  =======> x 20 ==================> = 1000mV = 50A
    '---------------------------------------------------------
    '! Umes  <-------- Uadc/20 <---------------   Uadc
    '---------------------------------------------------------
    '
    '
    ' Vref= Extern= 2,56V  mit Poti am STK200 eingestellt
    '
    '///////////////////////////////////////////////////////////////////////////////
    $regfile = "M8535.dat"
    $crystal = 8000000            ' Interner Takt des AVR  => FuseBit!
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6
    Config Lcdpin = Pin , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    Config Portd = Input
    Config Portb = Output
    Portb = 255
    Cls
    Wait 1
    
    Dim Wert As Word
    Dim Offset As Word
    Dim Uadc2 As Single           'Single= 4 Byte
    Dim Umes As Single
    Dim I As Single
    
    Dim N As Byte
    Dim Umes1 As Single
    
    Config Adc = Single , Prescaler = Auto , Reference = Off
    Start Adc
    '///////////////////////////////////////////////////////////////////////////////
    Do
     Wert = Getadc(2)                 
     Uadc2 = Wert * 0.002502      'VREF= 2,56V 
    
     '/////// Mittelwert für die Anzeige bilden /////////////////////////////////
     N = 0
     Do
        Umes1 = Umes1 + Umes
        Incr N
     Loop Until N = 50
        Umes1 = Umes1 / 51
    
     Umes = Uadc2 / 20           'Umes= Wert am Shunt in V
     I = Umes * 1000              'Umrechnung für Stromanzeige
    
    '// LCD Anzeige /////////////////////////////////////////////////////
     Cursor Off Noblink
     Locate 1 , 1 : Lcd "Uadc2= " ; Fusing(uadc2 , "##.###")
     Waitms 300
     Locate 2 , 1 : Lcd "Umes=  " ; Fusing(umes , "##.####")
     Waitms 300
     Locate 3 , 1 : Lcd "I=     " ; Fusing(i , "##.#")
     Waitms 300
     Locate 4 , 1 : Lcd "Umes1= " ; Fusing(umes1 , "#.#####")
     Waitms 300
    
    ' So schaut die LCD Anzeige bei 50mV am Shunt aus: 
    '/////////////////////
    '// Uadc2= 1.001
    '// Umes=  0.0502
    '// I=     50.0
    '// Umes1= 0.05017
    '/////////////////////
    
    Loop
    End


    Gruß
    Hans

  7. #17
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    So wie das Programm ist, wird immer der selbe Wert Umes benutzt. In der Schleife zum aufsummieren muss der getAD() Aufruf stehen, denn da wird die Hardware abgefragt.

    Für so ein kleines Projekt macht es noch nichts, aber man sollte bei Mikrokontrollern schon etwas auf den Speicherplatz (besonders RAM) achten. Fleisskomma-zahlen sind langsam und brauchen auch viel Platz. man muss auch nicht für jedes Zwischenergebnis eine extra Variable definieren, auch wenn es hier die Sache etwas übersichtlicher macht.

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Mensch Danke!
    Jetzt merkt man wenigstens, dass sich an der Anzeige was ändert, die zappelt plötzlich nicht mehr so.

    Das mit dem Speicherplatz einsparen ist so eine Sache, ich wüsste gar nicht wie ich das anders und mit weniger Variablen machen sollte. Außerdem muss ich jedesmal viel Text dazuschreiben, damit ich nach einer längeren Pause wieder weiß warum ich das so gemacht habe. Die letzten Tage haben Spaß gemacht, weil ich jeden Tag was neues dazugelernt habe. Als Hobbyprogrammierer ist manches auch nicht so einfach zu verstehen. Das kann aber auch am Alter (56) liegen und sicher auch daran, dass ich meist nur im Weihnachtsurlaub mit AVRs bastle weil ich dazwischen wenig dazukomme.

    Jetzt muss ich noch die Spannungsmessung reinmachen und versuchen, dass ich das Übersprechen auf die anderen Kanäle weg bekomme, evtl. auch die fliegende Verdrahtung ändern.

    Würde es was bringen, wenn ich in die Zuleitung vom Shunt zum Verstärkereingang in jede Leitung eine 100uH Drossel einbaue und evtl. noch direkt an die Eingänge ein kleines C von 1nF?

    Gruß
    Hans

  9. #19
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die zusätzliche Filterung am Eingang würde nur in einer worklich HF verseuchten umgebung Sinn machen. Da sollte der Filter zwischen den beiden Stufen aureichen. Außerdem ist für das mitteln ganz gut, wenn der ADC ein paar Störungen abkriegt und nicht immer genau das gleiche mißt.

    Kürzer könnte man das z.B. schreiben als:
    I = Umes1/51 / 20 * 1000 * 2.56 / 1024 + Offset
    , wobei Umess1 die Summe der ADCwerte als Integer ist.
    Man muss dann aber etwas Kommentar dazu schreiben. Ein einigermaßener Compiler sollte die ganzen Konstantem schon beim übersetzen, also auf dem PC, zusammenfassen. Der AVR wird dann nurnoch eine Multiplication machen müssen.

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    101
    Das folgende versteht mein Compiler (Bascom) gar nichth.
    "I = Umes1/51 / 20 * 1000 * 2.56 / 1024 + Offset "

    Sonst bin ich am aufbauen einer neuen Platine mit Fädeldraht, dauert noch etwas bis ich mich wieder melde.
    Einen Guten Rutsch an alle "Zuhörer".
    Gruß
    Hans

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test