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.
Gast #4258770
Lesenswert?

Hi,

Vielen Dank erstmal!

ich habe folgendes Board: (STM32F4 - Discovery)

http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF252419

Das Board besitzt ja 4 Leds (rot,orange,grün und blau) und zwei rote 
aussen am Board.

Ich möchte über zwei Potis (unabhängige) :

1. Poti - die Leds dimmen (4Leds)
2. Frequenz ändern (4Leds)

Kannst du mir behilflich sein das umzusetzen.

Danke!
(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

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