STm32F103: Probleme mit den Compare Registern Timer 1

Gast #5116608
Lesenswert?

Hallo,

ich bin etwas auf dem Schlauch, da es mal funktioniert und mal nicht und 
die Ursache einfach nicht offensichtlich zu sein scheint.

Es sollen einfach ein paar LEDs an Schieberegistern gedimmt werden über 
den OE Pin. Klappt auch soweit aber sobald ich Compare Kanal 1 des 
Timers 1 hinzu nehmen will um auch noch die Display beleuchtung zu 
dimmen geht es nicht mehr :-( Benutz sind PA8 und PA9 des uC, der Timer 
wurde auch remapped auf diese Pins.

Jemand da eine Idee?

Gedimmt wird mit

/* Helligkeitsregelung: Compare Wert / Duty Cycle variieren */
    TIM_SetCompare2(TIM1,DCValue * (float)LDR_Value / 100);

Sobald ich diese Zeilen hinzu nehme, spielt die Dimmung auf Kanal 2 
nicht mehr. Oszi habe ich leider keines.

#define TIM1_FREQ     15                     // 15 ms = 150 Hz
const uint32_t DCValue =  TIM1_FREQ * 10;    // 10-fache Periode
1
 /* Compare Register Channel 1 konfigurieren (Display) */
2
   TimerOCInitStructure.TIM_Pulse           = DCValue / 2;
3
   TIM_OC1Init(TIM1, &TimerOCInitStructure);
1
GPIO_InitTypeDef  GPIO_InitStructure;
2

3
    /* Clocks einschalten */
4
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
5

6
    /* HC595_CTRL konfigurieren */
7
    GPIO_StructInit(&GPIO_InitStructure);
8
    GPIO_InitStructure.GPIO_Pin   = HC595_DS | HC595_STCP | HC595_SHCP | HC595_MR;
9
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
    GPIO_Init(HC595_CTRL, &GPIO_InitStructure);
12

13
    GPIO_ResetBits(HC595_CTRL,HC595_MR);        // Master Reset = Shift Register loeschen
14
    GPIO_SetBits(HC595_CTRL,HC595_MR);
15

16
    //GPIO_SetBits(HC595_PWM,HC595_OE);         // Outputs = Z-State
17
    GPIO_ResetBits(HC595_CTRL,HC595_STCP);      // Storage Register = LOW
18
    GPIO_ResetBits(HC595_CTRL,HC595_SHCP);      // Shift Register = LOW
19

20
/* Timer 1 aktivieren und remappen */
21
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
22
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);
23

24
    /* Der Timer clock'ed mit 36Mhz, einstellen auf 200Hz */
25
   TIM_TimeBaseStructInit(&TimerBaseInitStructure);
26
   TimerBaseInitStructure.TIM_CounterMode   = TIM_CounterMode_Up;
27
   TimerBaseInitStructure.TIM_Prescaler     = tim_presc;
28
   TimerBaseInitStructure.TIM_Period        = DCValue;
29
   TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
30
   TIM_TimeBaseInit(TIM1, &TimerBaseInitStructure);
31

32
   /* Compare Register allgemeine Einstellungen */
33
   TimerOCInitStructure.TIM_OCMode          = TIM_OCMode_PWM1;
34
   TimerOCInitStructure.TIM_OutputState     = TIM_OutputState_Enable;
35
   TimerOCInitStructure.TIM_OCPolarity      = TIM_OCPolarity_Low;
36

37
   /* Compare Register Channel 1 konfigurieren (Display) */
38
   TimerOCInitStructure.TIM_Pulse           = DCValue / 2;
39
   TIM_OC1Init(TIM1, &TimerOCInitStructure);
40

41
   /* Compare Register Channel 2 konfigurieren (LEDs) */
42
   TimerOCInitStructure.TIM_Pulse           = DCValue / 2;
43
   TIM_OC2Init(TIM1, &TimerOCInitStructure);
44

45
   /* Predload Register Kanal 1 und 2 einschalten */
46
   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
47
   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
48

49
   /* Compare Register INT de-aktivieren */
50
   TIM_ITConfig(TIM1,TIM_IT_CC1,DISABLE);
51
   TIM_ITConfig(TIM1,TIM_IT_CC2,DISABLE);
52

53
   /* Timer 1 Main Outputs aktivieren und los */
54
   TIM_ARRPreloadConfig(TIM1, ENABLE);          /* PreLoad Register aktivieren */
55
   TIM_CtrlPWMOutputs(TIM1, ENABLE);            /* PWM Ausgänge aktivieren */
56
   TIM_Cmd(TIM1, ENABLE);                       /* Timer 1 los ! */
57
}
Gast #5116632
Lesenswert?

Edit:

Es kann doch nicht sein, dass die Reihenfolge dieser Sequenz 
entscheidet, ob das funzt oder nicht?

Ausführlich, auch wennn die Werte im struct ja erhalten bleiben und die 
die bei beiden gleich sind nicht doppelt gesezt werden müssen. 
Vertausche ich diese beiden Blöcke miteinander klappt die PWM nicht 
mehr.

Bahnhof?

 /* Compare Register Channel 1 konfigurieren (Display) */
   TimerOCInitStructure.TIM_OCMode          = TIM_OCMode_PWM1;
   TimerOCInitStructure.TIM_OutputState     = TIM_OutputState_Enable;
   TimerOCInitStructure.TIM_OCPolarity      = TIM_OCPolarity_Low;
   TimerOCInitStructure.TIM_Pulse           = DCValue / 2;
   TIM_OC1Init(TIM1, &TimerOCInitStructure);

   /* Compare Register Channel 2 (LEDs) */
   TimerOCInitStructure.TIM_OCMode          = TIM_OCMode_PWM1;
   TimerOCInitStructure.TIM_OutputState     = TIM_OutputState_Enable;
   TimerOCInitStructure.TIM_OCPolarity      = TIM_OCPolarity_Low;
   TimerOCInitStructure.TIM_Pulse           = DCValue / 2;
   TIM_OC2Init(TIM1, &TimerOCInitStructure);
Gast #5116640
Lesenswert?

DraconiX schrieb:
> Christian J. schrieb:
>> TIM_OC1Init(TIM1, &TimerOCInitStructure);
>
> Und..
>
> Christian J. schrieb:
>> TIM_OC2Init(TIM1, &TimerOCInitStructure);
>
> Finde den Fehler. ;-)

Ja, wo denn ???? Das eine ist CC1 und das andere CC2, also 2 Kanäle.... 
habe ich denn Tomaten auf den Augen?
Beitrag #5116644 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren