Forum: Mikrocontroller und Digitale Elektronik STM32: PWM Mode wird invertiert


von Janis W. (jotwe)


Lesenswert?

Hallo zusammen,

ich steuere mit TIM4 eines STM32 unter anderem eine RGB-LED an. Dazu 
verwende ich 3 der 4 Kanäle zur PWM-Generierung für jede Farbe. Der PWM 
Mode entspricht PWM2 und der Counter zählt hoch.

Das funktioniert auch meistens sehr gut, allerdings tritt bei 10%-20% 
der Systemstarts ein Effekt ein, den ich mir nicht erklären kann: Der 
PWM Mode oder die Zählrichtung des Counters scheinen invertiert zu 
werden. Mein ursprünglich 100% blau leuchtende LED leuchtet bei gleichen 
Compare-Werten CC gelb, was 100% rot und 100% grün entspricht.

Ich habe in beiden Zuständen mal die entsprechenden Register geprüft: 
TIM4_CR1 ist 0x001 (CEN ist gesetzt), TIM4_CCMR1 ist 0x7070 (OC1M und 
OC2M stehen auf PWM2), TIM4_CCMR2 ist 0x0070 (OC3M steht auf PWM2). Es 
müsste also eigentlich passen.

Die Initialisierung vom TIM4 ist dem Beitrag angefügt. Die Compare-Werte 
werden ca. zehn mal pro Sekunde neu gesetzt, allerdings sind die Werte 
für meinen Test konstant bei 0 für rot und grün und 65535 für blau.

Kann es sein, dass da bei Initialisierung etwas schief geht, auch wenn 
in den Registern die gewünschten Werte stehen? Vorallen, dass es nicht 
deterministisch ist, wundert mich. Könnte es etwas ganz anderes sein? 
Ich bin ehrlich gesagt ratlos und für jeden Tipp dankbar :) Ich kann 
gerne mehr von meinem Code posten...

1
void SIGNAL_Initialize(void) {
2
3
  // Private variables
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6
  TIM_OCInitTypeDef TIM_OCInitStructure;
7
8
  // Initialize TIM4 for PWM with 1.1kHz on channel 1, 2 and 3
9
  SIGNAL_SetColor(COLOR_BLACK);
10
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
11
  TIM_TimeBaseStructure.TIM_Period = 65535;
12
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
13
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
14
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
15
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
16
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
17
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
18
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
19
  TIM_OCInitStructure.TIM_Pulse = 0;
20
  TIM_OC1Init(TIM4, &TIM_OCInitStructure);
21
  TIM_OC2Init(TIM4, &TIM_OCInitStructure);
22
  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
23
  TIM_CtrlPWMOutputs(TIM4, ENABLE);
24
25
  // Initialize signal inputs and outputs
26
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
27
  // LEDRED, LEDGREEN and LEDBLUE
28
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
29
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
30
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
31
  GPIO_Init(GPIOB, &GPIO_InitStructure);
32
33
}

von Janis W. (jotwe)


Lesenswert?

Ich habe gerade auch nochmal die entsprechenden Capture/Compare-Register 
geprüft. Ach hier scheinen in beiden Fällen die Werte zu stimmen: CCR1 
und CCR2 sind 0, CCR3 ist 65535.

Das Problem besteht weiterhin.

von Janis W. (jotwe)


Lesenswert?

Hm, mein Problem scheint wohl sonst noch niemandem untergekommen zu 
sein...

Bei einem ebenfalls angeschlossenen Motor tritt das Phänomen auch 
gelegentlich auf: Die Drehrichtung wird dann umgekehrt.

Bin nach wie vor ratlos.

von Matthias Larisch (Gast)


Lesenswert?

Hat die OC Init Structure nicht noch ne polarität? Zumindest kenn ich 
das von dem Timer1 mit den Komplementärausgängen, das man da für jeden 
ne Polarität einstellt. Geht vielleicht bei den normalen auch? (Habs 
jetzt nich nachgeschaut)

von Janis W. (jotwe)


Lesenswert?

Hallo Matthias,

danke für Deine Antwort! Ich hatte das Datenblatt irgendwie so 
verstanden, dass das nur für den Input-Modus relevant ist. Ein zweiter 
Blick hat mir aber gezeigt, dass auch der Output-Modus tangiert wird.

Ich habe es mal eben mit Polarität getestet und bisher ist der Effekt 
nicht nochmal aufgetreten. Manchmal kann es so einfach sein :)

Danke für den Tipp!

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.