www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Zeitermittlung


Autor: Lazoboy61 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe folgende Frage:
Ich entwickle gerade eine Motorsteuerung mit Geschwindigkeitsanzeige und 
so weiter. Bin schon ganz weit im Projekt aber brauch noch bisschen 
Hilfe. Und zwar wenn der Motor dreht bekommen ich einen periodischen 
Rechtecksignal, diesen fasse ich zu einem Signal zusammen, der Pro 
Umdrehung des Motors seinen Zustand invertiert. (siehe Bild)
das blaue Signal ist der Motor. 6 High und 6 Low Anteile machen eine 
Umdrehung des Motors und das gelbe Signal ist eben dafür da, eine 
Umdrehung zu repräsentieren.
Jetzt muss ich aber für die Anzeige dieses Signal messen, mein Prof. 
meinte dass ich eine mit einer Zählfrequenz die Pulse ermitteln muss, um 
dann somit zur Hz Zahl des Signal zu gelangen oder die Periodendauer zu 
ermitteln.
Genau das ist meine Frage, Wie mache ich das, ich brauche bisschen 
Hilfe.
Hier der Teil des Programms, wo ich es einfügen muss:
abtasten: process (S, RST)
variable zaehl : integer := 6;

begin
if RST = '1' then
    zaehl := 6;
    Puls1 <= '0';

elsif S = '1' and S'event then
  if (RichtungVR = '1' and VR2 = '0') or (RichtungVR = '0' and VR2 = 
'1') or Langsamer = '1' or Schneller = '1' then
    zaehl := 6;
    Puls1 <= '0';
  else
    zaehl := zaehl - 1;
  end if;
  if zaehl = 0 then
    Puls1 <= not Puls1;
    zaehl := 6;
  end if;
  VR2 <= RichtungVR;
end if;
Puls0 <= Puls1

Warte auf antworten vielen dank im voraus.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vorerst mal nur Fragen:
Was ist S, ist das der Puls vom Motor?
Was ist deine Zählfrequenz?
Wie willst du die Zählfrequenz und die Motorimpulse synchronisieren?

Auf welcher Zielplattform soll das Ganze implementiert werden?
Auf einem FPGA?

> Und zwar wenn der Motor dreht bekommen ich einen periodischen
> Rechtecksignal, diesen fasse ich zu einem Signal zusammen, der Pro
> Umdrehung des Motors seinen Zustand invertiert.
Warum teilst du die Frequenz durch 6?

> Jetzt muss ich aber für die Anzeige dieses Signal messen, mein Prof.
> meinte dass ich eine mit einer Zählfrequenz die Pulse ermitteln muss, um
> dann somit zur Hz Zahl des Signal zu gelangen oder die Periodendauer zu
> ermitteln.
Was willst du anzeigen? U/min (Periodendauer) oder msec/U (Frequenz)?


BTW:
Hz-Zahl? Das heißt in Technikerkreisen: Frequenz.

Autor: Lazoboy61 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erstmal für die antwort

S ist der Takt, der vom Laser des Motors gelesen wird. Wenn man sich den 
Motor zylndrisch vorstellt, hat der Motor immer nacheinander in gleichen 
Abständen gleichgroße Schwarze und Weise Balken. Der Laser intepretiert 
einen schwarzen Balken als High und einen weisen Balken als Low (siehe 
blaues signal oben im Bild). Und somit kommt dieses blaue Signal zu 
Stande dieses S ist. Da ich nun 6 schwarze und 6 weise Balken habe, 
dauert eine Umdrehung des Motor, egal wie schnell, 6 High Flanken an, 
dass heisst bis man bei der siebten Flanke angekommen ist, hat der Motor 
gedreht. Nun müsste ich ermitteln, wie lange der Motor für eine 
Umdrehung braucht auf dem FPGA (nebenbei, es handelt sich um ein FPGA). 
Mit dem blauen Signal kann ich nicht viel anfangan hab ich mir gedacht 
und hab das gelbe entwickelt (programmtechnich siehe oben). Das gelbe 
Signal repräsentiert mit seinen High und Low Flanken immer eine 
Umdrehung des Motors. Und meine Aufgabe ist es nun die Zeit für eine 
High oder Low Flanke rauszufinden über das FPGA und es später auf einer 
7 Segment Anzeige auszugeben. Mein Prof. meinte, das ich hier eine 
Zählfrequenz von ungefähr 10 kHz brauche und damit die Pulse ermitteln 
soll. So könnt ich dann die U/min (mit einer Formel) ermitteln. U/min = 
60 * Zählfrequenz / Pulse
Und genau über dieses wollte ich von euch Hilfe.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit dem blauen Signal kann ich nicht viel anfangan ...
Warum nicht? Der Unterschied ist nur eine Konstante, die würde dir "nur" 
das Ergebnis um den Faktor 12 ändern.

Wenn du ein FPGA hast, hast du vermutlich auch einen zentralen 
(Master-)Takt im Bereich 50-100MHz. Auf diesen Takt mußt du das signal 
vom Tacho einsynchronisieren, danach kannst du weiterarbeiten. Diese 
lokale Takterei auf S bringt dir ausschliesslich Scherereien 
(garantiert).

> U/min = 60 * Zählfrequenz / Pulse
Kann so nicht stimmen, denn die Pulse sind Umdrehungen (mal einen 
konstanten Faktor, bei deinem Tacho 12*U). Deine Formel behauptet aber
[pre U/min = Zeit/Umdrehung [/pre]
Da gibt es ein Dimensionsproblem weil 1/s != s/1


So stimmt es besser:

U/min = 60*(U/sec) = 60 * (Tacho/12) / sec = 5*Tacho/sec = Tacho/(sec/5)

Also mußt du zum Berechnen der U/min nur für 1/5 sec die Tachoimpulse 
zählen und fertig.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lazoboy61:
Ob Du nun das gelbe, oder das blaue Signal nimmst, ist doch fast egal. 
Sie sind doch nur über einen Faktor miteinander verbunden (zeitlich 
gesehen). Das blaue (schnelle) Signal hätte den Vorteil schon Werte zu 
liefern, selbst wenn die Achse noch keine ganze Umdrehung hinter sich 
hat.

Wenn Du es einfach haben willst, zähle doch die Impulse, solange Dein 
gelbes Signal "high" ist. Falls Du mit 1 kHz (= 1000 Hz = 1000 Ticks pro 
Sekunde) zählst und z.B. auf 200 Impulse kommst, dreht sich Dein Motor 
mit (200/1000 = 200 ms = 0.2 s) / Umdrehung.

Duke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und im Anhang für den Prof. das fertige VHDL-File.
Nur verstehen mußt du es noch, sonst kommst du in Erklärungsnot ;-)

Autor: Lazoboy61 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für diesen Hilfreichen Tipps.
VHDL ist eine große Sache für mich geworden, bin grad noch am lernen der 
Grundlagen parallel mit einem Projekt, aber hab noch viele lücken. Ich 
hoffe in Zukunft ändert es sich und wird besser.

Danke nochmals.

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.