STM32 invertierte PWMs erzeugen

Gast #1911096
Lesenswert?

Hallo!

Ich habe Schwierigkeiten ein inverses PWM zu einem anderen zu erzeugen. 
Ich möchte im Grunde genommen zwei LEDs abwechselnd leuchten lassen. Um 
dies zu erreichen, möchte ich mit Channel 3 und 4 von Timer 4 jeweils 
zwei 50%-PWMs erzeugen. Bei einem müsste der Ausgang bis zum Erreichen 
des Capture/Compare-Wertes high, danach low sein. Beim anderen eben 
umgekehrt. Leider klappt das nicht so, wie ich mir das vorstelle. Hier 
mal der Code bis dahin:
1
  TIM_TimeBaseStructure.TIM_Period = 999;
2
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
3
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
4
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
5

6
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
7

8
  ...
9

10
  /* PWM1 Mode configuration: Channel3 */
11
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
12
  TIM_OCInitStructure.TIM_Pulse = CCR5_Val;
13
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
14

15
  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
16

17
  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
18
  
19
  /* PWM1 Mode configuration: Channel4 */
20
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
21
  TIM_OCInitStructure.TIM_Pulse = CCR5_Val;
22
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
23

24
  TIM_OC4Init(TIM4, &TIM_OCInitStructure);
25

26
  TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
27

28
  TIM_ARRPreloadConfig(TIM4, ENABLE);

Ich hatte gehofft richtig verstanden zu haben, dass diese Zeile hier
1
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

mir dabei hilft, das Signal entsprechend zu verändern. Scheint aber 
nichts zu bringen. Ich krieg aber auch nicht so richtig raus, was die 
nun eigentlich bewirkt. Mit dem Oszi seh ich keinen Unterschied. :(
Naja, ich hab dann versucht im Datenblatt genauer nachzulesen. Wenn ich 
es richtig verstehe, dann gibt es im CCER von Timer 4 für jeden der vier 
Channels des Timers ein Bit für die "output polarity" (CCxP). Also 
dachte ich mir, setze ich die von Hand. Daraus sind folgende zwei 
Codezeilen entstanden.
1
  TIM4->CCER |= (1<<9);
2
  TIM4->CCER &= ~(1<<13);

Ihr könnt euch vorstellen, dass die erhoffte Wirkung ausblieb. Daher 
meine Frage: Wie krieg ich das hin? Ja, ich bin Neuling auf dem Gebiet. 
Und ja, daher sollte ich mich wohl erstmal mit einfacheren 
Mikrocontrollern auseinandersetzen. Sry, also für die doofen Fragen, 
aber ich mache das hier halt auch nicht wirklich freiwillig. :(

Danke im Voraus
Sebastian
Gast #1912064
Lesenswert?

Hallo nochmal!

Vielen Dank für die schnelle Antwort, das Problem saß aber (wie so oft) 
vor dem Rechner. ;)

Eigentlich hat es die ganze Zeit funktioniert, leider ist mein Oszi wohl 
nicht ohne weiteres in der Lage, dies richtig anzuzeigen. Ein 
Kommilitone konnte mir schnell auf die Sprünge helfen.

Liebe Grüße
Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren