STM32 - DC Motor - PWM Steuerung - Period/Pulse

OP #5009194
Lesenswert?

Hallo zusammen, ich versuche einen code zu schreiben, der einen DC Motor 
durch PWM Signal steuert. Da ich zu haus keinen Motor habe, steuert das 
Programm in dem Fall die Helligkeit eine LED. Die Frage ist, wie soll 
ich die TIM.Period und TIM.Pulse einstellen, wenn ich die LED gegen den 
Motor austausche? Ich kenne mich damit nicht so gut aus.

Der Programm soll bei jedem Klick, die Geschwindigkeit des Motors um 25% 
erhohen. Bei 100% soll der Motor so schnell wie moglich umdrehen, das 
heisst, 100% im dem Programm (case 4) soll genau die echte 100% Kraft 
des Motors entrsprechen.

EDIT: Macht es eine Unterschied, welche Werte ich bei TIM.Period und 
TIM.Pulse eingebe, solange die gleich sind? Dreht der Motor 
schneller/langsamer? Wenn TIM.Period und TIM.Pulse gleich sind, liegt 
der PWM ja bei 100%, oder?

Infos zu dem Clock:

SYSCLK = 64Mhz
HCLK = 16MHz
HSE = 24Mhz
PLL_M = 12
PLL_N = 192
PLL_P = 6

Infos zu dem Board:
STM32F407
L297N

Code:
1
#include <stm32f4xx_gpio.h>
2
#include <stm32f4xx_rcc.h>
3
#include <stm32f4xx_tim.h>
4

5
int pwm = 83.99;
6

7
void init_pwm_gpi()
8
{
9
    GPIO_InitTypeDef GPIO_InitStructure;
10
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
12
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* Use the alternative pin functions */
13
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* GPIO speed - has nothing to do with the timer timing */
14
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* Push-pull */
15
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* Setup pull-down resistors */
16
    GPIO_Init(GPIOA, &GPIO_InitStructure);
17
}
18

19
void init_pwm_gpo()
20
{
21
    GPIO_InitTypeDef GPIO_InitStructure;
22
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
23
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
24
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; /* Use the alternative pin functions */
25
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* GPIO speed - has nothing to do with the timer timing */
26
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* Push-pull */
27
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* Setup pull-down resistors */
28
    GPIO_Init(GPIOD, &GPIO_InitStructure);
29
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
30
}
31

32
int my_init_pwm(int pwm_freq)
33
{
34

35
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE );
36

37
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
38
    TIM_TimeBaseStructInit(& TIM_TimeBaseStructure);
39
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
40
    TIM_TimeBaseStructure.TIM_Period = 8399;
41
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
42
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;
43
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
44

45
    TIM_OCInitTypeDef  TIM_OCInitStructure;
46

47
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
48
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
49
    TIM_OCInitStructure.TIM_Pulse = pwm_freq;
50
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
51

52
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);
53
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
54

55
    TIM_Cmd(TIM4 , ENABLE);
56

57
}
58

59
int main(void)
60
{
61
  SystemInit();
62
  init_pwm_gpi();
63
  init_pwm_gpo();
64

65
    while(1)
66
    {
67
      static int i = 0;
68
      int pressedlvl = 0;
69
      int releasedlvl = 0;
70
      int pressed = 0;
71

72
      while (1) {
73
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){
74
          pressedlvl++;
75
              if(pressedlvl>8000){
76
                if(pressed==0){
77
                  switch(i){
78
                              case 0: my_init_pwm(pwm*0);
79
                              i = i + 1;
80
                              break;
81
                              case 1: my_init_pwm(pwm*25);
82
                              i = i + 1;
83
                              break;
84
                              case 2: my_init_pwm(pwm*50);
85
                              i = i + 1;
86
                              break;
87
                              case 3: my_init_pwm(pwm*75);
88
                              i = i + 1;
89
                              break;
90
                              case 4: my_init_pwm(pwm*100);
91
                              i = 0;
92
                              break;
93
                              }
94
                  pressed = 1;
95
                }
96
                pressedlvl = 0;
97
              }
98
            } else {
99
              releasedlvl++;
100
              if(releasedlvl>8000){
101
                pressed = 0;
102
                releasedlvl = 0;
103
              }
104
            }
105
          }
106
    }
107
}

Danke im Voraus :)
Gast #5009489
Lesenswert?

Pedro R. schrieb:
> Die Frage ist, wie soll
> ich die TIM.Period und TIM.Pulse einstellen, wenn ich die LED gegen den
> Motor austausche?

Prinzipiell wählt man die Frequenz so klein wie möglich, um 
Schaltverluste klein zu halten. Bei LEDs ist dies typischerweise 50-200 
Hz, weil man bei noch kleineren Frequenzen ein Flackern sieht. Beim 
Motor hat man das Problem, dass der Wirkungsgrad bei kleinen Frequenzen 
kleiner wird und das die Frequenz, wenn im falschen Bereich, sehr gut zu 
hören ist, was man manchmal vermeiden möchte. Idealerweise nimmt man 1-2 
kHz, wenn man kein Pfeiffen haben möchte, noch höher.

Für einen ersten Test würde der Motor auch so laufen. Prinzipiell sollte 
die Zahl in TIM.Period aber kleiner (-> höhere Frequenz) sein als für 
die LED. Dementsprechend auch TIM.Pulse anpassen.

> Macht es eine Unterschied, welche Werte ich bei TIM.Period und
> TIM.Pulse eingebe, solange die gleich sind?
Wenn Pulse==Period gibt es keine PWM (100%). Es macht also keinen 
Unterschied, welche Werte da drin stehen. Wenn die PWM aber benutzt wird 
(Pulse<Period) greifen die Aspekte wie oben beschrieben.

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