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