Forum: Mikrocontroller und Digitale Elektronik STM32 Timer mode ändern


von SebastianR (Gast)


Lesenswert?

Hallo,

ich arbeite mit einem STM32F103ZG (STM3210E-EVAL board) und möchte den 
TIM8 im PWM Mode für motor control verwenden. Ich habe ein PWM-Beispiel 
aus der std. peripheral lib entsprechend für den TIM8 angepasst, sodass 
er im PWM mode arbeitet, d.h. ich sehe das korrekte Signal mit dem Oszi.
Das funktioniert aber nur, wenn ich bei der Initialisierung
1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
verwende.
Später kann ich den Timer mode irgendwie nicht mehr ändern. D.h. zum 
einen deaktiviert
1
TIM_CCxCmd(TIM8, TIM_Channel_1, TIM_CCx_Disable);
den Channel nicht --> ich sehe weiterhin dsa PWM Signal.
Andererseits geht es auch nicht, wenn ich den Timer mit
1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
initialisiere, und später versuche in PWM mode zu schalten:
1
TIM_SelectOCxM(TIM8, TIM_Channel_1, TIM_OCMode_PWM1);
2
TIM_CCxCmd(TIM8, TIM_Channel_1, TIM_CCx_Enable);

Mein Gesamtprojekt ist momentan an das BLDC Beispiel von den 
mikrocontroller.net Seiten angelehnt, d.h. der Code ist mit diesem 
praktisch identisch. Fehlt dort evtl. noch etwas, was mein Problem 
auslöst?

Danke im Voraus!

Gruß
Sebastian

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


Lesenswert?

Ich mach BLDC mit Timer1 weil ich die DeadTime brauche, aber wie siehts 
bei dir mit dem Locklevel aus ?
1
  TIM_BDTRStructInit(&TIM_BDTRInitStructure);
2
  /* Automatic Output enable, Break, dead time and lock configuration*/
3
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
4
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
5
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
6
  TIM_BDTRInitStructure.TIM_DeadTime = deadTime;
7
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
8
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
9
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
10
  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
Der Code in dem Beispiel hier war mir persönlich zu verwurschtelt, daher 
kann ich sonst nichts dazu sagen.

von SebastianR (Gast)


Lesenswert?

Hi,

danke soweit. Die BDTR Initialisierung sieht bei mir genauso aus wie bei 
dir.
Außerdem klingt das bei dir so, als bietet TIM8 nicht die Möglichkeit, 
eine dead time einzustellen. TIM1 und TIM8 haben doch identische 
Funktionalität, richtig?

Sebastian

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


Lesenswert?

Beim STM32F100RB ( auf dem Discovery VL Board) ist nur Timer 1 ein 
'Advanced Timer' mit komplementären Ausgängen und Totzeit. Den STM32F103 
muss ich mal nachgucken...
Habs getan. Du hast recht, dein XL Device hat 2 'Advanced Timer' und 
Timer8 ist der zweite. Den gibts bei mir nicht.
Übrigens schalte ich meine Kommutation direkt mit dem TIMx->CCER 
Register um, per Tabelle. Geht schneller als über die Library. Manchmal 
machen die ganz schön Gedöns in den Library Routinen.

von SebastianR (Gast)


Lesenswert?

Stimme dir zu mit den Library Funktionen. Das wäre dann ein Ansatzpunkt 
für die Optimierung in der Zukunft.
Jedenfalls nehme ich jetzt bei der Init structure gleich den Modus 
TIM_OCMode_PWM1 anstatt _Timing.
Keine Ahnung warum es anders nicht geht - so tut es auf jeden Fall.

Sebastian

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.