mikrocontroller.net

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


Autor: Thomas Keilbach (tomkay)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Keilbach (tomkay)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hossa, das ging schnell :)! Dank dir schonmal, werde nun mal nach deinen 
Tipps googlen und dann ne kleine Rückmeldung geben.

Gruß Thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.