Forum: Mikrocontroller und Digitale Elektronik STM32 PWM änderung Verständnisproblem


von Fabian (Gast)


Lesenswert?

Hallo zusammen,

arbeite hier mit einem STM32 und
schaffe es auch nach der Initialisierung eine PWM
zu erzeugen!

Nun möchte ich diese im laufenden Betrieb ändern können...

so lag meine Vermutung, dass ich mit

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_Pulse = CCR1;      //Pulsebreite
TIM_OC1Init(TIM3, &TIM_OCInitStructure);   //Initialisieren Channel 1 
Timer 3

den 3 Befehlen die PWM breite aktualisiere.
Andere Einstellungen des Channels verbleiben ja so.


Wo ist der Denkfehler?

Irgendwo hab ich es mit direkt Registerzugriff gesehen,
würde aber gerne bei der StandartLib bleiben

von (prx) A. K. (prx)


Lesenswert?

Manche Änderungen an Timer-Registern werden erst mit einem Update-Event 
aktiv. Das muss man u.U. manuell auslösen.

von fdssd (Gast)


Lesenswert?

beim LPC17xx  kann man die werte verändern und muss dann die register 
updaten
damit  ist sichergestellt das die kanäle weiterhin synchron laufen

das selbe gibts auch beim STM .. wo das in der LIB ist weiß ich  leider 
nicht

von Mike R. (thesealion)


Lesenswert?

Ich denke mal du willst die An/Aus Zeit der PWM verändern, wenn ja geht
das eigentlich ganz einfach mit:
1
TIM_SetCompare1(TIM3, 0);

Hier ist das Kanal 1 (angefangen bei 1) von Timer 3.

Wenn das nicht klappt lass uns doch mal deine komplette Initalisierung 
sehen.

von RP6Conrad (Gast)


Lesenswert?

Geht recht einfach : PWM mode TIM1 : die Tastverhaltnis lasst sich dan 
einstellen mit
  TIM1->CCR1=1500; //test 1.5 ms voor servo1 (channel1)
  TIM1->CCR4=1825; //test 1.825 ms voor servo 4(channel 4)
Frequenz aenderen :
 TIM1->ARR=9999;
Init (musst du auch noch GPIO und Clocks configurieren)
[c]
void Timer_Config(void)
{
    /* 
-----------------------------------------------------------------------
    TIM1 Configuration: generate 2 PWM signals with 2 different duty 
cycles:
    TIM1CLK = 24 MHz, Prescaler = 23, TIM1 counter clock = 1 MHz
    TIM1 ARR Register = 19999=> TIM1 Frequency = TIM1 counter clock/(ARR 
+ 1)
    TIM1 Frequency = 50 Hz.
    TIM1 Channel1 pulse lenght = TIM1->CCR1 value gives servo between 
1000 and 2000 µs
    TIM1 Channel4 pulse lenght = TIM1->CCR4 value gives servo between 
1000 and 2000 µs
  ----------------------------------------------------------------------- 
*/
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  /* Time base configuration TIM1*/
  TIM_TimeBaseStructure.TIM_Period = 19999;//PWM freq. = 1MHz/20000 = 
50Hz
  TIM_TimeBaseStructure.TIM_Prescaler = 23;// Timer loopt aan 24 MHz/24 
= 1MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  /* PWM1 Mode configuration: TIM 1, Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
  /* PWM1 Mode configuration: TIM 1, Channel4 */
  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
  TIM_Cmd(TIM1, ENABLE);
  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);[/]

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.