Hallo Zusammen! Bin der Neue und platz gleich mal mit meinem Problem raus :). Voarab, Suchfunktion und Google haben mir leider nicht wirklich weitergeholfen. Zurzeit bearbeite ich ein Projekt, welches sich um die Ansteuerung von Schrittmotoren mittels FPGA (Altera Cyclon) dreht. Kurzeinführung: Eine Motion-Controller-Karte (MoCon) im Gesamtsystem berechnet einen Bewegungsablauf für eine vom Benutzer vorgegebene Strecke. Hierbei werden Geschwindigkeiten von der MoCon berechnet, welcher der Schrittmotor zu jedem Zeitpunkt zu fahren hat, bis er sein definiertes Ziel erreicht. Diese Gewschwindigkeitsinformation liegt in Form eines 12-Bit-Wertes an, wobei das MSB-Bit die Drehrichtung und die anderen 11 Bit die eigentliche Geschwindigkeitsinformation tragen (maxVelocity = 0x7FF). Diese Geschwindkeitsinformation soll nun von einem zweiten Board (FPGA) entgegengenommen und in eine Pulsfrequenz umgesetzt werden. Diese Pulsfrequenz wird zur Ansteuerung eines Schrittmotortreibers benötigt. Die VHDL-Umsetzung erfolgt nach aktuellem Stand der Dinge nun folgendermaßen: Ein mittels einer Statemachine realisierter Counter erzeugt beim Überlauf ein High-Ausangangssignal und fällt bei halben Countermaximalwert wieder auf Low zurück (Duty Cycle = 50%, getaktet mit Fsys = 100MHz). Die Höhe des Countermaximalwertes wird in einem speraten Modul berechnet und der Statemachine zur Verfügung gestellt. Genau hier taucht nun das eigentliche Problem auf. Die Berechnung des Countermaximalwertes gehorcht folgender Formel: Counterlimit = (Systemfrequenz / (MS*sw*maxUmdrehung)) * (2047/MoCondaten) wobei MS = Mikroschritteinstellung sw = Schrittwinkel maxUmdrehung = Maximale Drehzahl des Motors pro Sekunde bei 0x7FF (Diese Konstanten können vom Benutzer je nach eingesetztem Motor festgelegt werden). Es handelt sich hierbei also um eine Herunterteilung des Systemtaktes auf eine bestimme Pulsfrequenz je nach angelegtem 12-bit-Wert. Die Datentypen werden für die Berechnung als Integer vereinbart. Da dieser Datentyp (aus meiner sicht leider) ein Ganzzahlenformat repräsentiert, kommt es bei der obigen Berechnung des Counterlimits zu Fehlern in Form von nicht vorhandenen Nachkommastellen. Dies wirkt sich logischerweise auf die daraus resultierende Pulsfrequenz aus, was wiederrum zu Schrittverlusten (bzw. Überschritten) am Schrittmotor führt und er somit nicht exakt auf Position fährt. Hätte ich allerdings die Nachkommastellen, so könnte ich mittels eine Fehlerrechnung errechnen, nach wieviel Pulsen z.B. ein zusätzlicher eingefüght werden muss (quasi ein Software-Regelkreis). Nun brennt es mir unter den Fingernägeln zu erfahren, wie Ihr bzw. wie allg. mit mathematischen Formeln in VHDL umgegangen wird. Vor allem diese 'blöde' Divisionsterme rauben mir den letzten Nerv, weil eben dadruch die Nachkommastellen erst zustande kommen und mir bisher noch keine andere/bessere Umsetzungsmöglichkeit eingefallen ist. Zusammenfassend will ich fragen: 1. Gibt es eine andere möglichkeit, eine Pulsfrequnz zu generieren, welche mit einem Bitwert veränderbar ist? 2. Gibt es eine Möglichkeit in VHDL, an die Nachkommastellen heranzukommen (für eine evtl. Fehler-Ausgleichs-rechnung)? 3. Würde der hier im Forum angesprochene Datentyp ufixed/sfixed weiterhelfen? Hat jmd Erfahrung mit diesen Datentypen? 4. Würde es helfen, den Divisionsalgorhytmus selbst zu programmieren (Umsetzung einer binären Division in VHDL)? Auf einen Mikrocontroller kann ich leider nicht umschwenken, da die Vorgabe, einen FPGA zu nutzen feststeht. Auch darin einen Mikrocontroller zu integrieren scheitert, da der verwendete Cyclon FPGA nur begrenzt logische Einheiten zur Verfügung stellt und diese größtenteils schon durch das oben beschreibenes VHDL-Programm ausgereizt sind. Entschudligt bitte meine ausschweifende Erkärung des Gesamten, ich will nur soviel Infos wie möglich zur Verfüfung stellen :). Hoffe es ließt sich jmd durch und kann mir weiterhelfen :)! Gruß Thomas
@ Thomas K. (tomkay) > Counterlimit = (Systemfrequenz / (MS*sw*maxUmdrehung)) * >(2047/MoCondaten) >wobei MS = Mikroschritteinstellung > sw = Schrittwinkel > maxUmdrehung = Maximale Drehzahl des Motors pro Sekunde bei >0x7FF > (Diese Konstanten können vom Benutzer je nach eingesetztem Motor >festgelegt werden). Das heisst die einzige Variabel in der Gleichung ist MoConDaten. >Die Datentypen werden für die Berechnung als Integer vereinbart. Da >dieser Datentyp (aus meiner sicht leider) ein Ganzzahlenformat >repräsentiert, kommt es bei der obigen Berechnung des Counterlimits zu >Fehlern in Form von nicht vorhandenen Nachkommastellen. Nöö, siehe Festkommaarithmetik. >Dies wirkt sich logischerweise auf die daraus resultierende Pulsfrequenz >aus, was wiederrum zu Schrittverlusten (bzw. Überschritten) am Naja, diese Art der Schrittmotorsteuerung scheint mir sowieso merkwürdig. >Fehlerrechnung errechnen, nach wieviel Pulsen z.B. ein zusätzlicher >eingefüght werden muss (quasi ein Software-Regelkreis). Google mal nach Breesenham Algorithmus. >diese 'blöde' Divisionsterme rauben mir den letzten Nerv, weil eben Bei nur 11 Bit Eingangsvektor kann man das heutzutage luxeriös mit einer Tabelle machen. >1. Gibt es eine andere möglichkeit, eine Pulsfrequnz zu generieren, >welche mit einem Bitwert veränderbar ist? Logisch, siehe DDS. >2. Gibt es eine Möglichkeit in VHDL, an die Nachkommastellen >heranzukommen (für eine evtl. Fehler-Ausgleichs-rechnung)? Siehe oben. >3. Würde der hier im Forum angesprochene Datentyp ufixed/sfixed >weiterhelfen? Nein. >4. Würde es helfen, den Divisionsalgorhytmus selbst zu programmieren >(Umsetzung einer binären Division in VHDL)? Glaub ich nicht unbedingt. MFG Falk
Hossa, das ging schnell :)! Dank dir schonmal, werde nun mal nach deinen Tipps googlen und dann ne kleine Rückmeldung geben. Gruß Thomas
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.