Forum: Mikrocontroller und Digitale Elektronik STM32F1xx: Timer 1 Compare Mode für 2 Kanaele


von Christian J. (Gast)


Lesenswert?

Hallo,

ich stehe grad etwas auf dem berühmten Schlauch, da ich wzar weiss was 
ich will aber nicht wie es umsetzen soll :-(

Wunsch: Timer 1 (alle anderen sind belegt) soll an Pin PA9 (Tim1_Ch 2) 
eine PWM ausgeben für das Dimmen von LEDS. Zusätzllich aber noch an PA8 
(Tim1 Ch1) eine andere PWM gleicher Frequenz aber andern DC für eine 
Displaybeleuchtung.

Also Timer 1 mit 2 Compare Registern, die auf Pins gemapped werden.

Ich hab hier mal angefangen aus dem Kopf, komme aber ncht weiter ob das 
so richtig ist, vor allem mit dem Remapping des Timer 1. Der hängt am 
APB2 dran wie man sieht. 100Hz soll die PWM haben.

Ist das so ok? Was ist da evtl falsch und was fehl noch? Muss da noch 
was mit einer Alternate Function gemacht werden, dass die Pins auch 
wirklich  keine GPIOs mehr sind? Und wie isr das mit FullRemap und 
PartialRemap`? Ich brauche nur die beiden Compare Event Pins für Ch1 und 
Ch2

Tut sich jedenfalls nüscht an den Pins.
1
/* Timer 1 als PWM Generator einstellen für Helligkeit an HC595_OE
2
     f = 100Hz
3
   */
4
5
   RCC_ClocksTypeDef RCC_Clocks;
6
   TIM_TimeBaseInitTypeDef TimerBaseInitStructure;
7
   TIM_OCInitTypeDef TimerOCInitStructure_1, TimerOCInitStructure_2;
8
9
   /* Bestimme den APB2 Clock */
10
   RCC_GetClocksFreq(&RCC_Clocks);
11
   /* Berechne Prescaler und Periode für 1/10 Sekunden */
12
   uint32_t tim_presc  = RCC_Clocks.PCLK2_Frequency / 10000;
13
   uint32_t tim_period = TIM1_FREQ * 10;
14
15
   /* Timer 1 aktivieren und remappen */
16
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
17
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);
18
19
/* Pin A9 ankoppeln */
20
    GPIO_StructInit(&GPIO_InitStructure);
21
    GPIO_InitStructure.GPIO_Pin   = HC595_OE;
22
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
23
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
24
    GPIO_Init(HC595_PWM, &GPIO_InitStructure);
25
26
    /* Der Timer clock'ed mit 36Mhz */
27
   TIM_TimeBaseStructInit(&TimerBaseInitStructure);
28
   TimerBaseInitStructure.TIM_CounterMode     = TIM_CounterMode_Up;
29
   TimerBaseInitStructure.TIM_Prescaler       = tim_presc;
30
   TimerBaseInitStructure.TIM_Period          = tim_period;
31
   TimerBaseInitStructure.TIM_ClockDivision   = TIM_CKD_DIV1;
32
   TimerBaseInitStructure.TIM_RepetitionCounter = 0;
33
   TIM_TimeBaseInit(TIM1, &TimerBaseInitStructure);
34
35
   /* Compare Register 1 konfigurieren */
36
37
   TimerOCInitStructure_1.TIM_OCMode          = TIM_OCMode_PWM1;
38
   TimerOCInitStructure_1.TIM_OutputState     = TIM_OutputState_Enable;     // Nur Normal_State Pins aktvieren
39
   TimerOCInitStructure_1.TIM_OutputNState    = TIM_OutputNState_Disable;
40
   TimerOCInitStructure_1.TIM_OCIdleState     = TIM_OCIdleState_Reset;
41
   TimerOCInitStructure_1.TIM_OCPolarity      = TIM_OCPolarity_High;
42
   TimerOCInitStructure_1.TIM_Pulse           = tim_period / 2;
43
44
    TIM_OC2Init(TIM1, &TimerOCInitStructure_1);
45
46
   /* Compare Register 2 konfigurieren */
47
   TimerOCInitStructure_2.TIM_OCMode          = TIM_OCMode_PWM1;
48
   TimerOCInitStructure_2.TIM_OutputState     = TIM_OutputState_Enable;     // Nur Normal_State Pins aktvieren
49
   TimerOCInitStructure_2.TIM_OutputNState    = TIM_OutputNState_Disable;
50
   TimerOCInitStructure_2.TIM_OCIdleState     = TIM_OCIdleState_Reset;
51
   TimerOCInitStructure_2.TIM_OCPolarity      = TIM_OCPolarity_High;
52
   TimerOCInitStructure_2.TIM_Pulse           = tim_period / 2;
53
54
   TIM_OC2Init(TIM1, &TimerOCInitStructure_2);
55
56
   /* Compare Register Preload */
57
   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
58
   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
59
60
   /* Compare Register INT de-aktivieren */
61
   TIM_ITConfig(TIM1,TIM_IT_CC1,DISABLE);
62
   TIM_ITConfig(TIM1,TIM_IT_CC2,DISABLE);
63
64
   /* Comapre Outputs aktivieren */
65
   TIM_CtrlPWMOutputs(TIM1, ENABLE);
66
67
   TIM_Cmd(TIM1, ENABLE);

von aSma>> (Gast)


Lesenswert?

Du brauchst kein remap. Steht alles in Referenz Manual.

von Christian J. (Gast)


Lesenswert?

Diese Antwort ist erstens falsch, zweitens sinnfrei als Einzeiler und 
ein RTFM Verweis auf das umfangreiche Manual, was keinerlei Bezug zur 
den Funktionen der StdPeriphLib hat wenig zielführend.

Es funktionier schon einwandfrei. In den Beispielen der StdperiphLibs 
ist nämlich auch ein Fehler drin. Da fehlt

TIM_CtrlPWMOutputs(TIM1, ENABLE);

zum Aktivieren der Ports.

Ansonsten: Thread erledigt.

von aSma>> (Gast)


Angehängte Dateien:

Lesenswert?

Christian J. schrieb:
> Diese Antwort ist erstens falsch, zweitens sinnfrei als Einzeiler und
> ein RTFM Verweis auf das umfangreiche Manual, was keinerlei Bezug zur
> den Funktionen der StdPeriphLib hat wenig zielführend.

"Umfangreich". Nice.

Eher du hast kein Bezug zu deiner Hardware.

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.