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
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.