- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: Tempmessung mit NTC und Atmega 8.

  1. #21
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Anzeige

    Powerstation Test
    Das geht recht einfach.

    Nehmen wir mal an Position 1 ist die 20° Marke und jede weitere 5° mehr.

    Wenn du deinen AD-Wert nun mit dem Datazeileninhalt vergleichen willst dann nimmste ne Schleife

    Du vergleichst ob der Gelesene Wert kleiner als der jeweilige Tabellenwert ist.
    Ist der Fall gegeben dann ist der Rest einfach.

    Der Gefundene Wert errechnet sich für Tempmaximum 20+((x-1)*5) und das Minimum dann mit 20+((x-2)*5)

    Dazwischen wird dann einfach gemittelt.

    also Schrittweite =Maximum-Minimum
    Abstand zum Maximum = Maximum-Aktuell.
    Endwert=Maximum-(Abstand zum Maximum *Schrittweite)

    DerEndwert ist dann in °Celsius

    Durch die Schleife sparst du nochmal beträchtlich an platz.
    Gruß
    Ratber

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    Alles klar, ich glaube ich habs.
    Stelle den code mal rein. Dann kannst du bze ihr euch das ja mal angucken.
    Von 91% auf bis jetzt 16% runter programmiert!
    Ohne den Aufruf der Print Befehle sogar nur 7%, also die reine Berechnung.

    gute Nacht

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    
    
    Dim Volt As Integer
    Dim Ist As Integer
    Dim Ist2 As Integer
    Dim Istwert As Integer
    Dim Tempwert As Byte
    Dim Maxwert As Integer
    Dim Minwert As Integer
    Dim Differenz As Integer
    Dim Abstand As Integer
    Dim Differenz5 As Integer
    Dim Abstand5 As Integer
    Dim Temperatur As Integer
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    
    Do
       Ist = -1
    
          Do
             Minwert = Lookup(ist , Dta)
             Volt = Getadc(0)
             Incr Ist
             Maxwert = Lookup(ist , Dta)
          Loop Until Volt <= Maxwert
    
       Tempwert = Ist * 5
       Tempwert = 20 + Tempwert
       Differenz = Maxwert - Minwert
       Abstand = Maxwert - Volt
       Differenz5 = Differenz / 5
       Abstand5 = Abstand / Differenz5
       Temperatur = Tempwert - Abstand5
       Print "                  Zähler: " ; Ist
       Print "    Temperatur Grundwert: " ; Tempwert
       Print "            Analogsignal: " ; Volt
       Print "             Maximalwert: " ; Maxwert
       Print "             Minimalwert: " ; Minwert
       Print "               Differenz: " ; Differenz
       Print "     Abstand zum Maximum: " ; Abstand
       Print "        Differenz durch5: " ; Differenz5
       Print " Abstand durch differen5: " ; Abstand5
       Print "           Isttemperatur: " ; Temperatur
       Print
       Wait 2
    Loop
    End
    
    Dta:
    Data 515% , 567% , 616% , 662% , 705% , 744% , 779% , 811% , 838% , 862% , 882% , 900% , 916% , 929% , 941% , 951% , 959% , 966% , 973% , 978% , 983% ,

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ich hab das jetzt nur überflogen.

    Ist schon wesentlich kürzer und wenn die Routine läuft kann man da noch ne Variable einsparen.

    Die Formel scheint soweit ok aber ich meine das bei den beiden letzten Zeilen vor den Prints noch irgendwas nicht stimmt aber da kann ich auch irren.
    Ich muß das Heut nachmittag mal Exemplarisch durchrechnen bevor ich da was zu sage.
    Gruß
    Ratber

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    So habe nochmals weiter gemacht.
    Habe die Berechnung jetzt in ein Sub gepackt.
    Somit kann ich jetzt relativ einfach mehrere Fühler abfragen.

    Habe es einfach mal mit 4 Fühlern gemacht.

    Alle Werte berechnet und auf ein LCD geschrieben und 17% Ausgenutzt.
    Ich denke das geht jetzt so, oder??
    Oder was könnte man noch optimieren.

    Was ich jetzt noch machen wollte ist das ich vor dem Aufruf des Sub Berechnung vorgeben kann welchen wert er nimmt. Also es werden unten 10 verschiedene Data Zeilen kommen. Und da soll halt der richtige gewählt werden. Kann ich bei Lookup auch eine Variable angeben.
    Also anstatt dta die variable und vor dem Sub Berechnung dann einfach sagen Variable = DTA2 oder DTA3 usw usw

    So das war erst mal wieder genug für heute.

    Hänge den code nochmal an.

    Ciao
    und schönes Wochenende noch euch allen.



    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    
    
    Dim Adcwert As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
    Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
    Dim Tempwert As Byte , Maxwert As Integer , Minwert As Integer , Differenz As Integer
    Dim Abstand As Integer , Temperatur As Integer
    
    Declare Sub Berechnung
    Declare Sub Ausser_bereich
    
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    Cursor Off
    
    Do
    Cls
        Volt1 = Getadc(0)
        Volt2 = Getadc(1)
        Volt3 = Getadc(2)
        Volt4 = Getadc(3)
        Adcwert = Volt1
    '    Adcwert = 400
        Berechnung
        Locate 1 , 1
        Lcd "1: " ; Temperatur
    '   Adcwert = Volt2
        Adcwert = 400
        Berechnung
        Locate 1 , 10
        Lcd "2: " ; Temperatur
    '    Adcwert = Volt3
        Adcwert = 500
        Berechnung
        Locate 2 , 1
        Lcd "3: " ; Temperatur
    '    Adcwert = Volt4
        Adcwert = 600
        Berechnung
        Locate 2 , 10
        Lcd "4: " ; Temperatur
        Waitms 500
    Loop
    End
    
    
    Sub Berechnung
       If Adcwert > 945 Then Goto Ende1
       If Adcwert < 179 Then Goto Ende1
       Ist = -1
       Do
          Minwert = Lookup(ist , Dta)
          Incr Ist
          Maxwert = Lookup(ist , Dta)
       Loop Until Adcwert <= Maxwert
       Tempwert = Ist * 5                                       ' Brechnung welche Temperaturgrundwert gerade gewählt ist
       Differenz = Maxwert - Minwert                            ' Differenz zwischen Maxwert und Minwert
       Abstand = Maxwert - Adcwert                              ' Abstand zwischen Grundwert zum Istwert
       Differenz = Differenz / 5                                ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
       Abstand = Abstand / Differenz                            ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
       Temperatur = Tempwert - Abstand                          ' Aktuelle Temperatur Errechnung
    Ende1:
    End Sub
    
    
    
    '----------------Datenzeile für 1000Ohm Vorwiderstand--------------------
    'Dta:
    'Data 305% , 356% , 409% , 462%, 515% , 567% , 616% , 662% , 705% , 744% , 779% , 811% , 838% , 862% , 882% , 900% , 916% , 929% , 941% , 951% , 959% , 966% , 973% , 978% , 983% ,
    
    
    '----------------Datenzeile für 500 Ohm Vorwiderstand--------------------
    Dta:
    Data 179% , 215% , 255% , 299% , 344% , 392% , 440% , 489% , 538% , 584% , 629% , 671% , 709% , 744% , 775% , 803% , 828% , 850% , 870% , 887% , 902% , 915% , 926% , 936% , 945%,
    Edit:
    Ach ja und was noch fehlt ist die Abfrage wenn er kleiner als 0°C oder größer as 120°C ist, damit er dann den Wert LO oder Hi ausgibt, aber das wird ja wohl das kleinste übel sein

  5. #25
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Zu Lo/Hi :

    Da kannste draus machen was dir gefällt und was Sinvoll ist.

    Ich zb. gehe bei den Werten in einer Tempgesteuerten Lüftersteuerung davon aus das entweder der Fühler ab/Kurzgeschlossen ist oder die Temperaturen wirklich ausserhalb des zugelassenen Bereichs ist.

    Ergo gehe ich auf Nummer Sicher und Schalte die Lüfter auf 100% und gebe Alarm (LED,Summer,Schaltausgang usw. je nach vorhandenen Möglichkeiten)



    Zu Optimieren:


    Das ergibt sich wenn der Speicher wieder knapp wird.
    Da kannste dann sehen was man vereinfachen kann auch wenn es unüpbersichtlicher wird.
    Wart erstmal ab.



    Zu verschiedene Labels.

    Gute Frage,hab ich so noch nicht probiert aber vieleicht läst sich da was mit Alias machen.

    Ansonsten kannste die Datazeilen auch einfach ins EEProm schieben.
    Das bringt wieder mehr Platz und was im EEprom steht hat eine Adresse.
    Die Adrresse ist eine Zahl und damit kannste wieder was im Programm anfangen.

    Zb. indem du für die entsprechende Tabelle einen Offset(Tabellenstart) vorgibst.
    Das ist zwar ne Zählervariable mehr aber recht praktisch.
    Gruß
    Ratber

  6. #26
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    OK, mit dem Hi/LO werde ich mich nochmal beschäftigen, sollte aber das kleinste Problem darstellen.

    Und mit den Labels werde ich nochmal testen ob und wie es geht.

    Danke nochmal für die Hilfe.

    Hab da noch ein paar Fragen die aber sehr in eine andere Richtung laufen. Werde dazu einen neuen Thread aufmachen.

    Ciao Marco

  7. #27
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Yo,kein Problem
    Gruß
    Ratber

  8. #28
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    Da ich ja im Momnt Probleme mit dem Programm für den Attiny habe habe ich mich nochmal mit dem Temperaturmessprogramm beschäftigt.

    Es wird jetzt auch ein Druckgeber ausgewertet.

    Klappt auch soweit ganz gut, mal abgesehen davon das das wieder echzt Speicherfressend ist. Ich musste mit Kommazahlen rechnen, und das wird das Problem sein, oder?

    Werde mich da nachher mal mit beschäftignen das ich die Kommas raus bekomme

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    
    
    Dim Adctemp As Integer , Adcdruck As Integer , Volt1 As Integer , Volt2 As Integer , Volt3 As Integer , Volt4 As Integer
    Dim Ist As Integer , Ist2 As Integer , Istwert As Integer
    Dim Tempwert As Single , Maxwert As Integer , Minwert As Integer , Differenz As Single
    Dim Abstand As Single , Temperatur As Integer , Istdruck As Single
    
    
    Declare Sub Temp
    Declare Sub Druck
    Declare Sub Ausser_bereich
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Cursor Off
    
    Do
    Cls
        Volt1 = Getadc(0)
        Volt2 = Getadc(1)
        Volt3 = Getadc(2)
        Volt4 = Getadc(3)
    
    
    '    Adctemp = Volt1
        Adctemp = 887
        Temp
        Locate 1 , 1
        Lcd "1: " ; Temperatur
    '    Print "           Isttemperatur1: " ; Temperatur
    '    Print
    
    
    '   Adctemp = Volt2
        Adctemp = 400
    '    Temp Alias Temp2
        Temp
        Locate 1 , 10
        Lcd "2: " ; Temperatur
    '    Print "           Isttemperatur2: " ; Temperatur
    '    Print
    
    
    '    Adcwert = Volt3
        Adcdruck = 325
        Druck
        Locate 2 , 1
        Lcd "3: " ; Istdruck
    '    Print "           Isttemperatur3: " ; Istdruck
    '    Print
    
    
    '    Adcwert = Volt4
    '    Adcwert = 600
    '    Berechnung
    '    Locate 2 , 10
    '    Lcd "4: " ; Temperatur
    '    Print "           Isttemperatur4: " ; Temperatur
    '    Print "---------------------------------------------------------"
        Waitms 500
    Loop
    End
    
    
    Sub Temp
       If Adctemp > 945 Then Goto Endetemp
       If Adctemp < 179 Then Goto Endetemp
       Ist = -1
       Do
          Minwert = Lookup(ist , Tempwerte)
          Incr Ist
          Maxwert = Lookup(ist , Tempwerte)
       Loop Until Adctemp <= Maxwert
       Tempwert = Ist * 5                                       ' Brechnung welche Temperaturgrundwert gerade gewählt ist
       Differenz = Maxwert - Minwert                            ' Differenz zwischen Maxwert und Minwert
       Abstand = Maxwert - Adctemp                              ' Abstand zwischen Grundwert zum Istwert
       Differenz = Differenz / 5                                ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
       Abstand = Abstand / Differenz                            ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
       Temperatur = Tempwert - Abstand                          ' Aktuelle Temperatur Errechnung
    Endetemp:
    End Sub
    
    Sub Druck
       If Adcdruck > 945 Then Goto Endedruck
       If Adcdruck < 179 Then Goto Endedruck
       Ist = -1
       Do
          Minwert = Lookup(ist , Druckwerte)
          Incr Ist
          Maxwert = Lookup(ist , Druckwerte)
       Loop Until Adcdruck <= Maxwert
       Tempwert = Ist * 50                                      ' Brechnung welche Temperaturgrundwert gerade gewählt ist
       Tempwert = Tempwert / 100
       Differenz = Maxwert - Minwert                            ' Differenz zwischen Maxwert und Minwert
       Abstand = Maxwert - Adcdruck                             ' Abstand zwischen Grundwert zum Istwert
       Differenz = Differenz / 5                                ' Differenz durch 5 Teilen um die Analogwertänderung pro 1°C zu erhalten
       Abstand = Abstand / Differenz                            ' Abstand durch Differenz teilen um auf den Wert zu kommen der vom Grundwert abgezogen wird
       Abstand = Abstand / 10
       Istdruck = Tempwert - Abstand                            ' Aktuelle Temperatur Errechnung
       Endedruck:
    End Sub
    
    
    
    
    ' - - - - - - - - - - - - - - - -Datenzeile Temperatursensor mit 500Ohm Vorwiderstand - - - - - - - - - - - - - - - - - - - -
    Tempwerte:
    Data 179% , 215% , 255% , 299% , 344% , 392% , 440% , 489% , 538% , 584% , 629% , 671% , 709% , 744% , 775% , 803% , 828% , 850% , 870% , 887% , 902% , 915% , 926% , 936% , 945%,
    
    ' - - - - - - - - - - - - - - - -Datenzeile Drucksensor mit 20mA Konstantstromquelle - - - - - - - - - - - - - - - - - - - -
    Druckwerte:
    Data 42% , 86% , 128% , 170% , 211% , 251% , 291% , 329% , 367% , 404% , 440% , 475% , 509% , 543% , 575% , 607% , 638% , 668% , 697% , 726% , 753%

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ja, Single bzw. Double sind wahre Speicherfresser und sollten nur wenn nötig verwendet werden.

    Wenn es nur um max 3 Stellen hinterm Komma geht dann kannste lieber mit Word oder Long arbeiten und die zu bearbeitenden Zahlen einfach vorher Multiplizieren.

    Also statt 23/5 dann 230/50 bzw. 2300/500
    So kommste ohne Flieskommas aus,der Fehler bleibt erträglich und du sparst reichlich platz.
    Gruß
    Ratber

  10. #30
    Benutzer Stammmitglied
    Registriert seit
    15.01.2006
    Beiträge
    80
    OK, das werde ich dann jetzt mal testen.

    Danke schonmal.

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress