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 ;)
Das Timer-Cookbook kennst du bereits? https://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf
bringt mir halt für die Konfiguration in CubeMX überhaupt nichts... darum gehts doch hier
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.
Und die zustande gekomme Pulslänge von 20 Mikrosekunden ist damit leider auch nicht geklärt
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?
es ist wichtig es mit CubeMX zu machen, da die eingetragenen Werte dort nachvollziehbar sein sollen
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.
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.
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
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.
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.
:
Bearbeitet durch User
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.
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); |
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.