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 | }
|