• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PWM: Algorythmus zur Berechnung von Impulsen

BDG

Mitglied
Hallo Freunde.

Ich habe einen kleine mini-computer (raspberry pi) mit digitalen programmierbaren Ausgängen (pins).
Nun will ich durch Pulsweitenmodulation (PWM) machen, dass der Motor auch unterschiedlich schnell fahren kann...
So geht das ja nicht, da es digitale Ausgänge sind, die nur "AN" und "AUS" kennen.
Also nehme ich als Frequenz 5millisekunden. Also bei einer Geschwindigkeit von 100% ist der Pin durchgehend an. Bei 50 % ist er 2,5ms an dann 2,5ms aus. Bei 10 % ist er 0,5ms an, dann 4,5ms aus. Und so weiter.

Nun will ich eine schleife die von 1% bis 100% durchläuft, und die jeweilige Prozent-Zahl 0.5 sekunden lang läuft.
Allerdings klappt das noch nicht wirklich! Hier mal mein bis jetziger Code :

http://pastebin.com/Qs3KYi4t (auf Pastebin, weil das hier nie eingerückt und alles war :( )

Was ist daran falsch ? Die funktion "currentPercent" soll jeweils einem Div immer die jetzige Prozentzahl anzeigen lassen...
Allerdings ist die Prozent-zahl die ganze Zeit auf 0, und ca. nach 20 sekunden sofort auf 100.
Was mache ich falsch ?

Mit freundlichen Grüßen,

BDG
 
Zuletzt bearbeitet:
Werbung:
Also wenn ihr nichts damit anfangen könnt, vergesst das mit dem PWM.
Es geht ja darum, dass ich zwei schleifen ineinander habe, und am ende der äßeren schleife soll immer ein Wert verändert werden,
mit dem hier : echo "<script> currentPercent(".$p."); </script>";
Aber da wird nichts geändert. An der JS-Funktion liegts nicht... Er ändert es ja, aber nur beim letzten durchlaufen der Schleife.
Also beim hundertsten mal, die Schleife geht ja bis hundert. Wieso wird sonst immer dieses "echo" ja anscheinend nicht aufgerufen ?
 
Wie sieht denn die JavaScript-Funktion currentPercent() aus? Meine Vermutung ist gerade, dass man sie nur 1 Mal aufrufen kann - du müsstest JavaScript-Fehler in der Konsole sehen.
 
Werbung:
Die sieht ganz einfach so aus : function currentPercent(percent){document.getElementById('currentPercent').innerHTML=percent;}
Aber wenn man sie tatsächlich nur einmal aufrufen könnte, würde sie doch gleich beim ersten mal aufgerufen werden und bei 1 stehen bleiben. So ist sie aber die ganze Zeit auf 0 und ganz am Ende auf 100.
 
Ne, die ist nur einmal da...
Aber ich hab was vielleicht interressantes:
Ich hab mal jede Schleife vor dem "echo 'script ausführe()'" ein "echo $percent" gehängt.
Wenn ich mir jetzt nach diesen 20 sekunden, wenn da wieder hundert steht, die ausgabe angucke sieht die so aus :
<script> currentPercent(0); </script>
"0 "
<br>
<script> currentPercent(1); </script>
"1 "
<br>
Und immer so weiter... Aber dieses <script> sollte da doch garnicht so stehen! Das wird doch ausgeführt undso...
Das sieht da jetzt so aus, als würde das geschrieben werden, aber nicht ausgeführt :(
Und ich hab euch ja bereits gesagt, am Ende, die "100" wird angezeigt. Aber Am ende bei hundert steht das genauso im html:
<script> currentPercent(100); </script>
Allerdings wird das ja anscheinend ausgeführt!
Hilfeee :( :D
 
Werbung:
Logisch. Ich dachte das wäre deine Absicht? Für welche Prozentzahl soll die Funktion denn tatsächlich ausgeführt werden?
 
Ja, für alle von 0 bis 100. Und bei jedem Prozent eben nochmal 100 "runden", wo die jeweilige prozentzahl berechnet ist, und verarbeitet wird. Ja das soll von 0 bis 100 gehen, aber angezeigt wird nur 0 und nach 2 Sekunden oder so dann schon "100"...
Das ist ja falsch. Die Funktion zum verändern des Textes wird ja bei jedem neuen Prozent aufgerufen...
 
Ich frage mich, wie Du das mit der PWM mit PHP machen willst. Du musst doch deine digitalen Ausgänge sehr schnell, alle paar Millisekunden, umschalten. IMO müsstest Du das rein mit JS machen.
PS: Die Timerfunktionen von JS erlauben ja nur eine Auflösung von 1 ms. Müsstest Du da nicht ein C-Programm nehmen?
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Ja, vielleicht mach ich das soäter auch einfach so, dass ich in php nur ein Script anfange und stoppe,
dass dann aber lokal liegt... Falls php da zu langsam ist oder so...
Aber das Problem besteht trotzdem :(
 
Zurück
Oben