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

Thema: Strommessung (Differenz) über ADC0 und ADC1

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.04.2004
    Ort
    Gronau
    Beiträge
    155

    Strommessung (Differenz) über ADC0 und ADC1

    Anzeige

    Powerstation Test
    Hallo,

    ich habe einen Code für einen Tiny26, mit dem eine Strommessung über einen Shunt realisiert wird:

    Code:
          I = 0                                                 'Strommessung mit internem Verstärker
          Wtemp0 = Getadc(&B11001011)                           'REFS0 + REFS1 + (ADC +0/-1 20x) Current with int amplifier
          Waitus 150
          For Btemp = 1 To 16
            Enable Adc
            Mcucr.se = 1
            Mcucr.sm0 = 1
            Mcucr.sm1 = 0
            !sleep
            Wtemp0lo = Adcl
            Wtemp0hi = Adch
            Disable Adc
            I = I + Wtemp0
          Next
          Shift I , Right , 4
    Diese Code soll nun auf einen Mega32 portiert werden. Was mir dabei vollkommen unklar ist, ist die Zeil mit GetADC().

    Wieso wird hier der Wert 203 (&B11001011) übergeben? Normalerweise übergebe ich doch nur den Kanal und einen evtl. Offset? Irgendwie hat das wohl mit der Differenzbildung zwischen ADC0 und ADC1 zu tun. Aber wie funktioniert das genau?

    Kann mir mal jemand dabei helfen?

    Danke.
    Gruß: - Reinhard -

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    im Prinzip kann man bei GetAdc das komplette Register ADMUX übergeben, darin ist auch die Referenzspannungsquelle angegeben, siehe DB.
    Bei GetAdc zwei Parameter zu übergeben (Offset) würde evtl. besser lesbar sein, aber es kommt das selbe dabei raus.
    Nicht bei jedem Tiny kann man bei Bascom die Referenz schon beim Config ADC angeben, deshalb wird es so gemacht, als Workaround.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.04.2004
    Ort
    Gronau
    Beiträge
    155
    Hallo,

    mit dem Datenblatt komme ich nicht so recht weiter. Welchen Wert müsste ich GetADC beim M32 denn übergeben, um das gleiche Ergebnis wie beim Tiny26 zu erzielen?
    Gruß: - Reinhard -

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hi,

    Das geht doch eeh so schön, da der Wert schon binär angegeben ist, braucht man nur im DB zu schauen welche Position was bedeutet:
    Die oberen 2 Bit geben die Referenz an, beide gesetzt, also intern 2,56V + Kondensator an AREF,
    Die unteren 5 Bit geben den Kanal an, da hier aber differential gemessen wird, brauchts etwas mehr,
    01011 bedeuted dann pos. Spannung an ADC0, neg. Spannung an ADC1, Gain ist 20x.

    Jetzt geht man mit diesem Wissen in das DB vom Mega32 und schaut beim Register ADMUX ob der das auch so kann, und wie.
    Im Prinzip kann der das, nur für Gain gibts andere Werte, also muss man da noch etwas anpassen, wohl auch im Rest von der Auswertung des Wertes.

    Bei Deinem Auszug geht aber noch einiges ab, denn da wird anscheinend der IRQ des ADC verwendet.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.04.2004
    Ort
    Gronau
    Beiträge
    155
    Zitat Zitat von linux_80
    Bei Deinem Auszug geht aber noch einiges ab, denn da wird anscheinend der IRQ des ADC verwendet.
    Die Details zum Thema stehen hier: http://www.rclineforum.de/forum/thre...threadid=68553.

    Die Sache mit dem IRQ kann ich nicht einordnen. Ich meine, das der für mich uninteressant ist.

    Ich benötige von dort lediglich die Funktion zur Differenzmessung des Stroms. Die Übergabe des Wertes lt. Datenblatt für den M32 habe ich mittlerweile begriffen. Allerdings gibt es bei einem 1mOhm Shunt (8,5 cm Kupferkabel) nur Werte, mit denen ich nichts anfangen bzw. nicht auf den aktuellen Strom schließen kann.

    Was würdest Du empfehlen, wenn ich bis 10A bei max. 20 Volt messen will oder genauer gesagt, die aus einem Akku entnommenen mA zählen will?
    Gruß: - Reinhard -

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Für den elektronischen Teil muss sich jemand anders bemühen, ist nicht mein Fach. [-X

    Was meinst Du mit den Werten kannst du nix anfangen, was kommt denn so raus ?
    Was sagt das Multimeter ?

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.04.2004
    Ort
    Gronau
    Beiträge
    155
    Das Multimeter sagt, das am Shunt 0,8 mV abfallen.

    Dabei werden lt. Labornetzteil 1,5 A gezogen (20 Watt Halogen bei 9 V) und ca. 70 mA für das RN-Board.

    Bei 10-facher Verstärkung (&B11001001) habe ich als Differenz (?) beim ADC den Wert 1015 mit Last und 6 ohne Last.

    Referenz ist 5V.
    Gruß: - Reinhard -

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Wenn Du den Wert ins ADMUX schreibst ist das aber nicht 5V Referenz sondern intern 2,56V,
    wenn da dann trotzdem 5V an AREF anliegt kommt der ADC etwas durcheinander !
    Du musst also entweder die Referenz richtig einstellen &B00......
    oder aussen nur einen Kondensator an AREF, sonst nix dort anklemmen !

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Neuburg / Donau
    Alter
    63
    Beiträge
    80
    Hallo Reinhard.

    vieleicht hilft dir das ja weiter:

    https://www.roboternetz.de/phpBB2/viewtopic.php?t=27015

    Da habe ich mich mit dem Problem befaßt. Die Spannungsmessung funktioniert bereits. (Werte müssen noch korrekt umgerechnet werden)

    Die Strommesung sollte vom Prinzip her so funktionieren, hab aber im Augenblick keine Zeit sie zu testen. Ich hab das Prog aus der Bascom Hilfe angepaßt.

    Ich messe über Vorwiderstand die Spannung an Ein- (ADC1) und Ausgang (ADC2) des Shunt. Die Differenz ergibt den Spannungsabfall. Daraus (I=u/R) errechne ich den Strom.

    Ob die geringe Spannungsdifferenz ausreicht bin ich mir noch nicht sicher, evtl. muß ein OP als Präzisionsverstärker her.

    (Anmerkung) Die am ADC anliegende Spannung darf 5V nicht übersteigen, sonst stirbt der ADC. Sie darf auch nicht höher sein als die Referenzspannung sonst läuft das Register über.

    Vorgesehen hab ich (bei 30V) als Vorwiderstand eine Reihenschaltung von Widerständen:
    Eingangsspannung (ca 30 V) > Widerstand 47K > auf ADCx > auf 4k7 > auf Pot 500R (zum Abgleich) > Masse

    Das Ganze drei mal (Ausgangsspannung, Eingang Shunt, Ausgang Shunt)

    https://www.roboternetz.de/wissen/in.../ADC_%28Avr%29

    Sieh meinen Beitrag als Denkanstoß. Bin in Eile und kann daher icht alles in Ruhe durchlesen. Viel Spass.

    gandalf


    --------------------------------------------------------------------------------
    Bei der gezielten Lösungssuche helfen auch kleinste Vorversuche ( Dietrich Drahtlos - http://www.b-kainka.de/drahtlos/index.htm )

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    mit dem problem schlag ich mich schon eine ganze weile rum
    tiny26 ADC und Bascom

    eine messung an ADC0 ist mir noch nie gelungen

    Problem an porta bit 4-7 sind led
    ADC1 porta.1 ist die zu messende Spannung AVCC ist refference
    muss ich da noch einen condensator an VREF anlegen gegen masse oder geht das so mit der VCC an AVCC

    gibt es in Bascom auch die möglichkeit den Wrd wert des ADc in eine byte variabel zu konvertieren

    und ich hab noch nirgends eine schaltung zum testen gefunden
    damit man mal aus der VCC saubere volt von 0-vcc zum messen bekommt
    hat da jemand ne idee ein LM317 bringt ja minimum1.25volt
    sonst sind die werte über 1,25bis vcc sauber zu messen jedenfals bei mir
    ich kalibrier den µc auf dies weise

    tiny26 hat ja intern 8mhz clock
    das ist bei der gröse und den feathers voll klasse für die roboter technik
    messen 10kanäle 10bit Steuern 2Kb flash eeprom und sram regeln
    15ports

    hätte da jemand mal einen funktionierenden code (GETESTET) selberschreiben kann ich auch aber funzen soll er

    der den adc(0) sauber wandelt kann auch sein das nach so ca 1500 testflashen der µc was hat

    danke
    Code:
    '/////////////////////////////////////////////////////////
    '///  Bascom ISP Programmer TEST                       ///
    '///   PORT B toggel LED  SERVOan portb3 LCD
    '      ADC1 porta1=signal 0-5V         FUNKTION TYNY26 feb 2007
    '/////////////////////////////////////////////////////////
    $regfile = "AT26def.dat"                                    ' used device
    $crystal = 8000000
    
    $hwstack = 32                                               ' default use 32
    
    $swstack = 10                                               'default use 10 for
    
    $framesize = 40                                             'default use 40 for
    
    
    
    Ddra = &B11110000
    Config Adc = Free , Prescaler = 64 , Reference = Off
    Start Adc
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Servos = 1 , Servo1 = Portb.3 , Reload = 10
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portb.5 , Rs = Portb.4
    Config Lcd = 20 * 2
    Const Teiler = 0.00488
    Const Teiler2 = 1.636
    Enable Interrupts
    
    
    'Start Adc
    
    Dim Wertad As Word
    Dim Tmp As Word
    Dim Wertse As Byte
    'Dim A As Byte
    'Dim Teiler As Single
    Dim Volt As Single
    
    Wertad = 500
    'Teiler = 0.00488
    
    Do
    Waitms 10
    Wertad = Getadc(1)
    'If Wertad > 500 Then Set Porta.5
    'If Wertad < 500 Then Set Porta.6
    If Wertad > 1022 Then Wertad = 1022
    If Wertad < 10 Then Wertad = 10
    Tmp = Wertad / 4
    If Tmp > 150 Then Tmp = 150
    If Tmp < 40 Then Tmp = 40
    Wertse = Low(tmp)
    
    Servo(1) = Wertse
    
    Volt = Wertad * Teiler
    Cls
    Lcd "Volt :" ; Volt
    Locate 1 , 11 : Lcd " V    "                                '; Fusing(volt , "# . ##")
    Lowerline
    Wertse = Wertse - 40
    Volt = Wertse * Teiler2
    Lcd "Grad :" ; Volt
    Locate 2 , 13 : Lcd "    "                                  '; Fusing(volt , "# . ##")
    
    Waitms 100
    
    
    Loop
    
    'kein speicherplatz ehr auf dem chip fusing nicht möglich

Berechtigungen

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

12V Akku bauen