Forum: Mikrocontroller und Digitale Elektronik STM32 invertierte PWMs erzeugen


von Sebastian (Gast)


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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich bin mir jetzt nicht ganz sicher, probiere mal den Timer im 
Down-Count Mode laufen zu lassen.

Oder

TIM_SetCompare3(TIM4, PrescalerValue - DeinWert);

von Sebastian (Gast)


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

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.