Du kannst keine neue Antwort schreiben
Seiten (2): [1] 2 »

Autor Thema 
Neil

99.9% harmless nerd


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 99480 , Pulsweitenmodulation [Alter Beitrag26. April 2006 um 08:37]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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

Reinhard

Registriert seit: Sep 2003

Wohnort: Österreich

Verein: TRA #10691, AGM

Beiträge: 1186

Status: Offline

Beitrag 99482 [Alter Beitrag26. April 2006 um 11:12]

[Melden] Profil von Reinhard anzeigen    Reinhard eine private Nachricht schicken   Besuche Reinhard's Homepage    Mehr Beiträge von Reinhard finden

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


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 99483 [Alter Beitrag26. April 2006 um 11:30]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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


Administrator

CharlyMai

Registriert seit: Mär 2005

Wohnort: Hannover

Verein: SOLARIS-RMB e.V. (P2;T2) / AGM / TRA#21598

Beiträge: 1970

Status: Offline

Beitrag 99496 [Alter Beitrag26. April 2006 um 18:49]

[Melden] Profil von CharlyMai anzeigen    CharlyMai eine private Nachricht schicken   Besuche CharlyMai's Homepage    Mehr Beiträge von CharlyMai finden

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


Administrator

Christian Fruth

Registriert seit: Jun 2002

Wohnort: Großfischlingen

Verein: Solaris-RMB e.V., RMV 82 e.V.

Beiträge: 603

Status: Offline

Beitrag 99498 [Alter Beitrag26. April 2006 um 19:21]

[Melden] Profil von Christian Fruth anzeigen    Christian Fruth eine private Nachricht schicken   Christian Fruth besitzt keine Homepage    Mehr Beiträge von Christian Fruth finden

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


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 99595 [Alter Beitrag27. April 2006 um 12:38]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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 weiterwink
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


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 99600 [Alter Beitrag27. April 2006 um 13:27]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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 big grin (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

Reinhard

Registriert seit: Sep 2003

Wohnort: Österreich

Verein: TRA #10691, AGM

Beiträge: 1186

Status: Offline

Beitrag 99603 [Alter Beitrag27. April 2006 um 13:38]

[Melden] Profil von Reinhard anzeigen    Reinhard eine private Nachricht schicken   Besuche Reinhard's Homepage    Mehr Beiträge von Reinhard finden

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


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 99604 [Alter Beitrag27. April 2006 um 13:54]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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

Reinhard

Registriert seit: Sep 2003

Wohnort: Österreich

Verein: TRA #10691, AGM

Beiträge: 1186

Status: Offline

Beitrag 99649 [Alter Beitrag28. April 2006 um 01:01]

[Melden] Profil von Reinhard anzeigen    Reinhard eine private Nachricht schicken   Besuche Reinhard's Homepage    Mehr Beiträge von Reinhard finden

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 wink.

Gruß
Reinhard
Seiten (2): [1] 2 »
[Zurück zum Anfang]
Du kannst keine neue Antwort schreiben