Forum: Mikrocontroller und Digitale Elektronik M64, PWM, Pin OC1A, DDRB|= (0<<PB5)


von Olof G. (ole)


Lesenswert?

Moin,

man vergebe mir, dass ich im Betreff eine Null schiebe und dann auch 
noch wo es doch schon der default-Wert ist. Soll in der Übersicht nur 
genauer beschreiben, was ich möchte.

ZIEL:
Ich möchte PWM-Ausgabe Abschalten OHNE in die PWM eingreifen zu müssen.
Der Timer soll weiter laufen, nur eben ohne Aktivitäten an dem 
entsprechenden Pin.

Folgende Ausgangssituation:

Timer1 konfiguriert zu "Compare Output Mode, Fast PWM"
COM1A1=1
COM1A0=0 (non inverting mode @ PB5)

So im DB steht folgendes:
"OC1A, Output Compare Match A output: The PB5 pin can serve as an 
external output for the Timer/Counter1 Output Compare A. The pin has to 
be configured as an output (DDB5 set (one)) to serve this function. The 
OC1A pin is also the output pin for the PWM mode timer function."

Was passiert an dem Pin wenn ich ihn als Eingang definiere?

Falls schon mal jemand diese Sache erlebt hat, wäre eine kurze Antwort 
schön.


Als zweite Alternative gäbe es dann noch:

COM1A1=0
COM1A0=0 (Normal port operation @ PB5)
Also den Ausgangspin von der PWM-Einheit abkoppeln.

Welchen Wert nimmt der Pin denn dann an?
Den zuletzt durch die PWM gegebenen oder den zuletzt durch PORTB 
festgelegten?

Auch hier die Bitte an denjenigen, der das Verhalten kennt, eine kurze 
Antwort zu schreiben.


Beiträge die den Sinn der Sache in Frage stellen oder das Ziel 
verfehlen, bitte ich zu vermeiden.

Grüße aus dem verschneiten Hamburg

von Volker S. (volkerschulz)


Lesenswert?

Ich kann Dir die Frage nicht mit 100%-iger Sicherheit beantworten, aber 
im allgemeinen stehen Pins, deren Alternativ-Funktion genutzt werden, 
nicht mehr als I/O-Pins zur Verfuegung.

Leg doch einfach den Compare auf TOP oder BOTTOM um die PWM mit Dauer-0 
bzw. Dauer-1 weiterlaufen zu lassen...

Volker

von spess53 (Gast)


Lesenswert?

Hi

>If one or both of the COMnC1:0 bits are written to one,
>the OCnC output overrides the normal port functionality of the I/O pin it >is 
connected to. However, note that the Data Direction Register (DDR) bit 
>corresponding to the OCnA, OCnB or OCnC pin must be set in order to enable >the 
output driver.

Wenn du schon das Datenblatt liest, warum dann nicht richtig?

MfG Spess

von Olof G. (ole)


Lesenswert?

Hallo und erstmal vielen Dank für die Antworten.


@Volker

Genau diesen Eingriff in die PWM möchte ich vermeiden. Die soll einfach 
vor sich hinlaufen.

@spess

Deiner Aussage entnehme ich, dass am Pin nichts passiert, so lange er im 
DDR als Eingang definiert ist.

Gruß,

Olof

von Olof G. (ole)


Lesenswert?

Nachtrag:

aber was für einen Zustand hat der Pin dann?
Entsprechend dem PORT-Register den Pull-Up an oder aus?
Generell Hi-z?

Gruß,

Olof

von spess53 (Gast)


Lesenswert?

Hi

>@spess
>Deiner Aussage entnehme ich, dass am Pin nichts passiert, so lange er im
>DDR als Eingang definiert ist.

Das ist eine Aussage von Atmel und hat sich auch in der Praxis 
bestätigt.

MfG Spess

von Hc Z. (mizch)


Lesenswert?

In den ATMega-Datenblättern gibt es unter "Alternate Port Functions" ein 
Innenschaltbild eines Ports.  Der Zusammenhang zwischen den einzelnen 
Symbolen dort und den I/O-Modulen mit ihren Signalnamen (wie: OC1B wird 
PVOV im Schaltbild) ist im nachfolgenden Text für jedes Port 
beschrieben.

von Olof G. (ole)


Lesenswert?

Hallo Spess,

der Bezug zur Praxis war mir wichtig.
Papier ist geduldig und TFT´s auch.

Ich denke aber die Methode,
COM1A1=0
COM1A0=0
zu setzen ist sauberer und dauert auch nicht länger als DDRB zu ändern.

Gruß,

Olof

von Volker S. (volkerschulz)


Lesenswert?

Olof Gutowski schrieb:
> @Volker
>
> Genau diesen Eingriff in die PWM möchte ich vermeiden. Die soll einfach
> vor sich hinlaufen.

Achso. Mir erschliesst sich der Sinn dahinter zwar nicht so ganz, muss 
er aber ja auch nicht. ;)

Volker

von Olof G. (ole)


Lesenswert?

Volker Schulz schrieb:
> Olof Gutowski schrieb:
>> @Volker
>>
>> Genau diesen Eingriff in die PWM möchte ich vermeiden. Die soll einfach
>> vor sich hinlaufen.
>
> Achso. Mir erschliesst sich der Sinn dahinter zwar nicht so ganz, muss
> er aber ja auch nicht. ;)
>
> Volker

Hallo Volker,

Manchmal muss man Sachen festsetzen um nicht zu viele Stellknöpfe zu 
haben. ;)

Nein Sinn dieser Sache ist, dass ich nicht abwarten kann bis der derzeit 
laufende PWM-Zyklus durch ist.
Sobald der Interrupt für die Strombegrenzung kommt, muss der Ausgang auf 
LOW gezogen werden. Unabhängig an welche Stelle des PWM-Zyklus man sich 
befindet.

Eingesetzt werden soll das an einer PWM-Drehzahlregelung für DC-Motoren.
Sobald die Endstufe öffnet steigt der Strom durch den Motor, bedingt 
durch sein induktives Verhalten, stetig bis zu einem gewissen Wert an.
Sagen wir die ON-Zeit der PWM sei 1ms und nach 0,6ms ist der max. Strom 
erreicht, dann möchte ich darauf sofort reagieren können.

Beim nächsten Zyklus geht das gleiche dann wieder von vorne los.
Also die PWM möchte 1ms öffnen, aber nach 0,6ms reagiert die 
Strombegrenzung und schaltet ab.

Gruß,

Olof

von Volker S. (volkerschulz)


Lesenswert?

Klingt interessant.

Aber muesstest Du dann nicht jedes Mal zu Beginn der Periode den Pin 
wieder auf Ausgang schalten (falls er durch den Interrupt auf Eingang 
gezogen wurde um die PWM abzuschalten)? Da waere ein Deaktivieren und 
Reaktivieren des PWM Timers doch genauso moeglich, oder?

Volker

von Olof G. (ole)


Lesenswert?

Volker Schulz schrieb:
> Klingt interessant.
>
> Aber muesstest Du dann nicht jedes Mal zu Beginn der Periode den Pin
> wieder auf Ausgang schalten (falls er durch den Interrupt auf Eingang
> gezogen wurde um die PWM abzuschalten)? Da waere ein Deaktivieren und
> Reaktivieren des PWM Timers doch genauso moeglich, oder?
>
> Volker

Hoffentlich funktioniert das auch...

Im Datenblatt steht:
"In non-inverting Compare Output mode, the Output Compare (OCnx) is 
cleared
on the Compare Match between TCNTn and OCRnx, and set at BOTTOM."

Somit werde ich einen Interrupt auf "Compare match" ("The OCnx interrupt 
flag will be set when a Compare Match occurs.") triggern. In dem schalte 
ich den Pin wieder zum Timer (COM1A1=1 und COM1A0=0), da er dann ja 
seitens der PWM eh auf LOW ist.

Gruß,

Olof

von Volker S. (volkerschulz)


Lesenswert?

Olof Gutowski schrieb:
> Hoffentlich funktioniert das auch...

Ich druecke die Daumen! Lass es uns anschliessend wissen.

> Im Datenblatt steht:
> "In non-inverting Compare Output mode, the Output Compare (OCnx) is
> cleared
> on the Compare Match between TCNTn and OCRnx, and set at BOTTOM."

Ich wusste nicht dass der Timer auch im PWM-Mode einen Interrupt auf 
Compare-Match ausloesen kann... Vermutlich weil ich es noch nie 
brauchte. ;) Wenn das aber moeglich ist, klingt das nach einer soliden 
Loesung.

Wenn Du aber Compare-Match = TOP hast muesstest Du auf Ausgang schalten 
noch bevor der Timer das naechste mal tickt.

Volker

von Olof G. (ole)


Lesenswert?

> Ich wusste nicht dass der Timer auch im PWM-Mode einen Interrupt auf
> Compare-Match ausloesen kann... Vermutlich weil ich es noch nie
> brauchte. ;) Wenn das aber moeglich ist, klingt das nach einer soliden
> Loesung.
>
> Wenn Du aber Compare-Match = TOP hast muesstest Du auf Ausgang schalten
> noch bevor der Timer das naechste mal tickt.
>
> Volker

Ich hoffe, dass das solide wird.

Schöner Punkt, hatte ich noch nicht bedacht.
Und dabei ist der ja sogar recht wichtig, wenn man das ganz als reine 
Strombegrenzung arbeiten lassen möchte.

Da die PWM mit einem Grundtakt von so um 10khz laufen soll (eher 
weniger, mal sehen wie sich der Motor anstellt und wie es klingt) glaube 
ich nicht, dass es ein Problem gibt, wenn der Pin die paar Takte (bei 
18,xyz MHz) später erst an die PWM gekoppelt und damit HIGH wird.
Mit dem Start des neuen PWM-Zyklus wird ja zeitgleich der 
Compare-Match-Int aufgerufen, in dem der Pin an die PWM gebunden wird.

Gruß,

Olof

von Olof G. (ole)


Lesenswert?

Ergänzung.

Evtl. kann man auch einen anderes Compare-Register nehmen, welches stets 
ein paar Count niedriger ist als des Register für OC1A.
Der M64 hat ja pro 16-bit Timer 3 Stck davon.

von Volker S. (volkerschulz)


Lesenswert?

Mit einem Prescaler von 8 und einer PWM-Aufloesung von 8 Bit kaemst du 
dann ja so auf eine Frequenz von ca. 8.8 KHz... Und 8 Takte sollten wohl 
reichen um das DDR zu setzen.

Du hast aber vermutlich Recht, dass es eigentlich egal ist, dass der 
Duty-Cycle bei der Periode nach der Strombegrenzung im Zweifel etwas 
kuerzer ausfaellt. Koenntest Du sogar als Feature verkaufen! ;)

Volker

von Olof G. (ole)


Lesenswert?

Volker Schulz schrieb:
> Mit einem Prescaler von 8 und einer PWM-Aufloesung von 8 Bit kaemst du
> dann ja so auf eine Frequenz von ca. 8.8 KHz... Und 8 Takte sollten wohl
> reichen um das DDR zu setzen.
>
> Du hast aber vermutlich Recht, dass es eigentlich egal ist, dass der
> Duty-Cycle bei der Periode nach der Strombegrenzung im Zweifel etwas
> kuerzer ausfaellt. Koenntest Du sogar als Feature verkaufen! ;)
>
> Volker

Es verleitet natürlich zu der Idee, die ON-time entsprechend durch eine 
Veränderung des Compare-Wertes einzukürzen, wenn die Strombegrenzung 
zugeschlagen hat.
Nur wie sollte man die Bedingung für das Aufheben dieser Verkürzung 
setzen?
Daher in jedem Zyklus das gleiche Spiel.
Nebenbei hat man so sicher eine Aussage, ob man in die Strombegrenzung 
fährt oder nicht.
Finde ich von der Theorie her ganz nett.

Ich melde mich, wenn es in Hardware umgesetzt ist und berichte dann kurz 
über die Erfahrungen damit.

Gruß,

Olof

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.