Forum: Mikrocontroller und Digitale Elektronik Konfiguration eines Timers auf dem STM32F100RB6


von Björn C. (bjoernc) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo, ich habe derzeit ein Problem mit der Konfiguration des Timer3 auf 
dem STM32. Diesen möchte ich für eine PWM nutzen um eine LED einfach 
entsprechend in ihrer Helligkeit zu steuern - um mich entsprechend in 
den STM32 einzuarbeiten. Jedoch funktioniert das ganze nicht so wie ich 
es mir vorgestellt habe. Ich habe mich für die Konfiguration an den 
Beispielen der Library entlang gehangelt. Dabei ist das problem, das die 
PWM bzw. der Timer anscheinend nichts macht. Leider kann ich den Fehler 
nicht weiter eingrenzen. Ein Hardware Fehler kann ich jedoch 
ausschließen, da die LED funktioniert wenn ich sie direkt ansteuere.

Ebenfalls habe ich versucht das Beispiel selbst auf dem Mikrocontroller 
laufen zu lassen, dabei fiel mir auf, dass die LED ebenfalls nicht 
leuchtet. Ich hoffe ihr könnt mir dahin gehend helfen den Fehler zu 
finden. Achja für den Test benutze ich das discoveryboard von STM. Anbei 
habe ich den Sourcecode (zT. gekürzt als Anhang mit angehängt).
Vielen Dank für eure Mühen.

von (prx) A. K. (prx)


Lesenswert?

Etwas taktlos, das Remapping der AFIO einfach so zu nutzen.

von Björn C. (bjoernc) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo A.K. hmm ja AFIO läuft das war dummerweise in dem Sourcecodeteil 
den ich gekürzt habe. Jedoch hängt der Timer und die GPIO's an APB1, 
AFIO ist aber nur auf APB2 definiert - der ist aktiv (wird im 
button-init aktiviert) von daher könnte es leider nicht daran liegen. 
Damit auch wirklcih alle erforderlichen Daten vorhanden sind, hänge ich 
einfach mal die gesamte Datei an.

von (prx) A. K. (prx)


Lesenswert?

Björn Cassens schrieb:

> Hallo A.K. hmm ja AFIO läuft das war dummerweise in dem Sourcecodeteil
> den ich gekürzt habe.

Die Taktlosigkeit ist zwar nur zeitweilig, aber es reicht. Schau dir mal 
die Reihenfolge an. Anfangs kommt initLed und definiert TIM3 Remapping, 
erst danach wird in initButton die AFIO versorgt.

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

A.K. ich habs auch grad gesehen - damit bestätigt sich mal wieder, der 
Fehler sitzt meist 50 cm vor dem Bildschirm.
Aber ein kleines Problem habe ich noch und zwar soll ein Interrupt 
ausgelöst werden, nachdem der Timer ein Outputcompare hat, jedoch habe 
ich in der Library nichts entsprechendes gefunden halt nur Capture 
Compare aber das ist ja eigentlich das falsche - oder versehe ich mich 
da grad?
Und wenn ich richtig Liege wie heißt dieser Interrupt in der Library?

Und hab vielen Dank für deine Hilfe.

von (prx) A. K. (prx)


Lesenswert?

Björn Cassens schrieb:

> ausgelöst werden, nachdem der Timer ein Outputcompare hat, jedoch habe
> ich in der Library nichts entsprechendes gefunden halt nur Capture
> Compare aber das ist ja eigentlich das falsche - oder versehe ich mich

Mit der ungeliebten Lib darfst du mir nicht kommen, aber 
CC=Capture/Compare ist für den Compare schonmal richtig.

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

hmm ja die Lib ist nun ja nicht immer so angenehm und zT. sehr lieblos 
dokumentiert so dass man sich den Code schon anschauen muss dennoch 
hilft sie mir ein wenig bei den ersten Schritten ;)

von (prx) A. K. (prx)


Lesenswert?

Tipp: Es gibt pro Timer nur einen einzigen Interrupt-Handler, egal 
welcher CC-Channel klingelt, aus egal aus welchem Grund. TIM3_IRQHandler 
wär also mal ein Ansatz.

von Björn C. (bjoernc) Benutzerseite


Lesenswert?

jo soweit bin ich es geht jetzt nur noch darum den wert upzudaten aber 
das bekomme ich noch irgendwie hin ;)
vielen dank

von (prx) A. K. (prx)


Lesenswert?

Es gibt ein paar Timer-Register, da kannst Du Werte ohne Ende 
reinschreiben ohne dass es irgendwas bringt. Weil die erst beim Update 
Event wirksam werden, was man u.U. manuell triggern muss.

von Matthias K. (matthiask)


Lesenswert?

Hier ein Bsp. wie ich meine LED Hintergrundbeleuchtungen mit Timer 3 / 2 
Kanäle ansteuere. Takt ist 72 MHZ, STM32F103RE:
1
// ***********************************************************************
2
// PWM Initialisierung LCD- und TFT-Hintergrundbeleuchtung
3
// Timer 3, Kanal 3 (TFT), Kanal 4 (LCD)
4
// Signal: TFTLED, LCDLED
5
// ***********************************************************************
6
void init_pwm_tftlcd (void) {
7
#define TIMER_TAKT3 1000000  /* Timer wird mit 1MHz getaktet */
8
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
9
  TIM_OCInitTypeDef  TIM_OCInitStructure;
10
  uint16_t PrescalerValue;
11
12
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);              // TIMER 3 Takt freigeben
13
  PrescalerValue = (uint16_t) (SystemCoreClock / TIMER_TAKT3) - 1;   // Vorteiler berechnen
14
15
  // Timer Grundkonfiguration
16
  TIM_TimeBaseStructure.TIM_Period = 1000;  // Timer zählt von 0 .. 1000 entspricht 1kHz PWM-Grundfrequenz
17
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
18
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
19
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       // Zählrichtung (hoch)
20
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                   // Timer einstellen
21
22
  // PWM1 Mode Configuration: Kanal 3 PB0=TFTLED
23
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
24
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
25
  TIM_OCInitStructure.TIM_Pulse = 0;                              // Dutty-Cycle:
26
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
27
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
28
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
29
30
  // PWM1 Mode Configuration: Kanal 4 PB1=LCDLED
31
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
32
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
33
  TIM_OCInitStructure.TIM_Pulse = 0;                              // Dutty-Cycle:
34
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
35
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);
36
  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
37
38
  TIM_ARRPreloadConfig(TIM3, ENABLE);
39
  TIM_Cmd(TIM3, ENABLE);
40
}
41
42
...
43
44
// ***********************************************************************
45
// TFT/LCD Hintergrundbeleuchtung - Helligkeit einstellen
46
// Übergabe: anzeige:    0=TFT, 1=LCD
47
//           helligkeit: 0 ... 1000 (0=Aus, 500=50%, 1000=Max.)
48
// ***********************************************************************
49
void set_hgbl (uint8_t anzeige, uint16_t helligkeit) {
50
  TIM_OCInitTypeDef  TIM_OCInitStructure;
51
52
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
53
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
54
  TIM_OCInitStructure.TIM_Pulse = helligkeit;
55
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
56
57
  if (anzeige) {
58
  // TFT Hintergrundbeleuchtung
59
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
60
  } else {
61
    // LCD Hintergrundbeleuchtung
62
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);
63
  }
64
}

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.