Forum: Mikrocontroller und Digitale Elektronik PWM Signal mit STM32


von har (Gast)


Lesenswert?

Hallo liebes Forum,

ich möchte auf dem STM32F303 eine PWM erzeugen. Takt soll 1kHz betragen 
und das Tastverhältnis 10%.
Als Orientierung habe ich folgendes Tutorial genommen: 
http://www.diller-technologies.de/stm32.html#timer
Leider bringe ich es trotz der Vorlage nicht zustande, eine PWM auf dem 
Pin PA0 erzeugen zu können.
Mein Code lautet:
1
#include <stm32f30x.h>
2
3
#include <stm32f30x_gpio.h>
4
#include <stm32f30x_rcc.h>
5
#include <stm32f30x_tim.h>      // for Timer
6
7
8
// prototypes
9
void InitializeTimer(int period);
10
void InitializeLEDs(void);
11
void InitializePWMChannel(void);
12
void RCC_Configuration(void);
13
14
15
void InitializeTimer(int period)
16
{
17
    // 1kHz Signal
18
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
19
20
    TIM_TimeBaseInitTypeDef timerInitStructure;
21
    timerInitStructure.TIM_Prescaler = 71;
22
    timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
23
    timerInitStructure.TIM_Period = period;
24
    timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
25
    //timerInitStructure.TIM_RepetitionCounter = 0;
26
    TIM_TimeBaseInit(TIM2, &timerInitStructure);
27
    TIM_Cmd(TIM2, ENABLE);
28
}
29
30
31
32
void InitializePWMChannel()
33
{
34
    TIM_OCInitTypeDef outputChannelInit; // = {0,};
35
    outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1;
36
    outputChannelInit.TIM_OCIdleState = TIM_OCIdleState_Reset;
37
    outputChannelInit.TIM_OCNIdleState = TIM_OCNIdleState_Set;
38
    outputChannelInit.TIM_OutputState = TIM_OutputState_Enable;
39
    outputChannelInit.TIM_OutputNState = TIM_OutputNState_Disable;
40
    outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High;
41
    outputChannelInit.TIM_OCNPolarity = TIM_OCNPolarity_High;
42
    outputChannelInit.TIM_Pulse = 100;
43
44
    TIM_OC1Init(TIM2, &outputChannelInit);
45
}
46
47
48
49
void InitializeLEDs()
50
{
51
    GPIO_InitTypeDef gpioStructure;
52
    gpioStructure.GPIO_Pin = GPIO_Pin_0;
53
    gpioStructure.GPIO_Mode = GPIO_Mode_AF;
54
    gpioStructure.GPIO_Speed = GPIO_Speed_50MHz;
55
    GPIO_Init(GPIOA, &gpioStructure);
56
    //GPIO_PinAFConfig (GPIOA, GPIO_PinSource0, GPIO_AF_2);   //??
57
}
58
59
60
61
void RCC_Configuration()
62
{
63
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    // Enable peripheral clock for Timer2
64
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);     // Enable peripheral clock for GPIOA
65
}
66
67
68
69
int main ()
70
{
71
    RCC_Configuration();
72
73
    InitializeLEDs();
74
    InitializeTimer(999);
75
    InitializePWMChannel();
76
77
78
79
    while(1)
80
        {
81
82
        } //while(1)
83
} //main

Findet jemand eventuell einen Fehler bzw. fehlt noch etwas in der 
Konfiguration?
Bin für jede Hilfe dankbar!

von hp-freund (Gast)


Lesenswert?

Die Zeile mit den Fragezeichen hat schon einen Sinn.
Sieh dir die noch mal genau an.


https://visualgdb.com/tutorials/arm/stm32/pwm/

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


Lesenswert?

har schrieb:
> //GPIO_PinAFConfig (GPIOA, GPIO_PinSource0, GPIO_AF_2);   //??

Auskommentiert? Bin nicht der Spezi für die F3xx Serie, aber beim F4xx 
ist sowas angesagt:
1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);
Debei gehe ich aber davon aus, das diese AF Funktion auch möglich ist, 
das steht in deinem Reference Manual.

von har (Gast)


Lesenswert?

Danke für eure Hilfe. Es funktioniert jetzt.

Allerdings funktioniert der jeweilige Timer immer nur auf dem GPIO mit 
Channel 1.

z.B.: Ich kann auf dem Pin PA0 eine PWM erzeugen (weil da TIM2_CH1).
Auf PA1 (hier ist TIM2_CH2 vorhanden), gelingt mir wiederum nicht.

Das gleiche gilt für andere GPIOs mit anderen Timern:
auf Pin PC6 (TIM3_CH1), PWM-Signal vorhanden, aber zB auf PC7 (TIM3_CH2) 
wiederum nicht.

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


Lesenswert?

har schrieb:
> z.B.: Ich kann auf dem Pin PA0 eine PWM erzeugen (weil da TIM2_CH1).
> Auf PA1 (hier ist TIM2_CH2 vorhanden), gelingt mir wiederum nicht.
Dazu musst du dann statt dieser Zeile

> TIM_OC1Init(TIM2, &outputChannelInit);
1
TIM_OC2Init(TIM2, &outputChannelInit);
schreiben, natürlich wieder mit AF Konfiguration:
1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2);

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.