- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 6 von 6

Thema: Software - PWM

  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601

    Software - PWM

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hi,
    oben hast du Timer1, unten Timer0.
    Außerdem sehe ich nicht, wo du den Wert von Rate abänderst.

    Gruß

    Rolf

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    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

  4. #4
    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

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von ikarus_177
    Registriert seit
    31.12.2007
    Ort
    Grein
    Alter
    31
    Beiträge
    601
    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

  6. #6
    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:
    Code:
    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

Berechtigungen

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

LiFePO4 Speicher Test