Benutze einfach einen Inverter (Transistor z.B.)
Gruß Richard
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
Code:$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
Benutze einfach einen Inverter (Transistor z.B.)
Gruß Richard
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.
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.
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.
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 .Zitat von Kampi
viele Grüße
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 9:
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?
Hallo
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: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.
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
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
[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
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
Oh verzeihung . Dann hab ich wohl den Text falsch interpretiert.Zitat von Leon3770
Lesezeichen