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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.