Frequenz zu Spannung proportional umwandeln?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Dazu braucht es je einen

  • frequency to voltage converter (zb lm2907)
  • Schmitt trigger (IC oder eigene OP-Schaltung)

Der converter macht dir aus einer frequenz eine spannung. Der Schmitttrigger gibt dir anhand der eingestellten Hysterese ein high oder low je nachdem wie hoch die Spannung am Eingang ist.


darkwhynot 
Beitragsersteller
 31.01.2022, 20:49

also der schmitttrigger ist dazu da aus der analogen Spannung eine digitale zu machen? Falls ja, könnt eich dafür doch auch ein Komperator wie den LM393 nehmen, oder?

0
Kreasteve  31.01.2022, 20:59
@darkwhynot

Ja genau, er schaltet bei einer Spannung, die durch von dir ausgewählte Beschaltung und Dimensionierung der Widerstände festgelegt ist.

Der lm393 eignet sich dafür. Ich würde mal "Figure 22. Non-Inverting Comparator With Hysteresis" auf dem Datenblatt genauer ansehen.

0
darkwhynot 
Beitragsersteller
 01.02.2022, 21:23
@Kreasteve

Danke für die Antwort, ich habe nur ein weiteres Problem. Der lm2907/2917 oder ähnliche Chips bekomme ich schlecht über Verkäufer die schnell liefern. Da ich jedoch nicht 3 Monate warten möchte bis meine Bestellung ankommt, ist meine Frage ob ich den Circuit auch mit einfacheren Komponenten zusammenstellen könnte. (bsp 555 timer)

LG

1
Kreasteve  01.02.2022, 22:35
@darkwhynot

Zum Beispiel ein Adafruit ItsyBitsy M4 Express

Mit https://circuitpython.readthedocs.io/en/latest/shared-bindings/frequencyio/index.html

Der Code könnte als Grundidee so aussehen:



import frequencyio
import board
import digitalio

frequency = frequencyio.FrequencyIn(board.D11)

output = digitalio.DigitalInOut(board.D5)
output.direction = digitalio.Direction.OUTPUT

while True:
    f=frequency.value
    
    if f>15000:
        output.value=1
    else:
        output.value=0
        
    frequency.clear() 

Man kann dann noch:

  • einen Mittelwert aus mehreren Messungen bilden um Rauschen und Ungenauigkeiten zu minimieren
  • Eine Hysterese einbauen, dass es bei Frequenzen nahe den 15kHz der Ausgang nicht flackert...
1
darkwhynot 
Beitragsersteller
 02.02.2022, 18:57
@Kreasteve

Auf die Idee mit dem Microcontroller bin ich schon gekommen und es hat bei mir mit nem normalen Uno auch geklappt. Das mit dem lm2907 bei reichelt war mein Fehler, habe ich wohl ein bisschen zu wenig recherchiert. Falls ich das mit Microcontrollern mache, gibt es evt. kleinere die sehr kostengünstig sind , und falls ja die schnell genug sind? Denn das Signal sollte nicht länger als ne halbe Millisekunde brauchen um "generiert" zu werden. Aber erstmal Danke für die ausführlichen Antworten!

1
Kreasteve  02.02.2022, 19:36
@darkwhynot

Ne halbe Millisekunde wird schwierig. Aber wie genau muss es denn bei 15kHz schalten?

Günstig ja raspberry pico

Klein ja tiny2040

Aber ich hab gerade mal im Datenblatt vom rp2040 nachgesehen. Bei ner halben Millisekunde Abtastintervall liegt die Genauigkeit bei 4kHz.

Wie schnell der lm2907 reagiert weiß ich nicht.

0
darkwhynot 
Beitragsersteller
 02.02.2022, 20:01
@Kreasteve

Es muss nicht sehr genau schalten, eher schnell. Wenn der Output aus ist, ist das Signal bei rund 12kHz. Der zweite Messwert liegt bei 9kHz, ein Zwischenwert muss nicht gemessen werden, also kann die Genauigkeit auch etwas abweichen.

Der 2907 wird mit 10kHz betitelt, ob das jetzt die Zeit beinhaltet bis das Signal komplett konvertiert ist, bezweifle ich.

0
Kreasteve  02.02.2022, 20:28
@darkwhynot

Dann wäre meine Idee es mit dem PIO des rp2040 zu machen. (edit: geht auch anders, dazu später mehr)

Der PIO kann man sich wie ein Microcontroller vorstellen der unabhängig vom Hauptprozessor läuft. Der PIO würde (in meiner Idee) einen pin mit bspw. 90khz Abtasten und in ein 32bit register schieben.

Also würde bei 15khz etwa 0b11111100000011111100000011111100 im register stehen.

Bei 9khz

0b1111111111000000000011111111100

Besser Idee:

Anstatt die bits in ein Register zu schieben würde ich auf die erste 1 warten und die 1er mit Zählen, bis eine 0 kommt. Ist der Zähler zwischenzeitlich größer als 8 geworden kann man direkt den Ausgang entsprechend schalten.

Und das kann man nicht nur mit dem PIO des rp2040 machen, sondern mit jedem Arduino auch.

Gleichmäßig Abtasten, auf die 1 warten, mitzählen und Ausgang schalten.

1
Kreasteve  02.02.2022, 20:46
@darkwhynot

Gerade les ich 12khz. Dann würde ich mit etwa 210khz Abtasten. Bei 10,5khz wären es dann 20 Abtastungen, da würde ich die Entscheidung treffen.

Bei 9khz dann 23 und bei 12khz 17. Das dürfte als Genauigkeit reichen.

Man kann natürlich auch noch schneller Abtasten und die 0er auch zählen um die Sicherheit zu erhöhen und den Mittelwert aus mehreren Zählwerten bilden zu 2khz(0,5ms) hast ja ein bisschen Zeit.

Kommt eben ein bisschen auf deinen Anwendungsfall an. Aber es hört sich nicht so an als wäre es sehr kritisch.

1
Kreasteve  02.02.2022, 20:54
@darkwhynot

Ach ja, der rp2040 (egal welches Board) läuft mit 125MHz. Für den ist das ein Kinderspiel. Den PIO kann man auch ganz einfach mit Micropython konfigurieren. Die beiden cores würden schlafen. Die Aufgabe hier bekommt man in eine Statemachine rein inkl Ausgang. (es gibt 2 PIOs mit je 4 Statemachines)

Um es klar auszudrücken ist ein rp2040 dafür mehr als überdimensioniert. Er ist aber günstig und man bekommt ihn auch auf kleinen fertigen Boards.

0
darkwhynot 
Beitragsersteller
 02.02.2022, 21:33
@Kreasteve

Der Vorteil nur den PIO zu benutzen, liegt also darin dass quasi nicht der ganze Mikroprozessor benutzt werden muss und Instruktionen so schneller bearbeitet werden können?

0
Kreasteve  02.02.2022, 21:41
@darkwhynot

Ja schon auch.

Die Statemachines können nicht viel, dafür aber einiges gut schnell und unabhängig vom restlichen Code.

Die Zählwerte kann man mit dem core auch abholen und ein Mittelwert bilden. Das kann ne Statemachine nämlich nicht.

0

Es geht zB indem du die Frequenz in eine PLL einspeist, die Regelspannung der PLL ist dabei ein Wert für die gemessene Frequenz.

Digitale Auswertung mittels Zähler wäre natürlich auch denkbar wobei du vergleichst um wie viel schneller dein externes Signal zu einem Referenzsignal ist.

Dazu hängst du zB dein Referenzsignal an das Reset eines Timers und das Eingangssignal an den Takteingang. Der Zähler zählt dann quasi um wie viel schneller dein Eingang zur Referenz ist und das kannst du auswerten. Ohne Synchronisierung und je nach Timer hat das ganze natürlich eine relativ schlechte Auflösung ist aber schnell und billig umsetzbar.

Wenn der Tastgrad bekannt ist kannst du mit dem Timer auch immer die Zeit des Low Pegels messen und so auf die Frequenz rückschließen. Mit einem uC würds zB auch mit unbekanntem Tastgrad und den Flanken gehn.

Natürlich gibts auch eigene Frequenz zu Spannungswandler.