Forum: Mikrocontroller und Digitale Elektronik Lüfterregelung Bascom


von Migelito (Gast)


Lesenswert?

Hallo miteinander,
ich möchte gern ein Lüfter nach einer Temperatur regeln, habe da etwas 
über Bascom schon probiert, aber ich komme da nicht weiter.

Auf mein Testboard läuft die Diode von dunkel nach hell, wen die 
Temperatur noch unterschritten ist wen sie drüber kommt, verhält sich 
die die Diode genau entgegengesetzt, so sollte fast sein nur das die PWM 
nicht direkt von 0 anfängt.

Alles in einen, es sollte ein Lüfter oder ein Lötkolben immer die 
gleiche  Drehzahl bzw Temperatur halten, abhängig von der Temperatur, 
wie funktioniert es richtig, kann mir jemand weiter helfen ?

gruß Migelito

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 12
$framesize = 24

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls

Dim Tempsensor1(2) As Byte
Dim Ar1(9) As Byte
Dim Temp1 As Single
Dim Temp2 As Single
Dim Tmp1 As Byte
Dim T1 As Integer
Dim T2 As Integer
Dim Sign As Byte
Dim Solltemp As Word
Dim Isttemp As Word

Dim Temperatur As String * 3
Dim Temp As String * 3

Config 1wire = Portc.5
Tempsensor1(1) = 1wsearchfirst()

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 
256
Enable Timer1
Enable Interrupts

Solltemp = 30


Do

   Gosub Digital

  Locate 1 , 1 : Lcd Fusing(temp1 , "##.#")

   Isttemp = Temp1

  If Isttemp < Solltemp Then
     Pwm1a = Pwm1a + 10
    End If

    If Isttemp > Solltemp Then
    Pwm1a = Pwm1a - 10
    End If

    'If Isttemp > 255 Then Isttemp = 255

Loop
End



Digital:
   1wreset

  1wwrite &HCC
  1wwrite &H44

  Waitms 200


  1wreset
  1wwrite &HCC
  1wwrite &HBE

 Ar1(1) = 1wread(9)
   'Ar1(1) = &H92
   'Ar1(2) = &HFF
   Sign = 1

       If Ar1(2) = &HFF Then Sign = 0
       Tmp1 = Ar1(1) And 1
       If Tmp1 = 1 Then Decr Ar1(1)

       T1 = Makeint(ar1(1) , Ar1(2))
       T1 = T1 * 50
       T1 = T1 - 25
       T2 = Ar1(8) - Ar1(7)
       T2 = T2 * 100
       T2 = T2 / Ar1(8)
       T1 = T1 + T2
       T1 = T1 / 10
       Temp1 = T1 / 10


Return

von Karl H. (kbuchegg)


Lesenswert?

Migelito schrieb:

> wie funktioniert es richtig, kann mir jemand weiter helfen ?

>   If Isttemp < Solltemp Then
>      Pwm1a = Pwm1a + 10
>     End If


Du versuchst einen 2 Punkt Regler zu bauen. Das ist schon ok.
Nur: Deine Ist Temperatur kann natürlich nicht so schnell erhöht werden. 
Das Heizelement braucht ja auch Zeit. Deine PWM wird also hochlaufen.
Aber: Sie kann nicht beliebig hochlaufen! Du hast eine Obergrenze, die 
du nicht überschreiten darfst, weil dein PWM Wert einfach nicht weiter 
hoch gehen kann.
Nur berücksichtigst du das hier nicht. Wenn es nach dir geht, könnte der 
PWM Wert auch auf 2 Millionen hochlaufen oder auf 5 Millionen!
Das Problem:
Als 16 Bit Wert kann Pwm1a diese Werte gar nicht annehmen. Bei 65535 ist 
Schluss. Wenn deine Regelung daher versucht, bei einem PWM Wert von 
65530 noch einmal um 10 Einheiten zu erhöhen, dann lautet das Ergebnis 
nicht 65540, sondern 5, weil die Berechnung übergelaufen ist. Ehe du 
also noch einmal 10 auf den PWM Wert draufschlägst, musst du prüfen ob 
das überhaupt möglich ist.

Selbiges natürlich auch in der anderen Richtung.

von Migelito (Gast)


Lesenswert?

Ahhh, alle klar, habe verstanden, habe es nun so gelöst und es 
funtioniert.

 Gosub Digital

  Locate 1 , 1 : Lcd Fusing(temp1 , "##.#")

   Isttemp = Temp1

    If Isttemp < Solltemp Then
     Pwm1a = Pwm1a + 5
     If Pwm1a > 250 Then Pwm1a = 250
      End If

    If Isttemp > Solltemp Then
     Pwm1a = Pwm1a - 5
     If Pwm1a < 10 Then Pwm1a = 10
      End If

   Locate 2 , 10 : Lcd Pwm1a

Danke

gruß Migelito

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.