Forum: Mikrocontroller und Digitale Elektronik STM32 PWM Polarität


von Rolf (Gast)


Lesenswert?

Hallo,
ich steh grad irgendwie auf dem Schlauch und komme nicht weiter. Ich 
möchte an einem STM32L021 einen PWM Ausgang nutzen. Da ich allerdings 
einen Pegel von 5V benötige, habe ich einen 5V Toleranten Pin genommen 
(PA10, TIM2_CH3), einen externen Pullup Widerstand mit 4,7kOhm dran 
gehängt und den GPIO als OpenDrain konfiguriert. Funktioniert auch. Bis 
auf eine Kleinigkeit: Das mit den Polaritäten klappt einfach nicht.
Ich möchte am Anfang, solange der Timer inaktiv ist, das der Pegel am 
Pin 0V hat. Sobald der Timer startet, soll der Pegel auf die 5V 
springen. Wird der Capture/Compare erreicht, soll der Pin wieder auf 0V 
sein.
Ich hab jetzt schon alle mögliche Kombinationen aus PWM-Mode (OC3M im 
Register CCMR2) und Output Polarität (CC3P im Register CCER) 
durchprobiert, aber keine Konfiguration davon liefert das was ich mir 
vorstelle.
Vermutlich seh ich grad den Wald vor lauter Bäumen nicht...
Jemand eine Idee?

von Stefan F. (Gast)


Lesenswert?

Rolf schrieb:
> Ich hab jetzt schon alle mögliche Kombinationen aus PWM-Mode (OC3M im
> Register CCMR2) und Output Polarität (CC3P im Register CCER)
> durchprobiert, aber keine Konfiguration davon liefert das was ich mir
> vorstelle.

Zeige mal einen Versuch, der deiner Meinung nach klappen müsste. Am 
besten das ganze Projekt in compilierbarer Form.

von Bauform B. (bauformb)


Lesenswert?

Rolf schrieb:
> Ich möchte am Anfang, solange der Timer inaktiv ist, das der Pegel am
> Pin 0V hat.

Das geht nicht. Spendier einen Inverter, am besten 74HCT.

Ein Pull- muss auf den Pegel ziehen, den der Pin zu Anfang haben soll. 
Solange Reset aktiv ist, ist der Port ein Eingang und der Pull-Up ist 
trotzdem ein Pull-Up. Ausnahme: bei PA13 und PA14 sind zu Anfang ein 
interner Pull-Up bzw. Pull-Down aktiv. Und solange die nicht per 
Programm abgeschaltet werden, ist der Pin nicht 5V-tolerant.

von A. B. (Gast)


Lesenswert?

Rolf schrieb:
> Ich möchte am Anfang, solange der Timer inaktiv ist, das der Pegel am
> Pin 0V hat. Sobald der Timer startet, soll der Pegel auf die 5V
> springen. Wird der Capture/Compare erreicht, soll der Pin wieder auf 0V
> sein.

Was heißt "solange der Timer inaktiv ist"? Wenn damit gemeint ist, 
"bevor die Timer-Register initialisiert und der Zähler gestartet wurde 
(durch Setzen des CEN in TIMx_CR1), dann:
Konfiguration des Pins als "general purpose output", OD usw. und 
Umschalten auf "Alternate Function" erst nach Starten des Timers.
Wenn gemeint ist, ab Initialisierung der Register und Start des Zählers 
bis zum ersten Update-Event:
UG und CCxG in TIMx_EGR sollten das Gewünschte leisten.

Die Logik dahinter: Der Zustand des Ausgangs wird immer nur bei einem 
Update bzw. Compare-Event aktualisiert, also wenn der Zustand sich 
ändern soll, s. 16.3.9:

In PWM mode (1 or 2), TIMx_CNT and TIMx_CCRx are always compared to 
determine
whether TIMx_CCRx ≤ TIMx_CNT or TIMx_CNT ≤ TIMx_CCRx (depending on the 
direction of the counter). However, to comply with the OCREF_CLR 
functionality (...), the OCREF signal is asserted only:
•When the result of the comparison changes, or
•When the output compare mode (OCxM bits in TIMx_CCMRx register) 
switches from the “frozen” configuration (no comparison, OCxM=‘000) to 
one of the PWM modes (OCxM=‘110 or ‘111).

von W.S. (Gast)


Lesenswert?

Rolf schrieb:
> Da ich allerdings
> einen Pegel von 5V benötige, habe ich einen 5V Toleranten Pin genommen

Und was willst du damit erreichen?
5 V tolerant heißt, daß der Anschluß auch mal von außen angelegte 5 Volt 
verträgt, ohne kaputt zu gehen. Es heißt nicht, daß er 5 Volt liefern 
kann.

W.S.

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.