Hi,
oben hast du Timer1, unten Timer0.
Außerdem sehe ich nicht, wo du den Wert von Rate abänderst.
Gruß
Rolf
Hi,
ich habe mir eine kleine Lüftersteuerung mit einem Mega8 gebastelt. Der Lüfter wird über einen FET, dessen Gate an Pin 28 des Megas hängt. Ein - und Ausschalten ist überhaupt kein Problem. Der Lüfter soll aber auch in seiner Drehzahl geregelt werden können. Da dies an diesem Port nur per Software möglich ist, und die Hardware PWM - Pins bereits belegt sind, wollte ich das mit Basom so machen:
Code:'-------------------------------------------------------------------------------------' 'nessesary definitons: ' '-------------------------------------------------------------------------------------' $regfile = "m8def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 $crystal = 16000000 $baud = 9600 Config Portc.5 = Output Config Timer1 = Timer , Prescale = 1 On Timer1 Pwm Enable Timer1 Start Timer1 Enable Interrupts '-------------------------------------------------------------------------------------' 'dimensioned variables: ' '-------------------------------------------------------------------------------------' Dim Rate As Long Dim Ratemin As Integer Dim Ratemax As Integer 'Ratemin = 330 'minimum PWM - rate 'Ratemax = 1500 'maximum PWM - rate Do Rate = 0 Loop '-------------------------------------------------------------------------------------' 'sub routine for generating PWM signal ' '-------------------------------------------------------------------------------------' Pwm: Toggle Portc.5 Waitus 1 Timer0 = Rate Return
Die Idee dahinter ist folgende: wenn der Rate-Wert (also die gewünschte Drehzahl des Lüfters, die Länge des High-Impulses) kleiner ist, wird dem Timer ein kleiner Startwert mitgegeben, folglich braucht er länger, bis er überläuft und somit ist die Länge des Pulses eine größere.
Allerdings merke ich überhaupt keinen Unterschied in der Drehzahl meines Lüfters, bzw. in der Helligkeit einer LED, die ich zur Kontrolle ebenfalls am gleichen Port angeschlossen habe.
Wird der Prescaler auf 8 gesetzt, blinkt die LED merklich im Abstand von einigen ms, aber auch hier ist kein Unterschied in der Frequenz merkbar, wenn der Wert für Rate verändert wird.
Habt ihr eine Lösung für dieses Verhalten?
Viele Grüße
ikarus_177
Hi,
oben hast du Timer1, unten Timer0.
Außerdem sehe ich nicht, wo du den Wert von Rate abänderst.
Gruß
Rolf
Hi for_ro,
danke für den Tipp!
Ich habs jetzt umgeändert, der Motor summt jetzt, und zwar je höher, je größer der Wert für Rate ist, er läuft aber nicht von selbst an...
Den Wert von Rate habe ich einfach im Hauptprogramm umgeändert, und danach den Chip neu geflasht.
Grüße
ikarus_177
ich glaube du hast nen denkfehler in der programmlogik. (oder ich hab es noch nicht verstanden).
timer0 kommt
du wechselst den zustand von portc.5
timerwert setzt du auf rate
timer0 kommt
du wechselst den zustand von portc.5
timerwert setzt du auf rate
usw.
das bedeutet aber wenn du z.B. rate so wählst das der timer alle 100ms kommt (ich sag jetzt einfach nen wert) dann ist portc.5 100ms high und danach 100ms low. wählst du rate 50ms dann ist es genauso, portc.5 ist für 50ms high und danach für 50ms low. also immer für dieselbe zeit.
das ist ja aber kein pwm, deswegen wird der auch nicht anlaufen. du musst ja das verhältnis ändern zwischen der zeit high und der zeit low. ist er mehr low wie high läuft er langsamer, ist er mehr high als low dann läuft er schneller.
ich hoffe ist verständlich.
gruss Christian
Hi Christian,
ja, so war das eigentlich auch konzipiert...
Also kann man das theoretisch so programmieren: Ich hab zum Beispiel ein Tastverhältnis von 30% (heißt ja, 30% der Zeit ist er auf High?) und ein gesamter Impuls (High plus Low - Zeit) ist sagen wir mal Hausnummer 100 ms. Ich setzte also den Port auf High. Dann könnte ich den Timer so einstellen, dass er nach 30ms einen Interrupt auslöst, der mir den Port auf Low wechselt. Danach wird der Timer so eingestellt, dass der Interrupt erst nach 70 ms ausgelöst wird, dieser setzt den Port dann wieder auf High und so weiter...
Würde das so hinhauen?
Danke für die Hilfe
ikarus_177
das würde so hinhauen, entspricht aber nicht dem was du geschrieben hast. bei dir ist immer 50% / 50%, egal wie du rate wählst.
ich hab meine softwarepwm so geschrieben gehabt:
die Pwmroutine entspricht dem Aufruf durch den Timer.Code:Pwmroutine: If Pwmverhaeltnis > Pwmwert Then Portc.5 = 1 Else Portc.5 = 0 End If Incr Pwmwert If Pwmwert > 255 Then Pwmwert = 0 Return
Das PWM-Verhältnis ist eine zahl zwischen 0 und 256.
pwmwert ist eine zahl die in der routine immer von 0 bis 255 steigt und dann wieder 0 ist.
ist das pwmverhältnis jetzt 100 dann wird bei 100 aufrufen der ausgang 1 und bei den restlichen 0. durch die zahl änderst du dann das verhältnis, 0 ist immer aus, 256 ist immer an und halt die stufen dazwischen.
wenn du mehr als 255 stufen brauchst musst du nur den wertebereich anpassen.
gruss Christian
Lesezeichen