mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Knifflige Timer-Verschaltung bei STM32 - wer hat den Durchblick?


Autor: Robert B. (robertb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mit dem TIM3 OC1 einen Bitstrom generieren, welcher durch 
einen zweiten Timer (TIM1 mit OC1) eingeschaltet werden kann. 
Ausgeschaltet wird der Bitstrom durch das Compare-Match-Interrupts OC2 
des TIM3 (der zählt quasi mit und stoppt den TIM3 nach einer wechselnden 
Anzahl von Bits).

Gebraucht wird also:

TIM1-OC1: _________|--------|__________________|----------|___________
TIM3-OC1: _________|-|_|-|_|-|_|-|_|-|_________|-|_|-|_|-|_|-|________
nur als Hilfe:
TIM3-OC2: __________|___|___|___|___|___________|___|___|___|________
TIM3-CEN: _________###################_________###############_________

Folgender Auszug aus Main:
  /* Compute the prescaler value */
  PrescalerValue = (uint16_t) (SystemCoreClock / (1000*1000)) - 1;    /* TIM3 Peripheral Configuration ----------------------------------------*/
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 300-1;    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  
  TIM_ARRPreloadConfig(TIM3, ENABLE);
  
  /* Output Compare Active Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 100;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  // important to make pulse change in NEXT period

  /* Output Compare Active Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_Pulse = 20;
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);

  /* Output Compare Active Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 150;
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);

//  TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular);  // avoid 
//  TIM_UpdateDisableConfig(TIM3, ENABLE);
  
  /* Slave Mode selection: TIM3 */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
//  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
  TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);

  /* TIM IT enable */
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);

//  TIM_GenerateEvent(TIM3, TIM_EventSource_Update);
  

  /* TIM1 Peripheral Configuration ----------------------------------------*/
  /* Time Base configuration */
  PrescalerValue = (uint16_t) (SystemCoreClock / (1000*1000)) - 1;  // 1MHz
  TIM_TimeBaseStructure.TIM_Period = 20000-1;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  
  TIM_ARRPreloadConfig(TIM1, ENABLE);
  
  /* Channel 1 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 10000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
    
  /* Master Mode selection */
  TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC1Ref);
  /* Select the Master Slave Mode */
  TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);

  TIM_CtrlPWMOutputs(TIM1, ENABLE); 

  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);

  /* TIM1 counter enable */
  TIM_Cmd(TIM3, ENABLE);

Das restliche Programm manupuliert die Timer nicht, außer dass das TIM3 
OC1 Interrupt den TIM nach einer gewissen Zeit ausschaltet.

PROBLEM:

Grundsätzlich funktioniert die Triggerung. Allerdings bekomme ich es 
nicht hin dass mit der (testweise) ausgegebenen steigenden Flanke von 
TIM1 OC1 auch TIM3 OC1 high wird. Vielmehr dauert es noch fast eine 
TIM3-Periode bis TIM3-OC1 TIM1-OC1 folgt und die Sequenz ausgegeben 
wird. Die Verspätung entsteht weil ich TIM3 ja ausschalte und mit 
"undefinierten" Zählerstand belasse bis der nächste Trigger durch 
TIM1-OC1 ausgelöst wird. Absolut passend wäre es statt "Trigger Mode" 
den "Reset Mode" zu verwenden, welcher dann auch den TIM3 Zähler 
resetten würde. Jedoch funktioniert dann gar nicht mehr weil wohl die 
gesamte? Timer-Konfiguration resettet wird. Ein Einschalten des "Update 
disable"-Bits (UDIS) bzw. ein Eingrenzen des Updates mit dem "Update 
request source"-Bit (URS) brachte auch nicht das gewünschte Ergebnis. 
Ein weiterer Versuch war es, den TIM3 nicht per CEN auszuschalten 
sondern per One-Pulse-Mode in einem definierten Zustand abzuschalten. 
Leider wechselt dann der TIM3-OC1 Ausgang mit dem letzten Zähltakt von 
TIM3 auf high, was für mich völlig unbrauchbar ist.

Hat jemand noch einen Tipp?

Über Vorschläge wäre ich sehr sehr dankbar!

Grüße
Robert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.