mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 invertierte PWMs erzeugen


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe Schwierigkeiten ein inverses PWM zu einem anderen zu erzeugen. 
Ich möchte im Grunde genommen zwei LEDs abwechselnd leuchten lassen. Um 
dies zu erreichen, möchte ich mit Channel 3 und 4 von Timer 4 jeweils 
zwei 50%-PWMs erzeugen. Bei einem müsste der Ausgang bis zum Erreichen 
des Capture/Compare-Wertes high, danach low sein. Beim anderen eben 
umgekehrt. Leider klappt das nicht so, wie ich mir das vorstelle. Hier 
mal der Code bis dahin:
  TIM_TimeBaseStructure.TIM_Period = 999;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  ...

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR5_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC3Init(TIM4, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
  
  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR5_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

  TIM_OC4Init(TIM4, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM4, ENABLE);

Ich hatte gehofft richtig verstanden zu haben, dass diese Zeile hier
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

mir dabei hilft, das Signal entsprechend zu verändern. Scheint aber 
nichts zu bringen. Ich krieg aber auch nicht so richtig raus, was die 
nun eigentlich bewirkt. Mit dem Oszi seh ich keinen Unterschied. :(
Naja, ich hab dann versucht im Datenblatt genauer nachzulesen. Wenn ich 
es richtig verstehe, dann gibt es im CCER von Timer 4 für jeden der vier 
Channels des Timers ein Bit für die "output polarity" (CCxP). Also 
dachte ich mir, setze ich die von Hand. Daraus sind folgende zwei 
Codezeilen entstanden.
  TIM4->CCER |= (1<<9);
  TIM4->CCER &= ~(1<<13);

Ihr könnt euch vorstellen, dass die erhoffte Wirkung ausblieb. Daher 
meine Frage: Wie krieg ich das hin? Ja, ich bin Neuling auf dem Gebiet. 
Und ja, daher sollte ich mich wohl erstmal mit einfacheren 
Mikrocontrollern auseinandersetzen. Sry, also für die doofen Fragen, 
aber ich mache das hier halt auch nicht wirklich freiwillig. :(

Danke im Voraus
Sebastian

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin mir jetzt nicht ganz sicher, probiere mal den Timer im 
Down-Count Mode laufen zu lassen.

Oder

TIM_SetCompare3(TIM4, PrescalerValue - DeinWert);

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal!

Vielen Dank für die schnelle Antwort, das Problem saß aber (wie so oft) 
vor dem Rechner. ;)

Eigentlich hat es die ganze Zeit funktioniert, leider ist mein Oszi wohl 
nicht ohne weiteres in der Lage, dies richtig anzuzeigen. Ein 
Kommilitone konnte mir schnell auf die Sprünge helfen.

Liebe Grüße
Sebastian

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.