PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gegentakt PWM



Leon3770
17.08.2010, 10:56
Hallo,
ich versuche schon länger einen Mega8 dazu zu bringen mir an seinen beiden Compare Registern vom Timer1 mir eine gegentakt PWM aus zu geben.Dazu habe ich mir gedacht man kreiert zunächst erstmal den Timer1 so,daß er an Compare1a und Compare1b eine Phasengleiche PWM erzeugt.Um eine gegentakt PWM zu erhalten ( Gegentak PWM=also wenn das eine Compareregister ein HI ausgibt muß das andere Lo sein und umgekehrt) schalte ich immer das jeweils andere Compareregister für die Zeit einfach aus.Beispiel der Ausgabe: Compare1a=LO/HI/LO/HI und Zeitgleich Compare1b=HI/LO/HI/LO.Das habe ich versucht in einen Code zu fassen.Allerdings sagt mir mein Oszi,daß die Nullsetzung der Compareregister nicht richtig funktioniert.Die Rechteckausgabe ist irgendwie "verwischt" bzw unsauber.Nun meine Frage,wo ist in Code der Fehler zu suchen bzw wie macht man das besser?

viele Grüße


$regfile = "m8def.dat"
$crystal = 8000000


Config Portb.1 = Output
Config Portb.2 = Output
Config Portc.5 = Input


Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , _
Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Timer1
Start Timer1

Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Isr_von_timer0
Enable Interrupts



Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim B As Word
Dim Wert As Word
Dim Up As Bit
Dim Pwm As Byte



Do
'*** ADC einlesen und auf 8 Bit umrechnen ***

Wert = Getadc(5)
B = Wert / 4


Loop
End

Isr_von_timer0:
Timer0 = 192 'Zeitbasis

'*** Compare Register Togglen ***

Toggle Up

If Up = 0 Then
Pwm1b = 0
Pwm1a = Pwm
Else
Pwm1a = 0
Pwm1b = Pwm
End If

'*** PWM Regelung ***

If B > Pwm Then
Pwm = Pwm + 1
End If

If B < Pwm Then
Pwm = Pwm - 1
End If


Return

Richard
17.08.2010, 14:20
Benutze einfach einen Inverter (Transistor z.B.)

Gruß Richard

MichaF
17.08.2010, 14:42
Gleich vorweg: Bascom ist nicht meine Welt, da kann ich dir nicht helfen. Beschäftige dich mit den Registern TCCR1A, genauer mit den Bits COM1A0/COM1A1 bzw. den selbigen für das Compare Register B. Mit deren Hilfe kannst du auswählen ob der zugehörige Compare Pin bei Comparregister == Zählerregister gesetzt oder rückgesetzt wird.

Wie man das in Bascom formuliert kann ich nur raten, aber ich würde mal vermuten das es mit etwas wie

Compare A Pwm = Clear Down , Compare B Pwm = Clear Up

getan sein sollte. Das würde zumindest in meinen Augen Sinn machen.

Kampi
17.08.2010, 14:57
Ja mit dem Clear down und Clear up legst du fest, wann der Controller schaltet.
Wenn du Comparea = 50 und Clear up eingestellt hast zählt der Controller von 0-255 und schaltet dann bei 50. Wenn du Clear down eingestellt hast zählt der Controller von 255 runter und schaltet dann bei 50. Und dadurch ergeben sich zwei verschiedene Tastverhältnisse. So kannst du auch deinen Gegentakt PWM erzeugen, indem du Compare A = Clear up und Compare B = Clear down schreibst.

Leon3770
17.08.2010, 15:48
Hallo,
zunächst einmal vielen Dank für eure Antworten! Da bis jetzt alle Antworten dahingehend hindeuten das man ein Signal invertieren sollte möchte ich dazu für alle Antworten stellvertretend auf Kampis Aussage antworten.


Ja mit dem Clear down und Clear up legst du fest, wann der Controller schaltet.
Wenn du Comparea = 50 und Clear up eingestellt hast zählt der Controller von 0-255 und schaltet dann bei 50. Wenn du Clear down eingestellt hast zählt der Controller von 255 runter und schaltet dann bei 50. Und dadurch ergeben sich zwei verschiedene Tastverhältnisse. So kannst du auch deinen Gegentakt PWM erzeugen, indem du Compare A = Clear up und Compare B = Clear down schreibst.

Wie Kampi schon ganz richtig sagte zählt der Controller bei der Einstellung "Up" von 0 bis z.B. 50 und schaltet dann bei 50.Bei der Einstellung "Down" zählt er hingegen von 255 bis 50 herrunter um dann zu schalten.Dabei entstehen dann zwei verschiedene Tastverhältnisse.Dies ist aber nicht erwünscht,ja darf gar nicht sein! Das Tastverhältnis soll immer bei beiden Compareregistern identisch,sprich:gleich groß sein.Ist es z.B. 50 dann soll es bei beiden 50 sein,ist es 100,soll es bei beiden 100 sein.Allerdings soll die Ausgabe zeitlich versetzt sein nämlich immer so,daß wenn das eine ausgegeben wird soll das andere Null sein und umgekehrt so das nie beide gleichzeitig Hi oder Lo sein können.Halt gegentakt PWM.Das hat meiner Meinung nach nichts damit zu tun das man eines der beiden Signale negiert/invertiert .

viele Grüße

MichaF
17.08.2010, 16:03
Ok, das ist dann doch nicht wie von mir vermutet der richtige Timer Modus. Invertieren reicht aber definitiv aus. Es sei denn, ich missverstehe deine Anforderungen.

Du musst, wie schon gesagt an die COM1A0/COM1A1 Bits ran kommen, wie auch immer das in Bascom geht.

Auszug aus dem Datenblatt (Bei meinem auf Seite 98):
Compare Output Mode, Fast PWM:

COM1A0 = 0
COM1A1 = 1
--> Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at
BOTTOM, (non-inverting mode)

COM1A0 = 1
COM1A1 = 1
--> Set OC1A/OC1B on Compare Match, clear OC1A/OC1B at
BOTTOM, (inverting mode)

Klingt doch eigentlich gut, oder? Nun musst du nur noch rausfinden, wie man die passenden Bits setzt. Kann man in Bascom nicht auch direkt auf die Register zugreifen?

radbruch
17.08.2010, 16:21
Hallo


Wie Kampi schon ganz richtig sagte zählt der Controller bei der Einstellung "Up" von 0 bis z.B. 50 und schaltet dann bei 50.Bei der Einstellung "Down" zählt er hingegen von 255 bis 50 herrunter um dann zu schalten.Ich bin zwar auch Bascom-Laie, bin aber mit dieser Beschreibung nicht ganz einverstanden. Clear Up/Down sind Parameter für die Phase-Correct-Modi des Timers. Hierbei zählt das Zählregister von null aufwärts bis zum Maxwert und wieder zurück nach null. Dabei wird sowohl beim Hoch- wie auch beim Runterzählen jeweils ein Match-Compare mit dem OCR1x erkannt und der OC1x-Ausgang getogglet. ClearUp/Down legt dabei fest, bei welchem Match der Ausgang Low werden soll. ClearUp schaltet beim Hochzählen auf Low, ClearDown beim Runterzählen. Hier das modifizierte Phase-Correct-Setup, das ich bei der Bee verwendet habe:

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1

10Bit drängen sich bei der Sollwertvorgabe mit dem ADC direkt auf;) PWM-Frequenz mit Prescaler=1 wäre übrigens Kontrollertakt/2048

Gruß

mic

Richard
17.08.2010, 16:25
[quote="MichaF"]Ok, das ist dann doch nicht wie von mir vermutet der richtige Timer Modus. Invertieren reicht aber definitiv aus.

Ich frage mich nur warum das nicht einfach mit einer PWM und
Hardware Inverter ( Nand Gatter z.B.) gemacht wird. Dann wird
das ganze zwangsläufig genau genug.

Gruß Richard

MichaF
17.08.2010, 16:41
Ist eine Möglichkeit - klar. Aber es ist absolut kein Problem das den Controller erledigen zu lassen, warum also nicht die paar zusätzliche Bauteile sparen wenn das Ergebnis gleichwertig bleibt? Zudem wissen wir nicht, ob Leon3770 nicht eine fixe Hardware vor sich liegen hat. Nicht jeder mag freifliegende Bauteilkonstruktionen auf einer ansonsten recht ansehlichen Platine ;)

Gruß Micha

Kampi
17.08.2010, 16:48
Hallo,
zunächst einmal vielen Dank für eure Antworten! Da bis jetzt alle Antworten dahingehend hindeuten das man ein Signal invertieren sollte möchte ich dazu für alle Antworten stellvertretend auf Kampis Aussage antworten.


Ja mit dem Clear down und Clear up legst du fest, wann der Controller schaltet.
Wenn du Comparea = 50 und Clear up eingestellt hast zählt der Controller von 0-255 und schaltet dann bei 50. Wenn du Clear down eingestellt hast zählt der Controller von 255 runter und schaltet dann bei 50. Und dadurch ergeben sich zwei verschiedene Tastverhältnisse. So kannst du auch deinen Gegentakt PWM erzeugen, indem du Compare A = Clear up und Compare B = Clear down schreibst.

Wie Kampi schon ganz richtig sagte zählt der Controller bei der Einstellung "Up" von 0 bis z.B. 50 und schaltet dann bei 50.Bei der Einstellung "Down" zählt er hingegen von 255 bis 50 herrunter um dann zu schalten.Dabei entstehen dann zwei verschiedene Tastverhältnisse.Dies ist aber nicht erwünscht,ja darf gar nicht sein! Das Tastverhältnis soll immer bei beiden Compareregistern identisch,sprich:gleich groß sein.Ist es z.B. 50 dann soll es bei beiden 50 sein,ist es 100,soll es bei beiden 100 sein.Allerdings soll die Ausgabe zeitlich versetzt sein nämlich immer so,daß wenn das eine ausgegeben wird soll das andere Null sein und umgekehrt so das nie beide gleichzeitig Hi oder Lo sein können.Halt gegentakt PWM.Das hat meiner Meinung nach nichts damit zu tun das man eines der beiden Signale negiert/invertiert .

viele Grüße

Oh verzeihung 8-[ . Dann hab ich wohl den Text falsch interpretiert.

Leon3770
17.08.2010, 17:30
Um das noch mal zu untermauern was ich erzeugen möchte bzw zum besseren Verständnis habe ich hier mal die beiden Bilder,gefunden im Web,angefügt.

http://file1.npage.de/004941/62/bilder/totzeit.jpg
http://www.mikrocontroller.net/attachment/69213/021.jpg

Hier ist jeweils noch eine Totzeit mit vorhanden die ich aber selber nicht unbedingt benötige da ich diese Aufgabe den Halbbrückentreibern zukommen lasse.

viele Grüße

radbruch
17.08.2010, 17:37
Ohne die "Totzeit" ist der zweite Ausgang einfach invertiert. Dafür kannst du alle oben schon beschriebenen Techniken verwenden.

PICture
17.08.2010, 18:29
Hallo!

@ Richard

Ich kenne schon lange der Fall, dass manche zwar fragen, haben aber schon längst eigene Antwort und ignorieren deine (hier einzige vernünftige Lösung). Ich wiederhole nie meinen Vorschlag, weil die optimale Lösung nicht mein Problem ist ... :)

MfG

radbruch
17.08.2010, 18:35
"hier einzige vernünftige Lösung" neben der ebenfalls vernünftigen Softwarelösung ;)

PICture
17.08.2010, 18:40
Natürlich radbruch ! :)

Deswegen am besten ist dem Fragesteller freie Aswahl zu überlassen, weil einige einfachste Lösungen nicht mögen ...

Leider ist Hardware mein Beruf und Software nur mein Hobby. Deswegen bevorzüge ich manchmal unbewusst Hardwarelösungen (Berufskrankheit ?) die mir meistens einfacher zu sein scheinen ... :(

Übrigens, meine vorherige Signatur war: "So einfach? Es muss doch komplizierter gehen!".

MfG

Leon3770
17.08.2010, 21:43
Ok,verstehe aber so ganz überzeugt bin ich noch nicht.Ich habe nun selber mal eine Standartschaltung mit einem PWM Controller ,dem SG3525 aufgebaut und dessen Ausgangssignal fotografiert.Zum Vergleich die des Mega8 mit compare /up/down wie von euch mehrfach vorgeschlagen.Auch habe ich versucht das die Hi Phasen etwa gleich groß sind.Die Totzeit des SG3525 ist auf seine kleinstmögliche Einstellung von etwa 4µs (0,5µs Abfall/3,5µs Anstieg) durch direktes Verbinden von Pin7 mit Pin5 eingestellt und somit im Foto kaum bis gar nicht sichtbar. Also schlagt mich tot aber irgendwie siehts doch anders aus........

Mega8
http://mein-123.co.de/Mega8%20PWM.jpg


SG3525
http://mein-123.co.de/SG3525%20PWM.jpg

viele Grüße

Kampi
17.08.2010, 22:54
Eventuell kannst du die Pulse ja mit einem Schmitttrigger "schöner" machen. Dann dürften die eigentlich so aussehen wie beim Mega.

MichaF
17.08.2010, 23:46
Ich werde das Gefühl nicht los, das deine Anforderungen sich nicht mit dem decken, was die Mehrheit hier versteht. Dem nach wäre nämlich dein Oszillogramm mit dem Mega8 die gewünschte Lösung.

Du solltest noch mal exakt beschreiben, was du eigentlich möchtest. Am besten mit selbst erstellter, und somit 100% den Sachverhalt darstellender Skizze.

Netzman
18.08.2010, 09:53
Vielleicht sinds 2 PWM-Signale mit gleichem Tastverhältnis, aber eins um 180° phasenverschoben?

mfg

Leon3770
18.08.2010, 13:24
Vielleicht sinds 2 PWM-Signale mit gleichem Tastverhältnis, aber eins um 180° phasenverschoben?

mfg

Genau so ist es! Nur wie kann man das in Bascom realisieren?

viele Grüße

Kampi
18.08.2010, 13:34
Haste es mal probiert indem du schreibst:
Compare1a = Clear up Compare 1b = Clear down

Compare1a = 50
Compare1b = 200

?

MichaF
18.08.2010, 14:11
Vielleicht sinds 2 PWM-Signale mit gleichem Tastverhältnis, aber eins um 180° phasenverschoben?

mfg

Genau so ist es! Nur wie kann man das in Bascom realisieren?

viele Grüße

Ich will dir ja nicht zu nahe treten, aber bist du dir da ganz sicher? Das hat mit der Beschreibung im Ursprungspost nicht mal mehr das geringste zu tun. Bei 180° Phasendifferenz kann und wird es Zustände geben, bei denen beide Kanäle gleichzeitig high sind, das wolltest du doch unbedingt vermeiden? Im übrigen wirst du sowas - falls du es denn wirklich brauchst - nicht mit nur einem Timer exakt hinbekommen. Es sei denn du verzichtest auf die halbe Auflösung.

Leon3770
18.08.2010, 15:32
Hallo,
zunächst einmal möchte ich mich bei euch bedanken das ihr es noch nicht mit mir aufgegeben habt 8-
chaF"]
Ich will dir ja nicht zu nahe treten, aber bist du dir da ganz sicher? Das hat mit der Beschreibung im Ursprungspost nicht mal mehr das geringste zu tun. Bei 180° Phasendifferenz kann und wird es Zustände geben, bei denen beide Kanäle gleichzeitig high sind, das wolltest du doch unbedingt vermeiden? Im übrigen wirst du sowas - falls du es denn wirklich brauchst - nicht mit nur einem Timer exakt hinbekommen. Es sei denn du verzichtest auf die halbe Auflösung.

Ja Micha,ich bin mir ganz sicher.Wenn ich mich anfangs so schlecht ausgedrückt habe das ich wohl komplett missverstanden wurde,muß ich entschuldigen.Nun der Zustand das beide PWM Kanäle gleichzeitig Hi haben wird doch vermieden,daß das Tastverhältnis nie über max 50:50 pro PWM Kanal anwachsen darf.Die PWM auf diesen Wert zu begrenzen ist kein Problem für mich,jedoch wie bekomme ich die Phasenverschiebung hin so das die Ausgabe exakt so erfolgt wie im Bild vom SG3525? Geht das Im "Phase correct Modus" überhaupt?

viele Grüße

MichaF
18.08.2010, 17:30
Ok, ich wollte nur noch mal sicher gehen :)

Das mit dem Tastverhältnis geht natürlich wenn du mit den dadurch einhergehenden Einschränkungen leben kannst.

Also eine Hardware Lösung, die dir nicht einige hundert Interrupts/s um die Ohren haut, wird es meiner Meinung nach nicht geben. Das ist imho zu exotisch als das man das mit den normalen Betriebsmodi und einem Timer abbilden könnte. Aber vielleicht hat ja der ein oder andere eine gute Idee.

Wie genau muss Phase und Frequenz eingehalten werden?
Wie hoch muss die Auflösung sein?
Wie hoch muss die Frequenz sein?
Stehen evtl. weitere Timer zur Verfügung?
Wie viel hat der Controller sonst noch zu tun?

Evtl. findet man da eine Lösung, aber ich fürchte mit ein paar Zeilen Standard Bascom wird das nichts werden. Das einfachste wird sein den SG3525 zu verwenden, der funktioniert ja auch schon.

Aus reiner Neugier: Wofür genau braucht man sowas? :)