ich habe mir mit etwas Internethilfe einen Bandpassfilter zusammengebastelt. Um diesen auf Funktionalität zu prüfen würde ich gerne an einem anderen Arduino auf mehreren Digitalpins per tone() Signale mit verschiedenen Frequenzen ausgeben (Bsp.: 500 Hz, 1 kHz, 2 kHz, 5 kHz,...). Diese Signale würde ich gerne überlagern, um zu schauen ob bei meinem Bandpassfilter auch fast nur die richtige Frequenz durchkommt (~ 2 kHz).
Nun meine Frage: Wie überlagere ich diese Signale am besten? Kann ich einfach bei einem Breadboard die Digitalpins alle mit einer verbundene Reihe verbinden oder brät dann irgendetwas im Arduino durch? Ich bin leider eine Niete in E-Technik, wäre toll wenn ihr mich aufklärt
Mischen geht, mit einem Schutzwiderstand (>220 Ohm) an jedem Ausgang. Die offenen Enden der Widerstände zum Summenpunkt = Ausgang verbinden. Die Widerstände dürfen weit größer werden, wenn der Eingangswiderstand der nachfolgenden Schaltung (analoger Pin? 50k) entsprechend hoch ist. Mit unterschiedlichen Widerständen kann den Signalen ein unterschiedliches Gewicht (Anteil) verpaßt werden.
DrDiettrich:
Mischen geht, mit einem Schutzwiderstand (>220 Ohm) an jedem Ausgang. Die offenen Enden der Widerstände zum Summenpunkt = Ausgang verbinden. Die Widerstände dürfen weit größer werden, wenn der Eingangswiderstand der nachfolgenden Schaltung (analoger Pin? 50k) entsprechend hoch ist. Mit unterschiedlichen Widerständen kann den Signalen ein unterschiedliches Gewicht (Anteil) verpaßt werden.
Danke, werde ich mal austesten
michael_x:
Die Referenz zu tone hast du gesehen?
Oh, leider nicht... Hab hier noch ein paar mehr Arduinos rumliegen dann müssen die herhalten.
combie:
Eine FFT vor dem Filter um das Signal zu erzeugen.
Eine FFT nach dem Filter für die Analyse.
Wusste gar nicht dass das mit dem Arduino möglich ist, gibt es schon eine vorgefertigte Funktion für eine FFT beim Arduino?
Es gibt eine FFT Bibliothek für Arduinos. Für die Signalerzeugung nützt die allerdings wenig, weil alle Ausgänge digital sind. Das bedeutet daß jeder Pin viele Oberwellen abgibt, deren Amplitude nicht entsprechend der FFT beeinflußt werden können.
Ein Arduino Mega hat 6 Timer, von denen 5 für die Erzeugung unabhängiger Frequenzen benutzt werden können. Andere haben DACs, mit denen sich beliebige Frequenzgemische ausgeben lassen, wenn man nicht gerade Wert auf HiFi legt.
DrDiettrich:
Ein Arduino Mega hat 6 Timer, von denen 5 für die Erzeugung unabhängiger Frequenzen benutzt werden können. Andere haben DACs, mit denen sich beliebige Frequenzgemische ausgeben lassen, wenn man nicht gerade Wert auf HiFi legt.
Hmm, gibt es einen einfachen Weg diese 6 Timer anzusteuern? Ich hätte sonst vor mit analogWrite die zwei Standard PWM Frequenzen des Mega (490 Hz, 980 Hz) auszugeben und dazu tone() mit unterschiedlichen Frequenzen, sollte hoffentlich zum testen reichen.
Ich weiß nicht, was "einfach" für Dich ist. Zum Timer1 gibt es eine fertige Bibliothek TimerOne, der Code muß dann nur noch für jeden weiteren Timer kopiert und angepaßt werden.
Ich habe es nun hinbekommen mittels arduinoFFT das Signal direkt auszuwerten, ich gucke mir sozusagen die FFT direkt an und lasse bestimmte Frequenzen durch und andere nicht, klappt auch ganz gut.
Vielleicht etwas zum Kontext: Ich habe eine Fotodiode mit Transimpedanzverstärkung an den Arduino angeschlossen, welche nur gepulste Signale mit 2 kHz erkennen soll. So soll das Lichtsignal von Störquellen unterschieden werden können (Deckenlampe: 100-120 Hz,...). Leider ist das gepulste Signal nochmal mit 833 Hz gepulst, d.h. es geht alle 1200 Microsekunden wieder ein und aus. Also habe ich nur knapp unter 3 Perioden zum messen. Ich versuche jetzt mit dem Verhältnis der erkannten Amplituden der Frequenzen der FFT im Bereich 500-1750 Hz, 1750-2250 Hz und 2250+ Hz eine recht eindeutige Regel zum durchlassen zu erreichen, Mal schauen wie zuverlässig das klappt.
Die 2 kHz können auch erhöht werden, jedoch muss dann auch die FFT entsprechend schnell sein. Wenn ihr noch Ideen habt wie man in dem Kontext die Erkennung verbessern kann immer her damit. Ich kann auch später Mal den aktuellen Code posten.
Du musst bedenken, dass ein Rechtecksignal nicht das gleich ist wie ein Sinussignal. Ein Rechecktsignal enthält auch größere Frequenzen, als seine Grundfrequenz (siehe unten). Dein System könnte also immer noch falsche Signale erkennen.
Zum Testen des Bandfilters musst du die Signale eigentlich nicht mischen, und ich weiß auch nicht ob das sinnvoll ist. Ich würde einen Testlauf machen, in dem ich kontinuierlich die Frequenz ändere. Du kannst dann ja ebenso schauen, wann hinter deinem Filter signifikante Amplituden ankommen.