Forum: FPGA, VHDL & Co. Integer - Division - und dann noch Nachkommastellen?


von Thomas K. (tomkay)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Thomas K. (tomkay)


Lesenswert?

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
Noch kein Account? Hier anmelden.