Forum: FPGA, VHDL & Co. DC Motor, PWM, Drehrichtung, Drehzahl


von scarabrutto (Gast)



Lesenswert?

Hallo zusammen

Für eine Projektarbeit im Bereich FPGA/VHDL habe ich das Thema "DC Motor 
Ansteuerung mittels PWM" erhalten. Das Ziel wäre es, den DC Motor anhand 
eines PWM Signals auf verschiedenen Drehzahlen laufen zu lassen. Diese 
Drehzahlen werden mittels Kippschaltern auf dem Board ausgegeben. Ebenso 
wird die Drehrichtung anhand eines Kippschalters hin und her geschalten. 
Da ich aber nicht viel Erfahrung in diesem Bereich habe, stiess ich 
schnell auf Probleme. Zurzeit wäre ich froh wenn mir jemand helfen 
könnte, das entsprechende PWM Signal für die Drehzahl ausgeben kann an 
den Motor. Im Code ersichtlich habe ich die Signale speed und treshold 
definiert, ich denke irgendwie sollte es damit gehen aber die richtige 
Lösung habe ich noch nicht gefunden.

Vielen Dank für eure Hilfe

von Gustl B. (-gb-)


Lesenswert?

Code als Bild ist so ziemlich die schlechteste Idee. Hänge es doch als 
.vhd hier an deinen Beitrag.

von scarabrutto (Gast)


Angehängte Dateien:

Lesenswert?

alles klar, demnach hier das vhd file

von Gustl B. (-gb-)


Lesenswert?

Und auch hier:

use IEEE.numeric_std.all;
use ieee.std_logic_unsigned.all;

Verwende nur die obere Zeile der Beiden.

Was für Ports sind das?

PWM_Value : in integer range 0 to 255;
PWM : out std_logic;
Out2 : out std_logic);

Also wofür sind die da und was ist daran angeschlossen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

scarabrutto schrieb:
> hier das vhd file
Seltsam formatiert. Warum rutscht der Zeilenanfang bei jedem if nochmal 
weiter rein? Das macht den Code irgendwie extrem unleserlich. Indention 
hilft, Klammereben zu erfassen. Das funktioniert nicht, wenn 
gleichwertige if-Abfragen immer weiter reinrutschen.

Woher kommt PWM_Value? Wie wird der Wert eingegeben? Nimm keinen integer 
sondern nur std_logic(_vector) als Port, wenn du damit direkt auf 
Hardware rausgehst:
PWM_Value : in integer range 0 to 255;

Out2 ist auch irgendwie umständlich gemacht, weil er sowieso nur dem SW1 
folgt. Das könntest du also auch einfach nebenläufig als Out2 <= SW0; 
schreiben...

Gustl B. schrieb:
> use IEEE.numeric_std.all;
> use ieee.std_logic_unsigned.all;
> Verwende nur die obere Zeile der Beiden.
Lies dazu den Thread hier:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Und beachte besonders auch die Links darin.

scarabrutto schrieb:
> ich denke irgendwie sollte es damit gehen
Der Simulator ist der VHDL-Debugger. Was sagt denn die Simulation deines 
Codes? Irgendwas tut sich ja schon...

> aber die richtige Lösung habe ich noch nicht gefunden.
Was ist denn die Aufgabe? Welche Taktfrequenz hat dein FPGA (das wird ja 
wohl was im 50..100MHz-Bereich sein)? Welche Taktfrequenz soll die PWM 
haben (wohl was im kHz-Bereich)? Oder kurz: welche Hardware hast du?

> Da ich aber nicht viel Erfahrung in diesem Bereich habe, stiess ich
> schnell auf Probleme.
Hast du einfach mal mit der blinkenden LED angefangen? Natürlich auch 
erst mit der Simulation davon...

http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

von scarabrutto (Gast)


Lesenswert?

Danke für die Antwort
>seltsam vormatiert
Haben wir so beigebracht bekommen, sollte angeblich das lesen 
vereinfachen und verhindern dass kein end if vergessen geht.

> out2, pwm
Dies wären beide Ausgänge die an den Motor Driver gehen für je eine 
Drehrichtung. Als Motordriver wird ein L298-H Brückentreiber verwendet.

> Aufgabe
DC Motor mit 2 Drehrichtungen, verschiedene Drehzahlen mittels PWM
Hardware: Terasic DE0 FPGA, L298-H Brückentreiber, 12V DC Motor
Takt FPGA 50MHz, Takt PWM weiss ich nicht genau wie der zu wählen wäre.

>Simulation
Versuche ich im Moment noch zu erstellen mittels Modelsim

Die Drehrichtungen konnte ich bereits erfolgreich ausgeben. Komme aber 
nicht weiter mit der PWM Ausgabe. PWM_Value hab ich aus einem Beispiel 
entnommen, soweit ich verstehe sollte hier der PWM Wert angegeben 
werden, mit welchem sich die Drehzahl ändern soll. Dies wäre die Idee 
mittels Kippschalter einen vordefinierten Wert zuzuweisen.

von dfIas (Gast)


Lesenswert?

Wenn die PWM-Steuerung einen Nulldurchgang hat, kann man sowohl Drehzahl 
als auch die PWM-Vorgabe vorzeichenbehaftet betrachten. Gegebenenfalls 
vereinfacht sich die Logik, wenn man sich um die Richtung nicht mehr 
explizit kümmern muss. Das Vorzeichen der PWM könnte auch für einen 
separaten Umschalter ausgewertet werden.
Ansonsten baut man unnötige Fallunterscheidungen ein, die die Mathematik 
von selbst liefert.

von J. S. (engineer) Benutzerseite


Lesenswert?

scarabrutto schrieb:
> kt PWM weiss ich nicht genau wie der zu wählen wäre.

Hoch genug, damit man einen glatten Wert bekommt und niedrig genug, 
damit die Brücke wenige Verluste hat. Braucht 2 Randbedingungen, nämlich 
die Filterwirkung des anlagen Zweigs Vollbrücke - Motorwicklung und die 
Schaltzeiten des Treibers, sowie gfs Wärmeentwicklung.

Wahrscheinlich wird man das mit einigen 100kHz treiben.

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.