STM32F4 Discovery Led, Frequenz

(Firma: matzetronics) #4258675
Lesenswert?
• ▲
▼
Ich nehme mal an, du hast das STM32F407 Discovery? Dann ist es nicht so 
kompliziert, die orangene LED (GPIOD Pin 13) mit PWM zu betreiben.
Zuerst initialisiere mal den Pin auf die Alternate Function als PWM 
Ausgang:
1
void PortsInit(void)
2
{
3
GPIO_InitTypeDef GPIO_InitStructure;
4

5
    GPIO_StructInit(&GPIO_InitStructure);
6
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
7
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
8
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  // slow speed is more than sufficient here
9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
10
    GPIO_Init(GPIOD, &GPIO_InitStructure);
11
}
Gut, als nächstes brauchen wir den Timer 4. Kanal 2 der PWM hängt 
zufällig an der orangenen LED:
1
void TIM4_Init(void){
2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
3
TIM_OCInitTypeDef TIM_OCInitStructure;
4
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
5
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
6
  TIM_TimeBaseStructure.TIM_Period = 2100;
7
  TIM_TimeBaseStructure.TIM_Prescaler = 10000;
8
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
9
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
10
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
11
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
12
  TIM_ARRPreloadConfig(TIM4, ENABLE);
13

14
  TIM_OCStructInit(&TIM_OCInitStructure);
15
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
16
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
17
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
18
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
19
  TIM_OCInitStructure.TIM_Pulse = 1050;
20
  TIM_OC2Init(TIM4, &TIM_OCInitStructure);
21
}
Wenn du diese beiden Unterprogramme aufgerufen hast, ist alles bereit 
für die blinkende LED. Es fehlt nur noch ein
1
TIM_Cmd(TIM4,ENABLE);
und die LED fängt an zu blinken. Die Puls/Pausendauer stellt du mit
1
TIM_OCInitStructure.TIM_Pulse = 1050;
ein, das ich auf die halbe Periodendauer des Timers gesetzt hatte, damit 
ist das Puls/Pausenverhältnis 1:1.
Die Frequenz des Blinkens wird mit dem Vorteiler und dem 
Periodenregister des Timers eingestellt:
1
  TIM_TimeBaseStructure.TIM_Period = 2100;
2
  TIM_TimeBaseStructure.TIM_Prescaler = 10000;
Das ist sehr langsam, damit man was sehen kann. Höhere Frequenzen 
erreichst du mit kleineren Werten für Prescaler und Periodendauer.
Ok, es bleibt nur noch das Auslesen des ADC und eine Update Routine für 
den Timer. Das überlasse ich erstmal dir, falls es Probleme damit gibt, 
meldest du dich nochmal.
(Firma: matzetronics) #4258900
Lesenswert?
• ▲
▼
Mic schrieb:
> Kannst du mir behilflich sein das umzusetzen.

Für eine LED hab ich dir den Weg aufgezeigt, nun bist du gefragt. Zum 
ADC kommen wir dann später.
Mach also erstmal, das alle 4 LED timergesteuert blinken. Dazu schaust 
du in die Liste der Alternate Function Pins und guckst, ob und welche 
PWM Kanäle an welcher LED liegen.
Die LED am Platinenrand unterliegt nicht deiner Kontrolle, die ist am 
Boardcontroller.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.