PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Software - PWM



ikarus_177
23.07.2008, 11:40
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:


'-------------------------------------------------------------------------------------'
'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

for_ro
23.07.2008, 11:54
Hi,
oben hast du Timer1, unten Timer0.
Außerdem sehe ich nicht, wo du den Wert von Rate abänderst.

Gruß

Rolf

ikarus_177
23.07.2008, 12:32
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

goof1980
23.07.2008, 14:31
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

ikarus_177
23.07.2008, 14:40
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

goof1980
23.07.2008, 14:55
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:


Pwmroutine:
If Pwmverhaeltnis > Pwmwert Then
Portc.5 = 1
Else
Portc.5 = 0
End If
Incr Pwmwert
If Pwmwert > 255 Then Pwmwert = 0
Return


die Pwmroutine entspricht dem Aufruf durch den Timer.
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