Eine Software-PWM ist Deine Lösung.
Hast Du einen Timer, der regelmäßig läuft, die gesamte Zeit? Oder zumindest, während die Spannung anliegen soll? Dieser Timer könnte das dann nebenbei machen.
Guten Abend,
ich Suche für nachfolgendes Problem einen Lösungsansatz:
Für exerne Steueraufgaben an einem Mega32 habe ich nur noch ein Pin (PA7) frei. Dieser soll als Ausgang wahlweise eine Spannung von 2,0V / 2,2V und 2,4V annehmen. Die Spannung wird von einer angeschlossenen Hardware ausgewertet.
Die Ports für Timer sind bereits anderweitig belegt und lassen sich nur mit sehr großem Aufwand freilenken. Eine Hardware-PWM Steuerung ist somit wohl nicht mehr möglich. Ich Suche jetzt nach einer machbaren Lösung (Software PWM) unter BASCOM, um an diesem Pin die entsprechenden Steuersignale zu generiern.
Wer kann helfen ??
Frank
Eine Software-PWM ist Deine Lösung.
Hast Du einen Timer, der regelmäßig läuft, die gesamte Zeit? Oder zumindest, während die Spannung anliegen soll? Dieser Timer könnte das dann nebenbei machen.
Danke für die schnelle Rückinfo!
Ja, ich hätte den OC0 auf PB3 noch komplett frei; ich kann ihn nur hardwaremäßig nicht mehr beschalten. Es laufen auf dem Mega32 keine weiteren Timer! Würde dieser OC0 funktionieren und wenn ja, wie? Ich habe bei meinen Recherchen noch keine Variante einer Software-PWM gefunden.
Frak
Software-PWM ist sehr einfach.
Du lässt den Timer mit einer Frequenz Deiner PWM-Wahl laufen. 10kHz, oder 1kHz, aber viel weniger eher nicht.
Dann macht dieser Timer zuerst eine Hochzählung einer Variable.
Diese Variable muss beim Erreichen von 100 wieder auf 0 gesetzt werden.
Und unten drunter machst Du einfach sowas hier:
Das wars. Bei Verständnisproblemen einfach fragen.Code:if (PWM_SOLL_WERT > LAUFENDE_VARIABLE) then PORTB.3 = 0 else PORTB.3 = 1
Vorteil dieser Lösung ist, wenn die PWM auf 0 steht, dann geht der Port-Pin nie auf HIGH, d.h. 0.00V!
... sorry; Verständigungsproblem in Folge von ungenügendem Grundwissen meinerseits.
Also, sollte der OC0 pinzipiell gehen ?!?
Ich konfiguriere mir also einen Timer0 mit dem entsprechenden Takt, erzeuge mit dem Hochzählen eine PWM an meinem gewünschten Port und bestimme den Wert der Ausgangsspannung lediglich mit dem PWM_SOLL_WERT?
Könntest du bitte deinen Code noch um ein paar Zeilen erweitern?
Danke, Frank
Ich nehm mal an, Du meinst mit OC0 den Timer0. Es geht mit jedem Timer, aber eben nur in seiner Timer-Funktion, und nicht in seiner PWM-Funktion. Wir benutzen also die Hardware, um unsere Software-PWM darauf aufzubauen.
Anfangs stellen wir den Timer auf einen Wert ein, dass er uns 1000mal die Sekunde aufgerufen wird, das bedeutet 1kHz ( = 1000 Hz). Und in diesem Timer laufen wir dann nach und nach eine Variable ab. Diese Variable ist quasi unser Messstab. An diesem schauen wir dann jeden Timeraufruf nach, ob die PWM nun wieder in den AUS-Modus gehen muss, so dass die richtige Spannung herauskommt.
Frag ruhig alles, was Du wissen willst.
Übrigens: Ich bin kein BASCOM-Benutzer, daher weiß ich nicht, wie der Code genau lauten müsste.
Ich kann Dir also nur den Ablauf erklären und anhand von Pseudo-Code darstellen.
Und Deine Fragen:
- Timer0 mit dem Takt konfigurieren - genau!
- Das Hochzählen ist die Basis für die PWM - genau! Aber das hat noch nix mit einem Port zu tun.
- Den Wert der Ausgangsspannung bestimmst Du mit PWM_SOLL_WERT - genau! Und genau hier wird der Port dann benutzt.
Welche Zeilen mehr hättest Du denn gern im Code?
Mit diesem System kannst Du sehr viele unterschiedliche PWMs gleichzeitig steuern.
o.k. wenn ich das richtig verstehe:
Die Timer-Frequenz hat nichts mit der Frequez des PWM-Signals zu tun. Sie dient lediglich als Zeitbasis für das "Formen" des Pulses womit letztendlich am Ausgangsport ein Signal mit einer Spitzenspannung von 5V und einer Effektivspannung, die der gewünschten Spannung entspricht, entsteht. Ist das so ???
Ich bin bei meinen bisherigen Bascom-Projekten immer um den Timer herumgekommen; jetzt muß ich da wohl durch.
Frank
Es gibt auch noch Alternativen zu PWM:
1) DA Wandler oder Digitale Poties mit 1 Wire Interface
2) Die 3 möglichen Zusände der Ports nutzen: -> 2 V, input ->2.2 V, H ->2.4 V. Das ließe sich wohl sogar rein passiv mit Widerständenrealisieren.
3) Mit Hilfe eines Zietweise geliehenem 2 ten Portpin kann man auch eine Porterweiterung via Schieberegister erzeugen. Der 2 te IO Pin wird nur Übertragung von Änderungen ganz kurz gebraucht, da findet sich oft noch eine Möglichkeit.
Ja, Du hast recht.
Du hast es jetzt verstanden.
Timer in Bascom zu definieren, ist garnicht so schwer. Dazu gibts doch bestimmt was von Ratioph... äh... was im Wiki.
Im Endeffekt wird die PWM-Frequenz ein hunderstel der Timerfrequenz betragen, also nimm doch lieber 10kHz oder besser 100kHz.
... ich glaub, jetzt hab ich's.
Danke allen Teilehmenden für die hilfreichen Denkanstöße.
Von Zeit zu Zeit kommt es vor, daß man vor einem Problem sitz und einem keine praktikablen Lösungsansätze einfallen.
Ich danke auch noch einmal den Administratoren, die dieses Forum aufrecht halten, sowie allen Usern für die in der Regel doch immer sachdienlichen Beiträge.
Ein schönes Wochenende.
Frank
Lesezeichen