Bitte um Hilfe für 2 einstellbare oszillatoren mit rotary encoder

Hallo
Ich freue mich hier zu sein, aber muss leider sagen dass ich bisher immer den Arduino bei mir gemieden habe da ich einfach nicht weiss wie! Jetzt habe ich aber ein Projekt welches ich gerne mit dem Nano oder Uno R3 machen würde je nachdem was möglich ist! Ich habe auch schon versucht mir alles notwendige selber raus zu suchen, find auch vieles aber bin nicht clever genug die einzelnen Sketche richtig zu kombinieren!
Ich würde mich sehr freuen wenn einer von euch mir da helfen könnte bevor ich mir noch das Gehirn breche!

Es geht um 2 einstellbare Rechteckgeneratoren die einstellbar sind von 1-100 Hz jeder dieser Signale soll an einem eigenen Pin ausgegeben werden welche dann an das Gate eines Mosfets kommen. Einstellen möchte ich das ganze mit irgendeinem Drehregler (kein Poti)! Beim starten sollen beide Oszillatoren auf 50Hz gesetzt werden und mit dem Drehregler soll Osc. 1 gesteuert werden wenn ich den Push Buton am Rotary Encoder drücke soll Osc. 2 nun einstellbar sein und bei erneutem drücken sollen beide Oscis zusammen gesteuert werden und das aber von der jeweils eingestellten Frequenz aus, bei erneutem drücken des Knopfes soll das alles wieder von vorne mit Oszillator 1 beginnen!
Ein weitere Push Button soll außerdem beide Oszillatoren wieder auf 50Hz einstellen, ansonsten sollen die Frequenzen nach dem ändern gespeichert bleiben bis zum ausschalten oder Reset

Ich hoffe das ist überhaupt so zu verwirklichen am besten wäre es wenn sich das ganze mit einem Nano machen liese oder wenn nötig mit nem Uno R3! Sicher wäre es schönb wenn jemand den passenden Sketch parat hätte aber wenn sich wer die Zeit nehmen würde und mir dabei hilft zu dem gewollten Ergebnis zu kommen wäre das echt Hammer!!!! Ich habe schon mehrere Tutorials angesehen und weiß einfach bei den meisten nicht ob das für meine zwecke passend ist aber trotzdem das ich das mit den Oszillatoren irgendwie bald mal hinbekomme glaube ich schon aber die steuerung des Rotary Encoder und wie ich das mache das bei jedem Knopfdruck was anderes ausgewählt wird da weiß ich nicht weiter!!!

Danke schonmal an alle die das lesen und mir weiterhelfen möchten!!!

Grüße Chris

Klar ist das machbar. Aber fertig liefert das niemand für dich

Zerlege die Aufgabe in mehrere Teile. Das Einlesen der Encoder und die Signalerzeugung kann man leicht trennen.
Das mit dem Button ist eine einfacher Zustandsautomat. Das kann man als letzten Schritt implementieren.

Du musst aber schon verstehen was du tust und schon etwas selbst tun. Du kannst nicht einfach wild Sachen zusammenkopieren und hoffen das alles geht. Details muss man nicht in allen Fällen verstehen, aber man sollte schon nachvollziehen was fremder Code grob macht und wie man mit diesem interagiert.

Danke für deine schnelle Antwort! Ja ich will ja gar nicht das jemand alles für mich macht ich dachte nur wenn ich den/die passenden Skatche finde sollte sich das doch kombinieren lassen! Ich weiß wie der Encoder funktioniert und auf welche Art er die Drehrichtung mitteilt etc. ich weiß wie man eine Schaltung aufbaut und berechnet aber das hier ist was ganz anderes aber da ich jetzt schonmal die Bezeichnung von dir habe wie Zustandsautomat implementieren weiß ich jetzt wenigstens wonach ich suchen muss da ich bisher nicht das richtige gefunden habe den einstellbaren oszillator bekomme ich glaub ich bald mal hin und dann halt mal weiter sehen aber danke schonmal!!!!

Coole Idee. Wofür braucht man sowas? Was macht man damit?

ich denke ein (oder zwei) Displays wirst auch noch brauchen damit du die zwei eingestellten Frequenzenablesen kannst.

noiasca:
ich denke ein (oder zwei) Displays wirst auch noch brauchen damit du die zwei eingestellten Frequenzenablesen kannst.

Dachte ich mir auch. Was ich für ähnliche Anwendungen ein paar mal verwendet habe sind 4 Zeichen LED Dot Matrix Displays von Osram. Sieht super aus. Viel schöner als LCDs. Und extrem einfach anzusteuern, da sie wie LCDs einen ASCII Zeichensatz drin haben.
Ist aber schon einige Jahre her. Die Dinger werden aber wohl nicht mehr gebaut und sind heute sehr teuer.

Hi

Wenn Du mit der Bedienung mittels kurzen Druck zwischen den beiden Ausgängen umschalten und mit einem langen Druck auf die 50HZ zurück springen können möchten würdest, könnte man Das Alles mit einem Drehencoder (mit integriertem Taster) erschlagen.
Von ALPS gibt's Welche z.B. auf eBay für wenige Taler.
Ein kleines Display per I²C, zwei Variablen für die Frequenz - Das sollte Es schon halbwegs gewesen sein.

Du wirst LL-FETs brauchen (oder eine Treiberstufe, da 'normale' FETs mit den 5V vom Arduino nicht sonderlich gut können).

MfG

Hallo,

du hast verschiedene Teilaufgaben zu lösen.

Kannst du denn schon mittels Drehencoder zwischen einem vorgegebenen Zahlenbereich wählen?
Wenn nicht, ja dann mal los.

Danach bauste dir einen Frequenzgenerator. Hier sehe ich aktuell eine einfache Möglichkeit.
Zwei Timer im Normal- oder CTC Modus. Im Overflow Interrupt neuen Wert setzen.
Etwas einfacher wäre für die spätere Handhabung ein Phase Correct Modus. Da kann man das benötigte OCRnA Register jederzeit ändern.

Kleine Grundlagenanleitung dazu

Und dann rechnest du ein wenig ...

Danke vielmals für die tollen und schnellen Antworten!
Ja über ein Display hab ich auch schon nachgedacht ist sicher ne gute Idee aber
momentan nicht so wichtig für mich!

@ Postmaster-ino
Hast du Links dazu für mich??
Wegen der Drehencoder mit eingebautem Taster ich habe zwar nicht die von Alps aber
vom prinzip her hab ich genau sowas und wäre hammer wenn ich das so hinbekomme wie erwähnt! Für Links zu guten Anleitungen bin ich natürlich immer Dankbar und wegen der Mosfets verwende ich Irf740 laut Datenblatt sollte der bei 4V schon voll durchschalten sollte eigentlich kein Problem mit dem Arduino haben oder übersehe ich was?

Vielen dank auch @Doc_Arduino

Es tut mir leid so blöd fragen zu müssen aber ich finde einfach nichts dazu und die frage ist warscheinlich zu blöd als das google wüsste um was es geht! Wie kann ich das mit den 2 verschiedenen Rechttecksignalen denn machen weil wenn ich mir nen fertigen Sketch von Blinkenight zum Bsp. ansehe kann ich die Output pins definieren heist das jetzt das ich das eine Signal jetzteinfach nur auf allen Pins bekomme kann oder kann jeder Pin ein eigenes Signal unabhängig vom anderen ausgeben? Weil ich denke mir ich muss ja 2 dieser Rechteckgeneratoren programmieren und dann dazwischen hin und her wählen können oder denke ich zu kompliziert
Grüße

just_started:
Irf740 laut Datenblatt sollte der beiu 4V schon voll durchschalten

Nein. Die Schwellenspannung ist nur wo er anfängt zu leiten. Du willst was mit IRL im Namen. z.B. IRLZ34, IRLZ44, IRLU024 oder IRLD024 (für kleine Lasten)

Hi

Wenn ich den Thread recht im Kopf habe, brauchst Du Frequenzen bis 100Hz - in der Zwischenzeit trinkt der Arduino eine ganze Kaffee-Plantage leer, so viel Freizeit hat Der!
Das kann man, ganz gemütlich, in jedem loop()-Durchlauf entscheiden, ob einer der beiden Pins umgeschaltet werden soll.

Zu den Drehencodern gibt's dutzende Libs, musst 'nur' schauen, daß man damit zwischen langem und kurzem Tastendruck unterscheiden kann.
Oder:
Wie die Blinke-Pins kann man auch den DrehEncoder komplett von Hand abfrühstücken.
So lange Du den Encoder nicht mit einem Akku-Schrauber bedienst, sollte auch hier der Arduino genügend Freizeit haben, um die beiden Phasen mitzuhalten und den Taster abzufragen - die Entscheidung, ob langer oder kurzer Tastendruck wie auch das Endprellen ist dann Software.

Großartig Links zu Beispielen, Die Das womöglich noch kombinieren - habe ich gar nicht, sorry.

MfG

@just-started: Ich hätte ja gerne noch ne Antwort auf #3

Hallo,

@ postmaster:
Schon einmal etwas von Jitter gehört? Den bekommste ganz sicher und kräftig wenn du den Takt in der loop erzeugst. Für LED Blinkereien spielt das keine Rolle. Wenn man aber einen sauberen Takt haben möchte wovon ich ausgehe ist das nicht mehr egal.

@ just:
Ich lese aus deiner Antwort heraus das du mit dem verlinkten Sketch noch nichts probiert hast. Fang doch erstmal mit einem Takt an. Wie genau müssen die Takte sein und in welcher Auflösung sollen diese verändert werden? Vielleicht hätte ich noch eine andere Idee.

Hi

Noch sehe ich Da kein größeres Problem - man sollte in der loop() vll. sparsamer mit delay() umgehen, als sonst :wink:
Sonst kann man Das natürlich auch einem Timer aufhalsen und darin entscheiden, welchen der Pins wir jetzt umschalten wollen.

Denke, in diese Richtung möchtest Du - bin ich durchaus nicht abgeneigt.

MfG

Hallo,

genau in die Richtung möchte ich ihn schupsen. Die loop Durchlaufzeiten sind ja nie konstant. Je nachdem welche und wieviele Entscheidungsbäume abgegrast werden müssen. Displayausgaben und Encoderabfrage kommt ja noch dazu. Die Zeiten summieren sich und schwanken.
Ich meine, man kann durchaus mehrere Pins mit einem Timer erschlagen und etwas Jitter hat man dann auch je nach Zählervergleichsarbeit. Ist laut meiner Meinung und Beobachtung jedoch deutlich weniger und berechenbarer als in der loop. Vielleicht nehme ich alles auch nur zu genau. Ich nehme eben gern wenn verfügbar einen Timer. Einmal gefressen ist das ganz einfach. :slight_smile:

Falls der TO erkennbares Interesse zeigt bin ich durchaus bereit weiterhin zu helfen.

Die Auflösung ist so ne Sache es sollte schon möglichst genau einstellbar sein vorallem so um die 50 Hz herum wenn es dann bei 80 bzw 20 Hz nur noch 5er Schritte sind is das ok aber bei den 50Hz sollte es maximal um 1 Hz weiterspringen pro bewegungzumindest der bereich von 35 - 65Hz sollte so genau sein wenn möglich

Es soll für verschiedene Zeitlupen effekte etc verwendet werden da das menschliche Auge mit einer Frequenz von 50Hz arbeitet lassen sich verschiedene Effekte erzeugen wenn das Umgebungslicht geringfügig langsamer oder schneller gedreht wird deshalb ist es auch so wichtig das sich die Frequenzen rund um 50 Hz so genau bestimmen lassen!
Eventuell komme ich sogar nur mit einem Einstellbaren bereich von25-75Hz oder 30-70Hz aus wenn dir damit was einfallen sollte Doc_Arduino. Den größeren Bereich habe ich nur aus Interesse gewählt aber wie gesagt wenn du eine Lösung für den kleineren Bereich hast immer wieder gerne. Aber wie meinst das ich soll mit einem Takt anfangen?

So @themanfrommoon jetzt sollte deine Frage auch endlich beantwortet sein! Hab ich iwie übersehen!

Die Alternative wären 2 NE555 aber dann würde das ganze über 2 Potis einstellbar sein und Display hätte ich auch keines und ich hätte gerne nur einen Drehregler an dem Teil! Außerdem wollte ich jetzt endlich mal den Arduino verwenden.

Im Prinzip ist mir egal ob Timer oder Frequenzgenerator usw. hauptsache es kann die gestellten Anforderung erfüllen je einfacher desto besser ich muss es ja auch irgendwie hin bekommen!!!

Danke für eure Hilfe ist viel mehr als ich gedacht habe! Danke Leute

Kannst du das nochmal genau erklären was du machen willst?

Das menschliche Auge schaut auf jeden Fall NICHT mit 50Hz.
Von daher weiss ich noch nicht, ob du vielleicht auf dem Holzweg bist.

Willst du ein Stroboskop bauen?

Und für was brauchst du die zwei Kanäle?

Hi

Da für den Arduino 50Hz und auch 80Hz schnarch lahm sind, könnte man die Herz auch in 10.tel Schritten einstellen.
Man muß sich halt einen Weg überlegen, daß man von 30 bis zur 80 keine zwei Stunden an dem Knopf kurbeln muß.

Nun suchst Du Dir einen Timer aus und schaust, wie hoch der Zählen kann - und wie schnell Er Das tut.
Schön wäre, wenn Der ziemlich genau 0,1Hz irgendwie hinbekommt - dann musst Du nämlich nur noch in Deiner ISR eine Variable für die zwei Ausgänge hochzählen und bei Erreichen der Max-Anzahl den Pin umschalten und den Zähler auf 0 setzen.

Die Soll-Werte müssen volatile sein, würde ich aber eh separate Variablen für nehmen, damit ich nicht die ganze Einstell-Zeit über die Interupts sperren muß, um den aktuellen Wert auslesen/wegspeichern zu können - Das machte ich erst, wenn die Eingabe 'länger auf dem Wert steht' - bzw. hängt Das eher daran, was Du willst und wie Du Dir die Umstellerei vorstellst.

MfG

Hallo,

schön, Anforderungen sind erfüllt. Etwas lauffähiges habe ich fertig. Nur solltest du mir schon irgendwie zuverstehen geben das du die Grundlagen der Timerkonfiguration verstanden hast. Beitrag #7. Zeige mir den abgeänderten Sketch für 500Hz PWM Takt mit 75% DutyCycle. Dann bekommste den Sketch für 2 Pins Taktgeneratoren. Ich mache das nicht ohne Grund. Der Sketch nützt dir wenig wenn du die Grundlagen nicht kennst. Irgendwann musste vielleicht doch Änderungen vornehmen - ohne fremde Hilfe. Den Rest der dir noch fehlt musste auch selbst schreiben oder Lib suchen. Encoder etc.

100ms / 62,5ns = 1.600.000

Das geht schon mal gut auf. Mit einem Prescaler von 64 kommt man dann auf 1.600.000 / 64 = 25000. Dann muss man noch mal -1 machen, aber es passt gut in ein 16 Bit Register (Timer1)

Alternative Herleitung:
(16 MHz / 64 * 100ms) -1
(Prozesortakt / Prescaler * Zeit) - 1

Es gibt dafür genug Anleitungen im Netz, wobei der Code dort nicht immer optimal ist. Wie die Register genau funktionieren steht im Datenblatt