Forum: Mikrocontroller und Digitale Elektronik PWM in CubeMX


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von philjk (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
bringt mir halt für die Konfiguration in CubeMX überhaupt nichts... 
darum gehts doch hier

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kannst natürlich auch selber rechnen und 83 und 24 eintragen.

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bei Counter Period machgt das ja Sinn, aber warum denn beim Prescaler?

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und die zustande gekomme Pulslänge von 20 Mikrosekunden ist damit leider 
auch nicht geklärt

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
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?

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
es ist wichtig es mit CubeMX zu machen, da die eingetragenen Werte dort 
nachvollziehbar sein sollen

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ok, dann halte ich mich raus - mangels Erfahrung.

von Christopher J. (christopher_j23)


Bewertung
0 lesenswert
nicht lesenswert
philjk schrieb:
> Bei Counter Period machgt das ja Sinn, aber warum denn beim Prescaler?

Weil ein Wert von 0 im PSC den Takt eben nicht durch 0 teilt. Das wäre 
ja auch fatal ;)

CubeMX hin oder her, um das Reference Manual kommst du nicht herum. 
Alles andere ist nur stochern im Nebel.

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert
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.

von philjk (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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

von philjk (Gast)


Bewertung
1 lesenswert
nicht lesenswert
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!

von Harry L. (mysth)


Bewertung
-1 lesenswert
nicht lesenswert
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.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Harry L. (mysth)


Bewertung
1 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert
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.

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert
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);

von philjk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert
philjk schrieb:
> Ich möchte nachvollziehen können, warum dadurch genau diese Pulslänge
> zustande kommt

Das wird im Timer-Cookbook ausführlich erklärt.

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]
  • [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.