-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: PWM mit einstellbarer Frequenz (2313)

  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710

    PWM mit einstellbarer Frequenz (2313)

    Anzeige

    Hallo,

    habe einen Code geschrieben, bei dem man die Frequenz und Duty mit hilfe von timer1 einstellen kann. Jedoch funktioniert es nicht richtig. Kann mir vieleicht jemand sagen, wo mein Fehler liegt?

    Code:
    $regfile = "2313def.dat"
    $crystal = 10000000
    $baud = 9600
    
    
    Const True = 1
    Const False = 0
    
    Dim Hi As Single
    Dim Lo As Single
    Dim Freq As Word
    Dim Phase As Bit
    Dim Duty As Byte
    
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Timer1_isr
    
    Config Pinb.5 = Output
    
    Enable Timer1
    Enable Interrupts
    
    
    Do
        Input "Zeit [0-65535]" , Freq
        Input "Duty [0-100%]" , Duty
    
         Hi = Freq * 0.01
         Hi = Duty * Hi
         Hi = Int(hi)
         Lo = Freq - Hi
    
        Print "High: " ; Hi
        Print "Low:  " ; Lo
    Loop
    
    End
    
    Timer1_isr:
    
     If Phase = True Then
         Timer1 = Lo
         Phase = False
      Else
          Timer1 = Hi
          Phase = True
     End If
    
    Toggle Portb.5
    
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    So wird das auch nie gehen.
    wann springt der µC in der Timerinterrupt ?
    Wenn der Timer voll ist, nicht bei jedem Signaleingang !!!
    Da heit dein µC springt alle 6,6*10^3 sek in den interrupt und toggelt dein ausgang, egal was du in deinem Mainprogramm alles machst !!!
    Du hast an deinem ausgang eine konstankt Frequenz von 76,3 Hz.
    Stimmts ?

  3. #3
    Gast
    soll ja auch, wenn der timer voll ist in den interrupt springen. Aber warum kann ich mit meinem Mainprogramm das nich richtig beeinflussen?

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    ...war ich. Ich will mit dem Überlaufinterrupt die Frequenz steuern, die Ausgegeben werden soll. Die Cyclen Steuern, Hi und Low (für die PWM) werden aus der Eingabe des Verhältnis (in %) erechnet. Also, so habe ich es zumindest vor hinzubekommen.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    Also ich würde es so machen:
    Mit dem interrupt einen FESTE Zeit erstellen zum Beispiel alle 100µS ein interrupt. dann würde ich mit jedem interrupt eine Variable incrementieren, bis die einen bestimmten wert erreicht hat ( dieses kann man in Main festlegen ) und erst den den ausgang toggeln und dann alles auf null setzen ( timer und Variable )

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    wann springt der µC in der Timerinterrupt ?

    [...] egal was du in deinem Mainprogramm alles machst !!!
    Das versteh ich auch nicht ganz! Der Timer wird doch beim Sprung in die Routine wieder neu beladen.
    Wie kommst du auf: 6,6*10^3 sek? Warum springt der uC nur jede Stunde und 50 Minuten in den Interrupt, warum kommt dann aber eine Frequenz von 76 Hz raus?

    Was mir allerdings nicht gefällt ist das "toggle", schreibt lieber in den Code:

    If Phase = True Then
    ...
    Portb.5 = 0
    Else

    bzw. = 1

    Kannst du etwas genauer sagen, was nicht richtig funktioniert? Was passiert am Ausgang?

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    Verstehe ich jetzt nicht ganz...? Ähnlich einer For-Netx-Schalufe? Und wie bekomme ich dann ein variables Puls-Pausenverhältnis hin?

    Das mit dem Toggle hatte ich auch erst so wie beschrieben, brachte aber wenig.

    Also, wenn ich das Proggy laufen habe, kann ich zwar Zeiten des Timers einstellen, aber irgendwie nicht plausibel. Die Ausgangsfrequenz ist nie und nimmer das, was man sich errechnet hat (mit dem Tool von hier)

    Kann es sein das der Timer nur Variable im "Word"-Format frisst? Weil meine Variablen, die ich ihm gebe sind im "Single"-Format.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also ich finde die Idee in Ordnung! Schln wäre natürlich, wenn man die Frequenz nicht in [0-65535] sondern in Hz angeben könnte, wobei man natürlich an eine Grenze nach oben und unten stößt, kannst mal ausprobieren, wie weit der uC mitkommt.

    Belädt man ihn mit 0, dann entspreicht das: 10 Mio / 2^16 ~ 152 Hz
    Belädt man ihn mit 2^16: 10 Mio / 1 = 10 Mhz
    Wobei 10 Mhz illosorisch ist, da er die Routine nicht 2 mal in einem Zyklus durchlaufen kann. Wäre interessant rauszufinden, wie hoch er es schafft.
    50 Khz?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    Ihr das Code gerüst, ab jetzt darfst du mal ein bissele Wurschteln ( schwäb. )
    Code:
    $regfile = "2313def.dat"
    $crystal = 10000000
    Dim Zeit As Word , Varausmain As Word
    
    Config Portb = Output
    Config Timer1 = Timer , Prescale = 1
    Enable Interrupts
    On Timer1 Icnr
    Enable Timer1
    Timer1 = 64536                                              ' timervorgabe zum erzeugen von einer Pause mit 100µS
    
    Do
    ' MAIN
    Varausmain = 10
    loop
    
    
    Icnr:
    
    Incr Zeit
    
    If Zeit = Varausmain Then                                   ' wenn die Pause von 100µS x mal abgelaufen ist dann
    
     Toggle Portb.5                                             ' toggle portb.5
                                                ' setze auf ursprung zurück
     Zeit = 0
    
    End If
    Timer1 = 64536
    
    Return
    mach mal ne Simulation ( aber vorsicht, die läuft extrem langsam, nicht das du denkst die Frequenz ist zu langsam ( hat bei meiner Var eine Frequenz von 500 Hz )

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    470
    @ RCO
    sorry meinte 6,6 mal 10 hoch minus 3.

    wenn man bei einem Quarz mit 10Mhz die teilung auf 1 setzt, dann wird alle 65536 Clocks ( 6553.6 µS ) ein interrupt aufgerufen und der zustand des ausgangs wird verändert. D.h. eine periode dauert 2 X 6553.6 µS.
    Das entspricht einer Frequenz von 1/13107.2µS = 76,3 Hz
    So verstanden?

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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