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
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.