Hier
Beitrag "Re: STM32 Servoansteuerung PWM"
hab ich nen Code gepostet zum steuern von Servos über den STM32F4, was
ja auch per PWM passiert. Damit kann man dann auch LED's dimmen, das
ggf. noch durch Änderung der Parameter optimieren (Prescaler, Period,
Pulse)
Niklas Gürtler schrieb:> Hier> Beitrag "Re: STM32 Servoansteuerung PWM"> hab ich nen Code gepostet zum steuern von Servos über den STM32F4, was> ja auch per PWM passiert. Damit kann man dann auch LED's dimmen, das> ggf. noch durch Änderung der Parameter optimieren (Prescaler, Period,> Pulse)
Und durch vergleich sehe ich keinen Unterschied?!
Pief schrieb:> for(i=0;i<1000;i++)> {> TIM_Cmd(TIM4, DISABLE);>> TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;> TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;> TIM_OCInitStructure.TIM_Pulse = i;> TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;> TIM_OC4Init(TIM4, &TIM_OCInitStructure);> TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);>> TIM_ARRPreloadConfig(TIM4, ENABLE);> delay();> }
das ist nicht ganz der richtige weg,
bin jetzt nicht gerade im saft,
aber du reinitialiserst ständig diesen pwm
das ist eine timing sache.
soll: im prinziep gibst du dem timer im laufenden betrieb
den neuen wert, ohne die die anderen register neu zu bespielen
abgesehen davon ist das jede menge code für eine pwm steuerung
gib mir mal ne sekunde,
such eben mal den zugriff raus
lass die initialisierung in deiner schleife weg und schreibe stattdessen
1
TIM4->CCR1=Deine_Variable;
2
TIM4->CCR2=Deine_Variable;
3
.
4
.
5
.
ich weiß auch garnicht ob das so sinnvoll ist,
dass was du machst!
deine pwm braucht mehrere zyklen,
und wenn ich das richtig sehe,
würgst du den schon mitten drin ab
mit dem direktzugriff,
wird die pwm einmal durchgeführt,
und dann wird der nächste wert übernommen,
aber wenn der spaß mehrere zyklen dauert,
und du mit jeden zyklus mit +1 inkrementierst,
kann es sein das dieser eine wesentlich höhere zahl übernimmt
Danke für die antworten, aber sorry leute: ICh versteh nur bahnhof
Das mit jedem jedes mal neu initialisieren erscheint mir als einziger
Weg überhaupt ansatzweise zu funktionieren. Wenn ich nur den
Pulsbreitenwert einmal beschreibe (ohne for-schleife) tut sich gor nix.
Ich muss mindestens den TIM abschalten und wieder abschalten.
@Flo: Wieso würge ich die PWM ab? Ich hab doch ein fettes delay
eingebaut.
Niklas Gürtler schrieb:> Hier> Beitrag "Re: STM32 Servoansteuerung PWM"> hab ich nen Code gepostet zum steuern von Servos über den STM32F4, was> ja auch per PWM passiert. Damit kann man dann auch LED's dimmen, das> ggf. noch durch Änderung der Parameter optimieren (Prescaler, Period,> Pulse)
Sorry, ich hab zu vorschnell abgewiesen. Ich guck mir deinen Code
nochmal genauer an und studiere ihn. Danke dafür.
Pief schrieb:> @Flo: Wieso würge ich die PWM ab? Ich hab doch ein fettes delay> eingebaut.
Bei den 168 MHz die so ein STM32F4 hat ist das delay jetzt gar nicht mal
sooo lang. Je nachdem wie der Timer eingestellt ist...
das delay selbst hab ich jetzt übersehen,
tut aber nichts zur sache...
stimmt die länge des delay nicht,
haste da ein problem
schau dir mal die pheripherie datasheet mal an,
da steht auch die funktionsweise der register
da siehste dass das hw pwm für sich selbst arbeitet,
da musste selbst nicht manuell neu starten,
und übergibst nur den neuen wert (pulsbreite)
den er beim nächsten zählen übernimmt...
du mischt gerade soft und hardware pwm!!!
deswegen einmal kurz nachlesen!
Was ich eigentlich möchte ist die LED dunkel nach hell zu fahren. Das
ist der SInn der For-Schleife. Ich dachte das geht aus dem Code hervor,
hat aber jetzt keiner so verstanden, oder?
Ich möchte einfach das Duty Cycle von 0% nach 100% laufen lassen.
während setcompare (den befehl so kannte ich noch garnicht),
quasi das macht, was ich schon vorhin versucht habe dir zu erklären,
also den wert in das entsprechende register reinschreibt,
und der mc selbsständig darauf zurückgreift, ohne(!) den timer zu
stoppen
deine intialisierung in der schleife hat zur folge, dass
bei jedem zugriff (!) der timer gestoppt (!)
der wert neu gesetzt wird, und der timer neu gestartet wird,
mit anderen worten, der kommt garnicht zum zählen,
da dieser wieder gestoppt wird um neu beschrieben zu werden
verstehste was ich meine?
btw. statt dem delay kannste auch ein timerinterrupt auslösen lassen,
der den wert um einen erhöhen lässt,
und ins register schreiben lässt.
die main while schleife kann frei bleiben
Florian G. schrieb:> verstehste was ich meine?
Jau danke.
Florian G. schrieb:> die main while schleife kann frei bleiben
Jau verstehe ich auch, wollts ja nur testen. Irgendwo hier im Forum hab
ich mir ne funktionierende PWM abgeschaut die das leider genauso macht
mit dem deinitialisieren, beschreiben, neuinitialisieren. Jeztt hab ich
wieder was dazu gelernt.
moin kein ding,
vor 3 monaten stand ich genau vor dem selben problem,
deswegen wusste ich auch auf anhieb wo das problem lag ^^
sag mir mal eben mit welcher standart pheripherie library du arbeitest?
da ich gerade auf den sprung bin,
schau dir das nvic register an,
da gibs du an welcher interrupt ausgelöst werden soll,
bei welcher "source"...
aber was meinst du genau mit "frequenz"?