Forum: Mikrocontroller und Digitale Elektronik STM32 PWM Polarität ändern ohne Deadtime zu ändern


von Jedi82 (Gast)


Lesenswert?

Hallo zusammen,

ich hab in einem neuen Layout einen kleinen Schnitzer bei der 
Ansteuerung eines Wechselrichters und muss die Polarität meiner 6 
PWM-Kanäle umkehren.

Bisher läuft meine Software mit folgendem Setup:

TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM1_OCInitStructure.TIM_Pulse = PWM_PERIOD >> 1; //dummy value
TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;


Wenn ich jetzt die Polarity von High auf Low stelle dreht sich zwar das 
PWM Muster um, allerdings verändert sich damit auch gleichzeitig die 
Polarität der Deadttime, und das führt dann zu schönen aktiven 
Kurzschlüssen, zu einer Zeit in der Kurzschlüsse eigentlich verhindert 
werden sollten :)

Kann ich die Totzeit-Polarität irgendwo nochmal separat verändern?

viele Grüße,
Jedi

von Jedi82 (Gast)


Lesenswert?

Hat in Summe zwei Tage gebraucht um das Problem zu lösen, aber zum Glück 
geschafft.
Man kann die Polarität bei Center Aligned PWMs negieren und trotzdem die 
Totzeit in der ursprünglichen Polarität beibehalten, wenn man seine 
Duty-Cycles zuerst invertiert, und dann die Phase um 180° verschiebt.

Hier der Unterschied für mein drei Phasen center-aligned System 
dargestellt:

Normaler Modus (active high PWM für Highside und Lowside, Deadtime mit 
Break-Feature und Deaktivierung aller Endstufen über PWM auf Lowlevel, 
siehe oben)
in der Konfig: TIM_CounterModeConfig(TIM1, 
TIM_CounterMode_CenterAligned1)
TIM1->CCR3 = (DutyCycle_Phase_A); // Phase C
TIM1->CCR2 = (DutyCycle_Phase_B); // Phase B
TIM1->CCR1 = (DutyCycle_Phase_C); // Phase A

Invertierterter Modus, d.h im Center schaltet jetzt nicht die Highside 
sondern die Lowside, aber mit gleichen Polariäten).
in der Konfig: TIM_CounterModeConfig(TIM1, 
TIM_CounterMode_CenterAligned2)
TIM1->CCR3 = (65535-DutyCycle_Phase_A); // Phase C
TIM1->CCR2 = (65535-DutyCycle_Phase_B); // Phase B
TIM1->CCR1 = (65535-DutyCycle_Phase_C); // Phase A

Vielleicht hilfts einem!
Gruß,
Jedi

von Michael K. (damichl)


Lesenswert?

Das wäre was für die Codesammlung :)

von Hauspapa (Gast)


Lesenswert?

Glückunsch & Danke für die Info

Hauspapa

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.