Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery Led, Frequenz


von Mic (Gast)


Lesenswert?

Hi,

kann mir jemand bitte behilflich sein bei der Dimmung und Frequenz 
Regelung über ein Potentiometer. Gibt es offene Quellcodes? Bin leider 
im Netz nicht fündig geworden.

Vielen Dank

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Mic (Gast)


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!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
von Markus H. (markushehn)


Lesenswert?

Wenns um die Grundlagen zum STM32 geht, kann das Tutorial hier 
behilflich sein:
http://diller-technologies.de/stm32.html

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.