PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM *VERWIRRT SEI*



Christian Sturm
10.05.2007, 18:03
Hallo, sicher ist das schon 1Mio. mal angesprochen worden....
aber bitte habt erbarmen, ich verstehe es einfach nicht....

Habe heute allein 4 Stunden recherchiert... aber es verwirrt mich immer mehr...

Also ich möchte einen Schrittmotor möglichst stufenlos beschleunigen/bremsen können.

Ich versuche mal meine Gedanken zu ordnen, und ihr meckert dann über meine Fehler, damit ich es verstehe... :)

Ich versuche einfach mal ne beliebiges Modell....

Also:
- Der Avr hat eine Frequenz... sagen wir von einem Quartz vorgegeben (20.000 Hz)
- Der Prescale gibt die Teilung an, also wie die 20Khz geteilt werden.
(8,16,....) nehmen wir die 1024 ... also 20.000 / 1024 =19,53 Hz..

Das würde also bedeuten, daß der Interrupt 19,53 mal pro Sekunde ausgelöst werden würde... ich also ne PWM Frequenz von 19,53 Pulsen pro Sekunde hätte.

Der Duty Cycle / Width gibt die Pulslänge an... also wie lange High geschaltet wird...

Soweit eigentlich alles klar...

Aber was ich nicht verstehe... um die Frequenz varieren lassen zu können, um die Geschwindigkeit zu verändern müßte ich entweder den Prescale ständig verändern (Ich GLAUBE das geht nur in groben Schritten, klärt mich auf...) oder aber ich müßte den Maxcount des Timers verändern...
Oder ich muß einen weg haben eine flexibele Anzahl von Interrupts pro
Timer"durchlauf" zu generieren.

Bitte erleutert mir mal, wie ich die Geschwindigkeit feinjustierbar verändere? Bitte möglichst simpel.. ich habe echt Probleme mich da reinzudenken...

Mir gehts echt um eine möglichst variable Geschwindigkeitsveränderung in feinen Stufen....

Ich weiß es geht jemanden der es weiß auf den Zünder immer alles wiederkäuen zu sollen, aber ich habe mich viel zu voll gelesen, und stehe nun orientierungslos auf der Weide ;)

Ich muß den Hintergrund kennen, um mir eigene Gedanken machen zu können, aber bin gerade von Zweifeln und Desorientierung geplagt...

Wäre lieb....

Lieber Gruß
Chris

dr_Bal
10.05.2007, 18:35
Hallo Chris,

ich habe zwar auch noch keine Praktischen Erfahrungen dazu , aber in diesen beiden Tutorials steht was zum Thema:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM#Was_bedeutet_PWM.3F

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29


Ronny

Christian Sturm
10.05.2007, 18:51
Ich weiß.... ich habe reichlich tutorials durch... aber ich suche immernoch die Antwort nach der Änderung der Frequenz....

Danke trotzdem...

Lieber Gruß
Chris

wanderer
10.05.2007, 19:57
Alsoooo... du veraenderst nicht die frequenz sondern den zustand wie lange der PWM HIGH ist.. sehr gut ist das auf dieser grafik:
https://www.roboternetz.de/wiki/uploads/Main/pwm.gif

Das ganze nennt man soviel ich weiss den duty cycle.. sehhhr gut erklaer hier:

https://roboternetz.de/wissen/index.php/Pulsweitenmodulation

Christian Sturm
10.05.2007, 20:00
Jup, nur die Periode ist auf der Darstellung doch gleich... um einen Schrittmotor zu beschleunigen, muß ich doch den Highpegel nicht länger sondern die Periode kürzer machen?

Sorry, stelle mich anscheinend extra blöd an :(

Edit: Also bei einem Rechteck muß die Duty 50% der Periode einnehmen... gut aber wie verkürze ich denn nun die Periode variabel und fein?

wanderer
10.05.2007, 20:08
du veraenderst den duty, nicht die periode! (oder vertue ich mich?)

Hackes
10.05.2007, 20:27
Hallo,

also hab da auch nicht sooooviel Ahnung von, aber...

damit Du nicht noch verwirrter wirst, kann es sein (oder versehe ich mich) ist in der Grafik von Wanderer ein Fehler!? Eine Periode geht immer von einem gleichen Punkt zum gleichen Punkt. Ok, schwer auszudrücken! Grins. Wenn die Periode an der ersten steigenden Flanke anfängt, dann muß sie auch an der zweiten steigenden Flanke aufhören! Im Bild hört sie aber erst bei der fallenden Flanke auf (bei langsam)!!!

Gelernt habe ich das alles mal mit der PWM aber danach in der Praxis nicht mehr gebraucht. ABER, ich kenne PWM eigentlich nur für "normale" Motoren (dauererregt bzw. mit Hilfsenergie erregt) um die Geschwindigkeit zu regeln. Wenn ich mich jetzt nicht verdenke, dann macht das doch beim Schrittmotor keinen Sinn!!! Seine Geschwindigkeit wird über die Frequenz in der Abfolge (Ansteuerung) seiner einzelnen Wicklungen gesteuert! Da ist doch nix mit PWM, oder?

Wenn ich mich da jetzt total verhauen habe, dann haut mich jetzt! ;-)

Gruß, Hackes.

radbruch
10.05.2007, 20:35
Impuls(sagtmanso?) und duty zusammen bilden die Periode.

In der Interrupt-Routine zählst du eine Variable hoch und immer, wenn diese Variable einen bestimmten Wert erreicht hat, endet der Impuls und duty beginnt. Wenn die Variable den Endwert erreicht hat(günstig ist z.b.255) endet auch duty und der neue Impuls beginnt. Die Variable wird wieder auf null gesetzt und das Ganze endlos wiederholt.

Die Länge des Impuls ist die Pulsweite, die moduliert wird, indem der Vergleichswert zum Umschalten verändert wird. Die Periodendauer ist die Zeit zwischen den Interrupts mal dem Endwert der Zählvariablen und bleibt immer konstant.

Aber eigentlich geht das ja am Thema vorbei, den Schrittmotoren werden per Frequenz angesteuert und nicht mit Pulsweiten. Im Ansatz ähnlich zählt auch hier eine Interruptroutine eine Zählvariable hoch. Beim Erreichen des Endwerts wird der Ausgang umgeschaltet und die Zählvariable auf null gesetzt. Das ergibt den Takt für den Schrittmotor, die Fequenz wird durch verändern des Endwertes eingestellt, Periodendauer ist dann Interruptabstand mal Endwert geteilt durch zwei.

Christian Sturm
10.05.2007, 21:55
Wow, super... ja genau so.... jetzt raffe sogar ichs ;)

Vielen Dank an Alle Beteiligten, und nen extra Danke an den letzten Poster...

Lieber Gruß
Chris

Christian Sturm
11.05.2007, 02:48
Denke ich habs so richtig gemacht mit der Frequenzlänge (Flanke>Flanke).

Wie könnte man es besser machen?

Jetzt fehlt noch die Duty(Highflankenlänge)... das Ding mit den Compares.... aber wie baut man das hier ein?

Ihr sollt nicht für mich progen, sondern mir einfach nen Tipp geben...
Das ich gewillt bin zu lernen habe ich mit diesem wundervollen Snippet ja bewiesen ;)

Guckt mal bitte rüber... würde mich über etwas konstruktive Tipps freuen...
und falls sich einer mit der Duty auskennt, sind Infos dringend erwünscht...

Vielen Dank nochmal für Eure Hilfe... ich hätte es sonst nie gerafft....

Lieber Gruß
Chris



$regfile = "m8def.dat" 'AtMega8
$crystal = 16000000 '16Mhz Quartz

Dim Verzoegerung As Integer 'Verzögerung = erhöhen der Timerdifferenz
Dim Z As Integer 'Z = Zähler zum entprellen des Tasters (Entpreller)

Ddrd = &B11100000 'Ein und Ausgabeports definieren

Verzoegerung = 0 'Zum Start keine Verzögerung

Config Timer1 = Timer , Prescale = 64'Timer1 auf den aktuellen Timer setzen, Teiler 64
Enable Timer1 'Timer aktivieren
On Timer1 Isr_von_timer1 'Wenn der Timer überläuft zu Interrupt wechseln
Enable Interrupts 'Interruptbehandlung starten

Timer1 = 64000 - Verzoegerung 'Pulslänge =65535 - 64000 - 0


Do 'Hauptprogramm

If Pind.2 = 1 Then 'Wenn Taster 1 gedrückt dann....

Z = Z + 1 'Entpreller hochzählen
If Z = 100 Then 'wenn Du genug geprellt hast gehts weiter :)
Z = 0 'Entpreller zurücksetzen
Verzoegerung = Verzoegerung + 1 'Verzögerung erhöhen
End If
End If


If Pind.3 = 1 Then 'Wenn Taster 2 gedrückt dann...

Z = Z + 1 'Entpreller hochzählen
If Z = 100 Then 'wenn Du genug geprellt hast gehts weiter :)
Z = 0 'Entpreller zurücksetzen
Verzoegerung = Verzoegerung - 1 'Verzögerung verringern
End If
End If



Loop
End




Isr_von_timer1: 'Interrupt Service
Timer1 = 64000 - Verzoegerung ' Timer1 auf Startwert setzen
Toggle Portd.6 ' Toggle an Portd.6


Return

Christian Sturm
11.05.2007, 18:37
Jemand hier der den Bascom-Compiler kennt? ;) :P

Also, wenn ich es richtig sehe... muß ich in dem Interrupt die Diferrenz in zwei Teile teilen (im Verhältnis meiner High und Low Flankenlänge)...

Das hieße also zum Beispiel:



Timer1high=(Timer1-64000-verzoegerung)*0.65
Timer1low=(Timer1-64000-verzoegerung)*0.35


Ist der Gedanke so richtig?

Gut, jetzt müßte ich eine Schleife laufen lassen:


do
if timer1<Timer1high then
Pind.5=1
else
Pind.5=0
end if
loop

timer1=64000-Verzoegerung


Mag mich noch jemand unterstützen?

Lieber Gruß
Chris