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.
Etwas taktlos, das Remapping der AFIO einfach so zu nutzen.
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.
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.
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.
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.
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 ;)
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.
jo soweit bin ich es geht jetzt nur noch darum den wert upzudaten aber das bekomme ich noch irgendwie hin ;) vielen dank
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.