Forum: FPGA, VHDL & Co. Hochauflösende DC-Motor PWM / Sweep


von Mike (mike94)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin komplett neu auf dem Gebiet FPGA / VHDL, daher bitte ich 
falsches wording und unpräzise Ausdrucksweise zu entschuldigen. Danke 
für euer Nachsehen :-).

Board: BASYS3 von Xilinx

Problemstellung:
- Ich möchte für eine Vibrationsuntersuchung einen hochauflösenden 
Frequenzsweep für eine DC Motoransteuerung erstellen.
- Der Sweep soll um die 50kHz durchgeführt werden in einem Frequenzband 
von ca. 50 Hz.
- Duty des Highsiders soll 50% betragen
- (Totzeit zwischen HS und LS kommen später auch noch dazu, aktuell 
möchte ich aber erstmal die Sollfrequenz des Highsiders exakt treffen)

Ist-Stand:
- ich habe einen 32-Bit Zähler, 1 LSB = 0,00232.. Hz
- aktuell liege ich mit der Frequenz von ca. 4Hz daneben
- ich habe schon versucht größere Zähler zu verwenden, jedoch ohne 
Erfolg
- Von der Genauigkeit muss ich jedes Hz sweepen

Anbei ein Screenshot der aktuellen Simulation.

Habt Ihr Ideen wie ich meine Genauigkeit hier erhöhen kann?

Ich bin über jegliche Hilfe sehr dankbar!

Viele Grüße
Mike

von Michael B. (laberkopp)


Lesenswert?

Mike schrieb:
> Habt Ihr Ideen wie ich meine Genauigkeit hier erhöhen kann?

DDS, aber das erzeugt Jitter.

DDS sinus gefiltert und mit Komparator dann wieder in PWM geht ohne 
(relevanten) Jitter.

von Mike (mike94)


Lesenswert?

Hallo Michael,

erstmal danke für deine Antwort!
Könntest du mir bitte etwas genauer skizzieren wie ich dies in VHDL 
umsetzten müsste? Ich wüsste jetzt leider nicht wie ich dies direkt so 
umsetzen kann.

Danke dir!

von J. S. (engineer) Benutzerseite


Lesenswert?

Michael B. schrieb:
> DDS, aber das erzeugt Jitter.
nicht wenn man es richtig macht

> DDS sinus gefiltert und mit Komparator dann wieder in PWM
DDS gefiltert, dann PLL, dann wieder DDS

von Mike (mike94)


Lesenswert?

Hallo zusammen,

könnt Ihr mir bitte ausführlicher beschreiben wie ich vorgehen muss, um 
das Ziel eines hochauflösenden PWM-Signals hier zu erreichen?

Vielen Dank!!

von J. S. (engineer) Benutzerseite


Lesenswert?

Wie hoch aufgelöst soll das denn sein? Der FPGA löst auf mindestens 10ns 
genau auf. Wenn du die modulierst, kannst zu z.B. zwischen 50.000 und 
49975 hin und herschalten. Um das zu automatisieren, wurde bereits DDS 
vorgeschlagen, also ein Zähler, der de facto ab und an springt und sich 
um die Zielfrequenz einpendelt. Da diese Umschaltung schnell passiert 
und der Motor träge ist, bekommst du die Zwischenstufe der PWM.
http://www.96khz.org/oldpages/soundsynthesiswithdds.htm

Um das zu verbessern, filtert man einen DDS-Sinus-Wert und nutzt diesen 
wieder als Takt für eine ganzzahlige DDS. Der Schritt vereinfacht sich 
durch Nutzung des MSB. Um die Filterung zu optimieren wird man den Wert 
verrauschen.
http://www.96khz.org/oldpages/limitsofdds.htm

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

Macht man sowas nicht mit 2 Quarzoszillatoren, einem Mischer und einem 
Teiler 2:1? Wenn sich die Nennfrequenzen um 100kHz unterscheiden kommen 
hinten 50kHz mit 50% raus. Den Sweep erzeugt man analog mit einer 
Kapazitätsdiode. Mouser hat Quarze mit 6.4 und 6.5 MHz oder 8.0, 8.1, 
8.9, 9.0, 9.1 MHz.

von Antti L. (trioflex)


Lesenswert?

Bauform B. schrieb:
> Macht man sowas nicht mit 2 Quarzoszillatoren, einem Mischer und einem
> Teiler 2:1? Wenn sich die Nennfrequenzen um 100kHz unterscheiden kommen
> hinten 50kHz mit 50% raus. Den Sweep erzeugt man analog mit einer
> Kapazitätsdiode. Mouser hat Quarze mit 6.4 und 6.5 MHz oder 8.0, 8.1,
> 8.9, 9.0, 9.1 MHz.

nein, so macht man es sicher nicht.

von Bauform B. (bauformb)


Lesenswert?

Weil es nicht funktioniert oder weil es sooo letztes Jahrtausend ist?

von Mike (mike94)


Lesenswert?

Jürgen S. schrieb:
> Wie hoch aufgelöst soll das denn sein? Der FPGA löst auf mindestens 10ns
> genau auf. Wenn du die modulierst, kannst zu z.B. zwischen 50.000 und
> 49975 hin und herschalten.

Ich müsste in dem Frequenzbereich wirklich jedes einzelne Hz im Sweep 
abtasten



> Um das zu verbessern, filtert man einen DDS-Sinus-Wert und nutzt diesen
> wieder als Takt für eine ganzzahlige DDS. Der Schritt vereinfacht sich
> durch Nutzung des MSB. Um die Filterung zu optimieren wird man den Wert
> verrauschen.

Hier hast Du mich abgehängt. Wie komme ich von dem DDS-Sinus-Wert auf 
mein hochaufgelöstes PWM?

In meinem VHDL code verwende ich anstatt des Sinus direkt eine Abfrage 
beim Phasenaccumulator:
<50%: PWM signal high
>50%: PWM signal low

von Antti L. (trioflex)


Lesenswert?

Bauform B. schrieb:
> Weil es nicht funktioniert oder weil es sooo letztes Jahrtausend ist?

Theoretisch ginge es vielleicht sogar
Praktisch: man macht es so nicht!

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.