[Bascom] PI Regelung

mh irgendwie ging eben gar nichts mehr :D
wie kann ich die vielen lokalen variablen sparen ? soll ich sie alle global machen?

So hab die Kri, Krp, und T mal global gemacht, bekomme jetzt nen wert von 1125 ausgespuckt :D

nochmal gefragt, wenn ich die variablen vor der eigentlich funktion definiere, muss ich dan die werte übermitteln beim funktionsaufruf, oder nimmt sich die funktion die "einfach ausem code"? bei PHP und (wahrscheinlich auch) C, ists ja so das ich alle variabeln mitübergeben muss, oder ich definiere sie in der funktion,.
 
nochmal gefragt, wenn ich die variablen vor der eigentlich funktion definiere, muss ich dan die werte übermitteln beim funktionsaufruf, oder nimmt sich die funktion die "einfach ausem code"? bei PHP und (wahrscheinlich auch) C, ists ja so das ich alle variabeln mitübergeben muss, oder ich definiere sie in der funktion,.
Wenn die Variablen außerhalb definiert sind, dann werden sie als global angesehen und dann kannst sie von überall lesen und schreiben.

HBA
 
so habs nochma ausprobiert und festgestellt das ich in der funktion den istwert nicht nochmal definieren darf!
allerdings ist da nochn fehler drin,
den ich zum verrecken nicht find, es heisst ja

bekomme aber sowas ausgegeben?(z.B.)
Code:
Regeldifferenz = Sollwert - Istwert [I](25-30.1257)[/I]
'P-Anteil
Tmp_p = Regeldifferenz * Krp [I](-5.1257*2)[/I]
Pverstellung = Tmp_p
Pverstellung: [B]50-32718.0[/B]

anstatt das ergbnis der subtraction

die P verstellung ohne I anteil funzt ja ohne probleme, allerdings diese merkwürde anzeige -1-1.0 z.B. stört mich aber ,.
erhöht sich die Temp, erhöht sich der Pwert, wird es kälter verringert er sich auch dem entsprechend.

Pverstellung, Iverstelllung, Temp
-3,0,23.25
-3,0,23.25
-3,0,23.25
-3,0,23.25
-3,0,23.3125
-3,0,23.3125
-3,0,23.4375
-3,0,23.5
-2,0,23.5625
-2,0,23.75
-2,0,23.9375
-1,0,24.0625
-1,0,24.25
-1,0,24.375
-1,0,24.5
0,0,24.6875
0,0,24.8125
0,0,24.9375
0,0,25.0625
0,0,25.25
0,0,25.375
1,0,25.5
1,0,25.5625
1,0,25.625
1,0,25.75
1,0,25.8125
1,0,25.9375
2,0,26.0625
2,0,26.125
2,0,26.1875
2,0,26.3125
2,0,26.375
3,0,26.6875
3,0,26.9375
5,0,27.6875
6,0,28.1875
7,0,28.625
8,0,29.0
8,0,29.25
8,0,29.4375
9,0,29.5625
9,0,29.75
9,0,29.8125
9,0,29.9375
10,0,30.0
10,0,30.125
10,0,30.125
10,0,30.1875
10,0,30.1875
10,0,30.125
9,0,29.5625
8,0,29.25
7,0,28.9375
7,0,28.6875
6,0,28.4375
6,0,28.1875
6,0,28.0
5,0,27.8125

mit Iverstellung =1
-2,-1,23.5625
-2,-2,23.625
-2,-3,23.6875
-2,-4,23.6875
-2,-5,23.75
-2,-6,23.75
-2,-7,23.8125
-2,-8,23.8125
-2,-9,23.875
-2,-10,23.875
-2,-11,23.875
-2,-12,23.875
-2,-13,23.9375
-2,-14,24.0
-1,-14,24.125
0,-14,24.5625
0,-14,24.9375
0,-14,25.3125
1,-14,25.6875
2,-13,26.125
3,-12,26.5
3,-11,26.9375
4,-9,27.375
5,-7,27.8125
6,-4,28.1875
7,3,28.5625
7,6,28.9375
8,10,29.25
9,14,29.625
9,18,29.875
10,23,30.125
10,28,30.375
11,33,30.625
11,38,30.8125
11,43,30.6875
11,48,30.625
11,53,30.5625
10,58,30.4375
10,63,30.3125
10,68,30.1875
10,73,30.0
9,77,29.8125
9,81,29.6875
9,85,29.5
8,89,29.3125
8,93,29.125
8,97,29.0
7,100,28.8125
7,103,28.625
6,106,28.4375
6,109,28.3125
6,112,28.1875
6,115,28.0
5,117,27.875
5,119,27.6875
5,121,27.5
4,123,27.375
4,125,27.25
4,127,27.125
4,129,27.0
3,130,26.875
3,131,26.8125
3,132,26.6875
3,133,26.625
3,134,26.5
2,135,26.375
2,136,26.25
2,137,26.1875
2,138,26.0625
1,138,25.9375
1,138,25.9375
1,138,25.8125
1,138,25.75
1,138,25.625
1,138,25.5625
1,138,25.5
0,138,25.4375
0,138,25.375
0,138,25.3125
0,138,25.1875
0,138,25.1875
0,138,25.125
0,138,25.0625
0,138,25.0
0,138,24.9375
0,138,24.875
0,138,24.875
0,138,24.8125


hab den sensor an die heizung gehalten, und dann wieder weggenommen (lüftersimulation sozusagen),.
der I wert sollte doch normalerweise bei erreichen des Sollwertes 25° wieder bei 0 sein ? eigentlich wie der P wert
 
nochmal sehr dumm gefragt, kanns sein das mein I positiver wird umso kälter meine Temp wird?
ich bräuchte es eigentlich das es umso wärmer es wird, umso hoher mein wert ist, da ich ja ne PWM, bzw meine lüfter regeln möchte,.
 
so habs glaube ich hinbekommen, musste etwas an den werten feilen
naja kann mir jemand sagen, wie ich eine anweisung widerholen kann ?
der temp lese ablauf ist ja bei beiden sensoren gleich, allerdings sind es nicht die selben sensoren, um code zu sprane wollte ich also eine schleife machen welche zumindest diesen teil
Code:
 1wreset                                                  ' Initialisierung
   1wwrite &HCC                                             ' überspringe ROM-Befehl
   1wwrite &H44                                             ' Temperaturmessung anstoßen
   Wait 1                                                   ' warten bis Messung fertig
   1wreset                                                  ' Initialisierung
   1wverify Sensor2(1)                                      ' sensor mit bestimmter id ansprechen
   1wwrite &HBE                                             ' Temperatur auslesen
   Scratch(1) = 1wread(9)                                   'scratchpad auslesen
   1wwrite &H22                                             'befehl zum familycode anfordern
   Family(1) = 1wread(1)
   Temp = Scratch(2)                                        'MSB holen
   Shift Temp , Left , 8                                    'Platz für LSB machen
   Temp = Temp + Scratch(1)                                 'zu Word Format zusammenfügen
   Temp1 = Temp

aufruft, dann müsste der ablauf so aussehen
do
Codeoben
tempverarbeitung Sensor1
Family Code des Sensors &H22 = 34
codeoben
tempverarbeitung sensor 2
Family Code des Sensors &H10 = 16
loop
 
so hab jetzt meinen reglercode fertig, allerdings hab ich nochn problem,
der lüfter geht bei Stellgröße =0 nicht aus,.
auch nicht bei 255, als würde die Pwm nicht richtig funktionieren,
Code:
'HEADER##########################################
$regfile = "m8def.dat"                                      'Chip
$baud = 9600                                                'Baud für RS232
$crystal = 8000000                                          'Quarz auf 8mhz eingestellt
$hwstack = 32                                               'Standardwert 32 für hardware stack
$swstack = 10                                               'Standardwert 10 für the SW stack
$framesize = 40                                             'Standardwert 40 für the frame space
'Ein/Ausgänge configurieren
Config 1wire = Portd.2                                      '1-Wire Pins Configurieren
Config Portb.1 = Output                                     'PWM Out1
Config Portb.2 = Output                                     'PWM Out2

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
'Declarationen
Declare Function Piregler(byval Istwert As Single) As Single
'Variablen Config
Dim Scratch(9) As Byte
Dim Temp As Word
Dim Temp1 As Integer
Dim Ist_temp1 As Single
Dim Ist_temp2 As Single
Dim Sensor1(8) As Byte                                      'Gehäusetemp
Dim Sensor2(8) As Byte                                      'Kühlertemp
Dim Test As Single
Dim Test2 As Single
Dim Test3 As Single
Dim I As Byte                                               'zählervariable bis 255
'####
Dim Sollwert As Single                                      'Sollwert
Dim Regelgroesse As Single
Dim Kri As Integer
Dim Krp As Integer
Dim T As Byte
      T = 1
      Kri = 1
      Krp = 5                                               '40
      Sollwert = 25                                         'Sollwert auf 30°C setzen

Do
   Enable Timer1
   Start Timer1                                            'Beginn Der Hauptschleife
'sonstige Ausgaben
   Test = Piregler(ist_temp2)
   Test3 = Piregler(ist_temp2)
   Print Test
   Print Test3
   Pwm1a = Test
   Pwm1b = Test3
Loop
End

'PI-Regeler#########################################
Function Piregler(byval Istwert As Single) As Single
      Local Regeldifferenz As Single                        'Regeldifferenz
      Local Pverstellung As Integer
      Local Iverstellung As Integer
      Local Tmp_i As Integer
      Local Tmp_i2 As Integer
      Local I_alt As Integer
      Regeldifferenz = Istwert - Sollwert

      'P-Anteil
      Pverstellung = Regeldifferenz * Krp
      If Pverstellung < 0 Then Pverstellung = 0
      If Pverstellung > 255 Then Pverstellung = 255

      'I Anteil
      Tmp_i = Regeldifferenz * Kri
      Tmp_i2 = Tmp_i                                        '/ T
      Iverstellung = Tmp_i2 + I_alt
      I_alt = Iverstellung
      If Istwert < Sollwert Then Iverstellung = 0
      If Iverstellung < 0 Then Iverstellung = 0
      If Iverstellung > 255 Then Iverstellung = 255

      'Ergebnis
      Test2 = Iverstellung + Pverstellung
      If Test2 < 0 Then Test2 = 0
      If Test2 > 255 Then Test2 = 255

      Print "Stellgroesse: " ; Test2 ; " | Temp: " ; Istwert ; " | P: " ; Pverstellung ; " | I: " ; Iverstellung ;
      Print

      Piregler = Test2                                      'entspricht der regelgröße
End Function

ich hatt vorhin mal manuell die werte 125 zugewisen da hatte ich ne "steuerspannung" von 2,5V
das wäre ja richtig,
bekomme aber nen konstatne Wert von 5,06V ausgegeben!
 
also mit diesem scheiss PWM hab ich echt probleme,
kann die spannung irgendwie garnich richtig steuern,.
kanns sein das mein schaltplan falsch is ?
 
mhhh, warum gehts dann nich? es wird immer5V an den PWm ausgängen ausgegeben,.
da ändert sich auchnix, und der mosfet schaltet auch immer 10-11V durch,.

wenn ich jetzt den wert 128 vorgebe hab ich ne pwm spannung von 2,5V,
also ok
kanns sein das ich einfach keinen single wert der pwm1a zuweisen kann ?

also mit ner umwandlung in das Byte format scheint es zu gehen, musste noch clear down machen anstatt clear up, da es die spannung bei PWM wert0 auf 5V gesteuert hat, ich denke wenn ich noch leicht an den werten spiele wird es ganz gut sein
 
Hi Bonze,

mhhh, warum gehts dann nich? es wird immer5V an den PWm ausgängen ausgegeben,.
da ändert sich auchnix, und der mosfet schaltet auch immer 10-11V durch,.
versteif dich bei PWM nicht auf dein Multimeter. Ne Digitalkiste kann dabei
ziemlichen Murks anzeigen. Für sowas sind die ganz billigen analogen
Zeiger-Multimeter besser geeignet ;) Oder noch besser nen Oszilloskop
(was aber leider nicht mehr so billig ist).

Wenn du es so aufgebaut hast wie im Schaltplan dann müßte das auch
laufen. vorausgesetzt, das Programm ist richtig.

Versuch doch erstmal mit nem Miniprogramm deine Hardware zu testen.
Laß den gesamten PWM-Kram weg und schalte die beiden Pins einfach
mal als IO-Ports ein und aus. Dann siehst du schon mal ob die MOSFETs
wirklich schalten und die Lüfter an und aus machen. Wenn das läuft dann
weißt du das die Hardware OK ist. Dann kann es nur noch das Programm
sein. Also bei Problemen immer erst mal eine von zwei Möglichkeiten
ausschließen. An zwei Baustellen gleichzeitig drehen bringt nix. ;)

Gruß
Dino
 
kanns sein das ich einfach keinen single wert der pwm1a zuweisen kann ?
Das geht sicher nicht. Einer Word-variablen wirst du das noch zuweisen können, aber nicht einem Register.
Du musst den Wert also in Word-Form zwischenspeichern.
Hast du an dem Ausgang eine Last hängen? Andernfalls wirst du mit einem hochohmigen Messgerät immer 5V messen, da die viel zu träge sind.

Edit: Ich sehe gerade, dass du PWM=8 benutzt hast. Dann kannst du wahrscheinlich auch in eine Byte Variable zwischenspeichern.

HBA
 
so, wollte eigentlich noch ne ALarm funktion einbauen, funzt aber nich so wie ich mirs vorgestellt hab ,.
Code:
Config Portc.5 = Output                                     'Piezo

Piezo Alias Portc.5
Dim Alarm As Single  
Alarm = 20
 If Ist_temp1 > Alarm Then
   Sound Piezo , Pulses , Periods                           'mach krach!
   Elseif Ist_temp2 > Alarm Then
   Sound Piezo , Pulses , Periods                           'mach krach!
   Else
   End If

temp bedingung ist natürlich erfüllt,.
funzt aber kein stück,.
 
mal was anderes kann ich irgendwie einfügen das falls 1 oder beide Sensoren ausfallen sollten, einfach die Lüfter auf dauerbetrieb laufen?
wie geht das?
Code:
if Err=1 
           Set PWM1=255
           Set PWM2=255
else 
           führe den normalen Code aus 
endif

geht nicht, denn falls 1 sensor abgezogen ist, bekomme ich trotzdem den wert von 2 grad angezeigt,. und er führt den normalen code weiterhin aus,. jemand ne idee?
müsste irgendwie prüfen bzw man kann dich die sensoren zählen oder?
 

Anhänge

  • pi-regler.jpg
    pi-regler.jpg
    46,6 KB · Aufrufe: 19
hab eh ein komisches verhaltenbeobachtet, manchmal gehtbder mega8 einbfach hin, piepst kurz über den piezo, und dann zeigt der über rs232 nurnoch 0;0;0;0 an also keine powm werte und keine 1wire temp werte mehr,.. er sendet aber fleissig weiter
 
Hallo,

manchmal geht der mega8 einbfach hin, piepst kurz über den piezo, und dann zeigt der über rs232 nur noch 0;0;0;0 an also keine powm werte und keine 1wire temp werte mehr,.. er sendet aber fleissig weiter
also auch hier noch dicke Probleme ... :eek:
Da ist ja dann bei einigen Baustellen (Threads) noch was zu tun :rolleyes:
So wird einem wenigstens nie langweilig :eek: :D

Gruß
Dino
 
jo schon komisch, naja so gehts aber wie ich will, bräuchte nurnoch ne kleine Überwachung bei Sensortausfall,.
den CRC fehler, das is nich so wichtig, ob da ne abweichung von 1°C is oder so,. nur sollt bei sensorausfall halt der PWM wert auf 255 steigen,. als schutzfunktion
 
hi,

nur sollt bei sensorausfall halt der PWM wert auf 255 steigen,. als schutzfunktion
Frag doch einfach so alle 10sec die Sensor-IDs ab (also die 64Bit-Kennung)
wenn nicht alle gelesen werden können weißt du das ein Sensor ausgefallen ist.
Wenn keine ID gelesen werden kann dann ist der gesamte Sensor-Bus weg.

Gruß
Dino
 
kann man nicht6 irgendwie
Code:
Sensor1(1) = 1wsearchfirst()                                'Suche nach erstem Gerät am Bus
   If Err = 0 Then                                          'Wenns ein Gerät am Bus gibt
      Do                                                    'Nach Weiterem Gerät Suchen
         Sensor2(1) = 1wsearchnext()                        'Bis es keine mehr gibt
      Loop Until Err = 1
   End If
    'Print Hex(sensor1(1))                                   'familycode sensor1 ausgeben
    'Print Hex(sensor2(1))
mit Anzahl_sensoren = 1wirecount()
die anzahl zählen der Sensoren am bus? funktionierte auf anhieb jedoch nich so wie ichs wollte,.


oder vielleicht so?
Code:
If 1wverify(scratch(1)) = True Then
    Sensorausfall = 1
End If

So hab jetzt nochma dran gearbeitet, hab allerdings jetzt das prob das er wahrscheinlich bei dem Wert iverstellung "überläuft", was ich nich verstehe da I ja auf 255 beschnitten wird,.

Code:
'Funktion PI-Regeler#########################################
Function Piregler(byval Istwert As Single , Channel As Word) As Byte
      Local Regeldifferenz As Single                        'Regeldifferenz
      Local Pverstellung As Integer
      Local Iverstellung As Integer
      Local Tmp_i As Integer
      Local Tmp_i2 As Integer
      Local I_alt As Integer

      'Regelbedingung
        Regeldifferenz = Istwert - Sollwert
        If Regeldifferenz > 0 Then

         'P-Anteil
           Pverstellung = Regeldifferenz * Krp
           If Pverstellung < 0 Then Pverstellung = 0
           If Pverstellung > 255 Then Pverstellung = 255

         'I Anteil
           Tmp_i = Regeldifferenz * Kri
           Tmp_i2 = Tmp_i                                      '/ T
           I_alt = Iverstellung
           [B]If Channel < 255 Then                               ' Integral wirkt erst im Regelbereich
              Iverstellung = Tmp_i2 + I_alt
           Else
              Iverstellung = Tmp_i2
           End If[/B]

           If Iverstellung < 0 Then Iverstellung = 0
           If Iverstellung > 255 Then Iverstellung = 255

           'Ergebnis
           Ausgabe = Iverstellung + Pverstellung
           If Ausgabe < 0 Then Ausgabe = 0
           If Ausgabe > 255 Then Ausgabe = 255

           Print "Regeldifferenz: " ; Regeldifferenz ; " | Temp: " ; Istwert ; " | P: " ; Pverstellung ; " | I: " ; Iverstellung ;
           Print
         Piregler = Ausgabe
      Else
         Ausgabe = 0
      End If                                                'entspricht der regelgröße
End Function

das blöde is auch, der I wert geht garnich mehr runter wenn er mal auf 255 war, weis auch ned was ich da gemacht hab,..
es ging schonmal so schön :(
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)