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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.