Forum: Mikrocontroller und Digitale Elektronik STm32F103: Probleme mit den Compare Registern Timer 1


von Christian J. (Gast)


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
}

von Christian J. (Gast)


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);

von DraconiX (Gast)


Lesenswert?

Christian J. schrieb:
> TIM_OC1Init(TIM1, &TimerOCInitStructure);

Und..

Christian J. schrieb:
> TIM_OC2Init(TIM1, &TimerOCInitStructure);

Finde den Fehler. ;-)

von Christian J. (Gast)


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?

von Bla (Gast)


Lesenswert?

Christian J. schrieb:
> Oszi habe ich leider keines.

Die Saleae Logic-Klone die man für 4 Euro aus China bekommt sind für 
digitale Signale (SPI, PWM) ein sehr hilfreiches debug-Tool.

Beitrag #5116644 wurde von einem Moderator gelöscht.
von Christian J. (Gast)


Lesenswert?

Erledigt, habs schon gefunden.

von Auch Eina (Gast)


Lesenswert?

Christian J. schrieb:
> Erledigt, habs schon gefunden.

Wenn du schon das Forum rebellisch machst könntest du ja
wenigstens auch die Lösung deines Problems andeuten.

von Christian J. (Gast)


Lesenswert?

Auch Eina schrieb:
> Wenn du schon das Forum rebellisch machst könntest du ja
> wenigstens auch die Lösung deines Problems andeuten.

Steht doch schon da... sieht doch jeder. Ganz einfach halt.

>> DraconiX schrieb:
>> Finde den Fehler. ;-)

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.