Autor | Thema |
---|---|
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 99480
, Pulsweitenmodulation
[26. April 2006 um 08:37]
Hi,
ich wollte mir mit dem AVR eine Motorsteuerung bauen. Gedacht war einen 12V Gleichstrommotor zu nehmen, diesen mit dem passenden IC zu treiben. Ich will aber nicht einfach Aus/links/rechts haben, sondern ich würde gerne die Geschwindigkeit des Motors über eine Pulsweitenmodulation steuern. Da ich das IC und den Motor noch nicht habe, habe ich erstmal nur mit den Leuchtdioden des Boards getestet. Diese kann ich jetzt schön flackerfrei dimmen. Das habe ich so gelöst, das ich mir eine Schleife mit einem Goto Befehl gebaut habe. In der Schleife habe ich die Abfrage der Taster S1 und s2 für eben heller oder dunkler. Die Pulsweite habe ich mit Warteschleifen realisiert. Ich lasse einfach einen Zähler von n nach 0 laufen. Das für hell und für dunkel. Damit die ganze Sache nicht zu schnell dimmt, frage ich nur bei jedem 40 Schleifendruchlauf die Taster ab. Mein Finger ist nicht schnell genug. Die Dimmerwarteschleife zählt insgesamt immer bis 1000. Da könnte ich jetzt noch jede Menge Berechnungen anstellen anstatt einfach nur zu zählen. Hier fängt mein Problem an. Ich würde gerne ausrechnen, wie lange mein Programmabschnitt braucht bis er abgearbeitet wird. Ich weiß das der AVR mit 16MHz arbeitet. Bei jedem Hz kann er einen Befehel abarbeiten. Wenn ich jetzt z.B. addiere, ist das ja nicht nur ein Befehl in der Maschinensprache sondern durchaus mehr. Ich weiß noch von der Z80 Programmierung, das dort eine Liste gab wieviele Prozessortakte welcher Befehl benötigte. Gibt es sowas auch für den AVR und BASCOM? Ich muss ja wissen wie der Compiler z.B. eine IF Abfrage umsetzt. Kann man das dann überhaupt auf das Hz genau ausrechnen? Hier ein Beispiel wie ich mir das Denke: Die Pulsweitenmodulation soll mit 100kHz ablaufen. Diese soll in 256 Stufen unterteilt werden. Also kann ich 390 mal in der Sekunde den Motor regeln oder eben einen Impuls geben. Das wären in Prozessortakten umgerechnet 1600 Hz. Das bedeutet, der Prozessor kann 1600 Befehle abarbeiten bis er mal wieder den Motorausgang ansteuern muss. Wieviel Quellcode sind 1600 Prozessorbefehle? Wenn ich ja da irgendwelche Berechnungen anstellen möchte, muss ich dem entsprechend die Warteschleife daran anpassen. Kann man das überhaupt berechnen, oder mache ich die Warteschleife so groß bis ich auf dem Oszi die richtige Frequenz bekomme? Gruß Neil Geändert von Christian Fruth am 26. April 2006 um 22:32 Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
Reinhard
Überflieger Registriert seit: Sep 2003 Wohnort: Österreich Verein: TRA #10691, AGM Beiträge: 1187 Status: Offline |
Beitrag 99482
[26. April 2006 um 11:12]
Hi Neil,
wenn du dir das wirklich antun willst, must du dich mal schlau machen, ob BASCOM auch ein Assemblerfile erzeugt, das den Maschinencode enthält. Dann kannst du dir von Atmel das Document "AVR Instruction Set" herunterladen und dir ausrechnen wie lange das alles dauert. Wenn du aber Verzweigungen hast, wie oben von dir angedeutet, wird dir auch das nichts nützen, weil dadurch die Ausführungsdauer, ausgenommen in einfachen Fällen, praktisch unvorhersehbar wird. Wenn man wirklich genau wissen will/muss, wie lange der Code zur Ausführung braucht, programmiert man normalerweise in Assembler. So viel zu den schlechten Nachrichten. Es gibt aber auch gute: Du bist nicht der Einzige, der dieses Problem hat. Genau genommen ist es sogar sehr häufig. Deshalb enthalten die AVRs spezielle Timer, die dir diese Arbeit abnehmen. Genau genommen suchst du nach der Output-Compare Unit. Einmal konfiguriert liefert sie dir vollautomatisch das gewünschte PWM Signal wärend dir die volle Rechenleistung des Kerns für andere Tätigkeiten zur Verfügung steht. Eine relativ einfache Erklärung findest du im Datenblatt ab Seite 71 (Timer 0). Am ARV-Board kommst da aber am besten zu den Pins die mit dem mächtigeren Timer 1 verknüpft sind. Alle Informationen dazu findest du ab S85, im speziellen ab S96. Dabei handelt es sich aber, aufgrund der vielen möglichen Optionen, um eine der komplexeren Einheiten des AVR. Das musst du selber wissen, ob du dich damit jetzt schon beschäftigen willst. Gruß Reinhard Geändert von Christian Fruth am 26. April 2006 um 22:32 |
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 99483
[26. April 2006 um 11:30]
Hi,
danke für die schnelle Antwort. Wenn es natürlich solche Timer gibt, wird die Sache schön einfach. Ich gehe mal davon aus, das die irgendwie durch einen einfachen Befehl im Quellcode eingestellt werden. Ich werde mir mal die Seiten antun. Das klingt auf alle Fälle einfacher als das ganze händisch auszurechnen. Gruß Neil Geändert von Christian Fruth am 26. April 2006 um 22:32 Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
CharlyMai
Foren-Prediger
Registriert seit: Mär 2005 Wohnort: Fuhrberg Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598 Beiträge: 1977 Status: Offline |
Beitrag 99496
[26. April 2006 um 18:49]
Hi Neil ...
Du kannst Dir anschauen, welche Befehle wie in dem Assembler umgesetzt werden. Dazu gibt es in Bascom einen Simulator, der die Assembler Befehle einer Zeile in Bascom anzeigt! Ich werde hier nun nicht den Simulator besprechen, da dieses ein eigenes Thema im Kurs wird, und dementsprechend Komplex ist! Weiterhin gibt es in Bascom auch einen speziellen Befehl für eine PWM in Bascom.... suche doch in der Bascom Hilfe einmal nach "Servo" *winkmitdemzaunfahl*, und pass die Timings entsprechend deiner Motorsteuerung an .-) viele Grüße Pierre PS: wir nutzen die Pins der Servo Anschlüsse auf dem Entwickler-Board später einmal als PWM Ausgang! Geändert von Christian Fruth am 26. April 2006 um 22:32 •"Der Glaube an eine bestimmte Idee gibt dem Forscher den Rückhalt für seine Arbeit. Ohne diesen Glauben wäre er verloren in einem Meer von Zweifeln und halbgültigen Beweisen." Konrad Zuse •Konstruiere ein System, das selbst ein Irrer anwenden kann, und so wird es auch nur ein Irrer anwenden wollen. SOLARIS-RMB e.V. AGM |
Christian Fruth
SP-Schnüffler
Registriert seit: Jun 2002 Wohnort: Großfischlingen Verein: Solaris-RMB e.V., RMV 82 e.V. Beiträge: 604 Status: Offline |
Beitrag 99498
[26. April 2006 um 19:21]
hi
Neil Sorry wenn ich mich als außenstehener hier kurz einklinke: Üblicherweise (ich weiß leider nicht ob ihr schon Timer und Interrupte gemacht habt) nimmt man einen Timer, den man die Zeit bis zum nächsten Flankenwechsel herunter zählen läßt, während man selbst sich um die von dir beschriebenen "wichtigen" Berechnungen kümmern kann. Ein Interrupt informiert dich dann darüber, dass der Timer abgelaufen ist, dann machst du einen Flankenwechsel und konfiguriertst den Timer neu, um so die zweite Halbwelle abwarten zu können. Sofort wenn du aus dem Interrupt-Handler heraus gesprungen bist kannst du mit deinen Berechnungen weiter machen als währe nichts geschenen. Mit dieser Vorgehensweise ersparst du dir das Zählen der CPU-Cycles, die dein Programm benötigt. Spätestens wenn du Konstrollstrukturen wie if's und Schleifen in wildesten Kombinationen verwendest, kannst du kaum noch vorhersagen, wieviele Zyklen den Programm verbrät. btw: Es gibt auch einige Atmels, die in ihrem Timer auch gleich einen PWM-Mode anbieten, schau mal im Datenblatt ob das deiner auch kann. Grüße Christian Geändert von Christian Fruth am 26. April 2006 um 22:32 Kiff weniger und freß Pilze, Sei kreativ! - Jens Bögel |
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 99595
[27. April 2006 um 12:38]
Hi,
seid gestern ist eine Nacht vergangen und ich wurde heute wieder aktiv. Aus der Hilfedateihabe ich mir ein Bispielprogramm angeschaut und von www.roboternetz.de habe ich mir noch ein paar Grundlagen zu Servos besorgt. Dabei ist dann ein kleines lauffähiges Programm entstanden womit man mit den beiden Tastern das Servo drehen lassen kann. Es zietert auch nicht, so wie es am Anfang bei dem Test der Hardware getan hat. Hier der Quellcode: Config Servos = 1 , Servo1 = Portd.5 , Reload = 10 'Konfiguriert ein Servo am Port D Pin 5 Ddra = &B11100000 'Setzt Port A Bit 5-7 als Ausgang Ddrd = &B00111111 'Setzt Port D Bit 6-7 als Eingang Portd = &B11000000 'aktiviert den Pullp Widerstand am Eingang Dim S1 As Bit 'Variabel die den Zustand des Schalters S1 speichert Dim S2 As Bit 'Variabel die den Zustand des Schalters S1 speichert Dim I As Byte 'Variabel die sich die Servoposition merkt I = 100 'Soll Servonullstellung sein Enable Interrupts 'Schaltet die Interrupts ein Servo(1) = I 'Fährt das Servo von unbekannt nach Nullstellung Porta.6 = 1 'gelbe LED zeigt an das Programm läuft Hauptprogramm: 'Beginn Hauptprogramm S1 = Pind.6 'Abfragen der Schalter S1 und S2 S2 = Pind.7 If S1 = 0 Then 'Bei Tastendruck S1 wird das Servo eine Position nach links gefahren I = I - 1 Porta.5 = 1 'rote LED zeigt an das Taste gedrückt wurde End If If S2 = 0 Then 'Bei Tastendruck S2 wird das Servo eine Position nach rechts gefahren I = I + 1 Porta.7 = 1 'gruene LED zeigt an das Taste gedrückt wurde End If Servo(1) = I 'neue Servoposition wird angefahren Waitms 25 'Anpassung der Rechnergeschwindigkeit für menschliche Warnehmung If S1 = S2 Then If S1 = 0 Then Goto Ende 'Abfrage für Programmabbruch Porta.5 = 0 'die LED werden wieder dunkel gemacht Porta.7 = 0 Goto Hauptprogramm 'Sprung zum Anfang des Hauptprogramms Ende: 'Ende Porta = 0 'alle LED werden ausgeschaltet End Natürlich habe ich da auch ein paar Fragen. 1. Das Servo wird bei einem RC-Empfänger alle 20ms mit einem Impuls zwischen 1 und 2ms länge angesteuert. 1,5ms ist dabei die Mittenposition. Jetzt wird in der Software aber in Mycrosekunden gerechnet. Der Befehl Reload = 10 setzt so wie ich das verstanden habe die Pulsweite auf 0,01 ms. Dann wäre der Bereich den I haben dürfte gerade mal 100 bis 200 und die Mitte wäre 150. Ich habe da aber den Eindruck das da was nicht paßt. 2. Ich würde gerne meinen Motor später auch über Pulsweite ansteuern, aber in einem sagen wir mal 20-100 khZ Raster. Jetzt mit 20ms komme ich gerade mal auf 50Hz. Was muss ich da bei Reload einstellen? Schon mal danke für die Hilfe bis hier und weiter Weil der Text doch etwas schwer zu lesen ist, hier werden ja Leerzeichen eingespart, habe ich das ganze als Zip mal angehängt. Gruß Neil Anhang: servotester.zip Geändert von Neil am 27. April 2006 um 12:39 Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 99600
[27. April 2006 um 13:27]
Hi,
ich schon wieder. Weil mir das komisch vor kam, habe ich mir eine Ausgabe über das Hyperterminal eingebaut. War garnicht schwer. In der Hilfe stehen nicht nur Sachen über Servos drin (danke Pierre). also mein Servo arbeit von einem Wert von 54 bis 175. Wenn ich das mir den 10 von Relaod verrechne und das dann in ms umrechne komme ich auf 0,54 bis 1,75. aber laut Roboternetz sollten es 1 bis 2 sein. Ist jetzt mein Servo etwa was besonderes? Also gleich mal ein anderes angebaut. Das geht auch von ca. 54 (das zietert mehr als das andere) bis ca. 220. Was beobachte ich hier? Gruß Neil Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
Reinhard
Überflieger Registriert seit: Sep 2003 Wohnort: Österreich Verein: TRA #10691, AGM Beiträge: 1187 Status: Offline |
Beitrag 99603
[27. April 2006 um 13:38]
Hi Neil,
die Servofunktion von BASCOM ist speziell auf Servos zugeschnitten. Die kannst du, wie es scheint, nicht ohne weiteres für deine Zwecke verwenden. Einerseits liegt die PWM Frequenz nur bei 50Hz, andererseits sind die Servovariablen vom Typ Byte, können also maximal einen Wert von 255 aufnehmen. Den Elektromotor könntest du also nur von 0-12,75% regeln. Sieh mal in der BASCOM Hilfe unter "Config Timer 1" nach. Wie ich oben schon erwähnt habe, macht der alles automatisch und der Kern muss sich nicht alle 10µs mit irgendwelchen Pulsen beschäftigen. Mit 100kHz meinst du vermutlich den Kehrwert der Auflösung von 10µs, das ist ein bisschen missverständlich formuliert. Das PWM Signal selber sollte nicht deutlich höher als 1kHz sein, sonst kannst du Probleme mit der Performance deiner Schaltung (Leitungskapazitäten etc.) bekommen. Bei der Auflösung kannst du getrost an das Limit der Hardware von 1/16µs gehen. Was die Servos betrifft, die sind alle ein wenig verschieden, das testet man am Besten aus wie groß der zulässige Bereich ist. Gruß Reinhard |
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 99604
[27. April 2006 um 13:54]
Hi,
Industrieservomotoren, die man z.B. für Linearachsen nimmt, werden mit einer Frequenz von bis zu 100kHz angesteuert. Daher kommt der Wert. Die haben aber dann nichts mehr mit dem Servo aus dem Modellbau an sich zu tun. Was ich vorhabe, geht in Richtung Fahrtregler wie diese evtl. aus dem Elektroflugmodellbau bekannt sind. Die Freuqenz wird genutzt um einen Motor mit immer der gleiche Spannung trotzdem regeln zu können. Wie eben eine Drehzahlregelung bei einer Bohrmaschine aber mit höherer Frequenz für bessern gleichlauf. Es gibt z.B. das hier . Das treibt einen DC Motor. Man muss nur noch Richtung und Geschwindigkeit vorgeben. Diese eben pulsbreitenmoduliert. Da gehen bis 20kHz. Ich denke je höher die Freuqenz, desto besser die Laufruhe. Okay da gibt es auch ein Board welches dieses Board anspricht. Das kann dann über RS-232 oder I2C angesprochen werden. Wäre auch eine Lösung wenn das andere nicht geht, nur halt doppelt so teuer. Gruß Neil Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
Reinhard
Überflieger Registriert seit: Sep 2003 Wohnort: Österreich Verein: TRA #10691, AGM Beiträge: 1187 Status: Offline |
Beitrag 99649
[28. April 2006 um 01:01]
Hi,
da hinke ich ev. dem Stand der Technik etwas hinter her. Vor ein paar Jahren hatte ich mal von den Versuchen gelesen, einen Fahrtenregler mit höherer Frequenz zu entwickeln, was dann wieder aufgegeben wurde. 100kHz mit 8bit Auflösung wirst du aber trotzdem nicht schaffen so lange du den AVR nicht auf 25,5MHz übertaktest . Gruß Reinhard |