PWM in CubeMX

Gast #5789391
Hallo, hat hier zufällig schon jemand bei einem STM32F4-Board eine PWM 
im "One Pulse Mode" in STM32CubeMX konfiguriert?

Laut Datenblatt lässt sich hier ein Delay und eine Pulslänge einstellen. 
Ich habe in CubeMX wie auf dem Foto zu sehen nur die beiden Optionen 
"Counter Period" und "Pulse" um etwas einzustellen ("Pulse" steht aber 
hierbei NICHT dafür, dass nur ein einziger Puls ausgegeben werden soll, 
der Modus "One Puls Mode" wird nämlich an anderer Stelle in der 
Pin-Out-Ansicht eingestellt)

Ich gehe mal schwer davon aus, dass "Counter Period" wie sonst auch 
meine Zählerschritte insgesamt sind und "Pulse" die Anzahl der 
Delay-Schritte..
PWM Mode 2 steht übrigens für einen LOW-Puls bei normal High

Da mein Timer mit 84 MHz versorgt wird, habe ich bei den Einstellungen 
auf dem Foto erwartet, dass 25 Schritte a 1 Mikrosekunde gezählt werden, 
davon 1 mit Delay und 24 Schritte "Signal LOW".... stattdessen bekomme 
ich einen LOW-Puls mit einer exakten Länge von 20 Mikrosekunden... wie 
kann das sein?

PS: Delay ist übrigens bei meiner Anwendung nicht gewünscht..

Hoffe, hier hat das schon mal jemand in Cube gemacht ;)
Angehängte Dateien:
Gast
In Prescaler, wie auch in Counter Period sind die Gewünschten Werte -1 
einzutragen.

Prescaler: 84-1
Counter Period: 25-1

SW4STM32 kommt damit klar, ich schätze andere IDEs auch.
Gast
Bevor ich unpassend antworte erlaube mir eine Rückfrage:
Ist Dir wichtig, die Aufgabe zu erledigen, oder ist Dir gerade wichtig, 
es mit CubeMX zu machen?
CubeMX erzeugt dir nur den Initialisierungs-Code.

Den Rest mußt du schon selber machen und dazu ist das Lesen und 
Verstehen der Doku unabdingbar.

Und Nein!
Du kannst mit CubeMX nicht den/die Timer im Detail konfigurieren.
Das wäre auch totaler Blödsinn, da diese Einstellungen i.d.R. erst zur 
Laufzeit bekannt sind.
Gast
Cube MX wurde mir als Zukunft in der Industrie vorgestellt (keine Fehler 
bei grundlegenden Bausteinen von Header und Source-Dateien etc.)

Und der generiert mir nun mal den Code unter Verwednung von HAL und ihr 
könnt mir nicht erzählen, dass im Dtaenblatt was von HAL angegeben ist. 
Genau das MUSS ich aber dokumentieren
Gast
zur Betonung.. es geht hier nicht um die Programmierung selbst, sondern 
wirklich nur eine "Anleitung" für CubeMX.. mir war es eigentlich schon 
klar, dass die Meisten das hier nicht können... und es muss möglich 
sein, den Puls genau dort zu konfigurioeren. Denn es wurden keine 
weiteren Usercodes verwendet und er spuckt mir einen 20 
Mikrosekunden-Puls aus.... deswegen wirklich nur an die Leute, die das 
wirklich schon mal mit CubeMX gemacht haben!
philjk schrieb:
> Cube MX wurde mir als Zukunft in der Industrie vorgestellt (keine Fehler
> bei grundlegenden Bausteinen von Header und Source-Dateien etc.)
>
Marketing-Blabla

> Und der generiert mir nun mal den Code unter Verwednung von HAL und ihr
> könnt mir nicht erzählen, dass im Dtaenblatt was von HAL angegeben ist.
> Genau das MUSS ich aber dokumentieren

Da bist du grob im Irrtum!
CubeMX erzeugt "Initialisierungs-Code" - nicht mehr, aber auch nicht 
weniger.

HAL musst du schon selbst verstehen und die Hardware ebenfalls.
das steht alles in den Datenblättern, App-Notes und Sourcecode.

Es ist alles dokumentiert.

Es gibt nur nicht "das eine Dokument" daß dich von Null auf 100 bringt.
Gast
philjk schrieb:
> keine Fehler bei grundlegenden Bausteinen

Blöderweise hat sich CubeMx an diesem Punkt mit zahlreichen Mängeln 
hervor getan.

> und ihr könnt mir nicht erzählen, dass im Dtaenblatt was von
> HAL angegeben ist.

Das ist das nächste Problem: ein Layer zu viel. Um den generierten Code 
zu verstehen, musst du die 2000 Seiten Anleitung der HAL lesen. Um den 
zu verstehen, musst du 1500 Seiten Referenzhandbuch lesen.

Ohne HAL wäre der Lesestoff nur halb so umfangreich und man bekäme keine 
Knoten ins Hirn.

Wenn ST die Datenblätter so strukturieren würde, wie Atmel es getan hat 
dann wären die Datenblätter zwar 4000 Seiten lang, sie wären dann aber 
so gut verständlich, dass niemand eine HAL bräuchte und schon gar keinen 
Code Generator.
Stefanus F. schrieb:
> Das ist das nächste Problem: ein Layer zu viel. Um den generierten Code
> zu verstehen, musst du die 2000 Seiten Anleitung der HAL lesen. Um den
> zu verstehen, musst du 1500 Seiten Referenzhandbuch lesen.
>
> Ohne HAL wäre der Lesestoff nur halb so umfangreich und man bekäme keine
> Knoten ins Hirn.

Wenn man das nicht versteht, mangelt es an Vorwissen.

Niemand hat behauptet, daß das was für Amateure wäre.
Ein "Arduino-Ersatz" ist das schon mal gar nicht!

Stefanus F. schrieb:
> Wenn ST die Datenblätter so strukturieren würde, wie Atmel es getan hat
> dann wären die Datenblätter zwar 4000 Seiten lang, sie wären dann aber
> so gut verständlich, dass niemand eine HAL bräuchte und schon gar
> keinen Code Generator.

Das glaubst auch nur du!
Wenn man nur ein paar LEDs blinken lassen will, mag das zutreffen, aber 
bei umfangreicheren Projekten kann man mit HAL -wenn man es denn 
verstanden hat- eine menge Zeit sparen.
Gast
Harry L. schrieb:
> Niemand hat behauptet, daß das was für Amateure wäre.
> Ein "Arduino-Ersatz" ist das schon mal gar nicht!

Mir ist das klar, dieses Tool wird aber wie ein Spielzeug beworben. Den 
Managern wird erzählt, dass sie ihre gut ausgebildeten Spezialisten in 
die Wüste schicken können, um die eigene Software von dumme Affen 
zusammen klicken zu lassen. Wenn man dann aus der Wüste (Consulting) 
zurück kommt, darf man den Affenstall sauber machen.
Stefanus F. schrieb:
> Harry L. schrieb:
>> Niemand hat behauptet, daß das was für Amateure wäre.
>> Ein "Arduino-Ersatz" ist das schon mal gar nicht!
>
> Mir ist das klar, dieses Tool wird aber wie ein Spielzeug beworben. Den
> Managern wird erzählt, dass sie ihre gut ausgebildeten Spezialisten in
> die Wüste schicken können, um die eigene Software von dumme Affen
> zusammen klicken zu lassen. Wenn man dann aus der Wüste (Consulting)
> zurück kommt, darf man den Affenstall sauber machen.

Das ist völliger Humbug!
Sowas behauptet niemand außer ein paar Schlaumeier in den diversen 
Foren, die noch nie über die Grundkonfiguration hinaus gekommen sind.
Gast
bevor jetzt eine Diskussion ausartet, die nicht weiterbringt...

wie programmiert ihr eingesessenen Profis denn eine einfache PWM als 
One-Puls in der Mikrocontroller-Familie?... vielleicht habe ich ja was 
übersehen
Verwendet wird ein Kanal eines Timers als Ausgang
philjk schrieb:
> bevor jetzt eine Diskussion ausartet, die nicht weiterbringt...
>
> wie programmiert ihr eingesessenen Profis denn eine einfache PWM als
> One-Puls in der Mikrocontroller-Familie?... vielleicht habe ich ja was
> übersehen
> Verwendet wird ein Kanal eines Timers als Ausgang

z.B. so:
1
  htim2.Instance->PSC = 27;
2
  htim2.Instance->CCR3 = 1;
3
  htim2.Instance->ARR = 1;
4
  htim2.Instance->DIER = TIM_DIER_UIE;  // enable Interrupt on Update
5
  HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_3);
Gast
Und wie würdest du das machen, dass kein Delay und eine Pulslänge von 20 
Mikrosekunden auftritt?

Bei mir sieht das genau so aus:

htim4.Instance = TIM4;
  htim4.Init.Prescaler = 84;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 25;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OnePulse_Init(&htim4, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != 
HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM2;
  sConfigOC.Pulse = 1;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != 
HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */

  /* USER CODE END TIM4_Init 2 */
  HAL_TIM_MspPostInit(&htim4);

Ich möchte nachvollziehen können, warum dadurch genau diese Pulslänge 
zustande kommt

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.