Ich habe jetzt eine andere Lösung mit einem Drehpoti / Encoder hinbekommen.
https://www.conrad.de/de/encoder-10-v-0 ... 94450.html
Datenblatt:
http://www.produktinfo.conrad.com/daten ... 2B_S_Z.pdf
Es werden 2 Digital-Eingänge benötigt für die Spur A (CH. A) und Spur B (CH. B). Diese habe ich an PD2 und PD3 angeschlossen.
Zuerst hatte ich die Abfrage der Eingänge und entsprechende Auswertung mit Zähler und Richtungserkennung in der loopRF( ) funktion in der RF.cpp. Das wollte aber nicht einwandfrei klappen, der Zähler zählte nicht genau. Dann habe ich eine simple Wechselschaltung in die Funktion eingebaut, beim Aufruf der Funktion wird ein Augang eingeschalten, beim nächsten Aufruf wieder ausgeschalten.
Code: Alles auswählen
if ( g_testLEDOutput == LOW )
{
g_testLEDOutput = HIGH;
}
else
{
g_testLEDOutput = LOW;
}
WRITE(35, g_testLEDOutput);
So konnte ich die Frequenz messen und die Zykluszeit der Funktion ermitteln. Frequenz von loopRF() bzw. deren Elternfunktion Commands::checkForPeriodicalActions() = 5 Hz , d.h. alle 100ms wird die Funktion aufgerufen. Damit lässt sich kein Encoder auswerten der eine Frequenz von 30HZ erreicht wenn man ihn so schnell dreht wie es geht.
Also habe ich eine Funktion gesucht die eine höhere Frequenz hat und bin fündig geworden: Commands::commandLoop() in der Commands.cpp, die Elternfunktion ist die loop() Funktion der Arduino-Routine. Diese sollte eigentlich die höchste Frequenz im ganzen Programm haben.
Die Frequenz der Commands::commandLoop() im Idle Zustand: etwa 8 kHz
Damit lässt sich was Anfangen.
Auswertung des Encoders in Commands::commandLoop() in der Commands.cpp:
Code: Alles auswählen
int valA = READ(SPURA);
int valB = READ(SPURB);
if (valA != g_extSpeedMult_lastValA)
{
if (valA == valB) Printer::feedrateMultiply++;
else Printer::feedrateMultiply--;
g_extSpeedMult_lastValA = valA;
}
Hier fehlen noch Begrenzungen etc., aber es funktioniert, den Speedmultipler im Qicksettingsmenü lässt sich genau in 1er Schritten einstellen und auch sehr schnell auf höhere Werte wie 400% einstellen.
Die Pin-nr. werden in der pins.h definiert. Da diese Eingänge sind sollten sie auch in die SENSITIVE_PINS Tabelle (ganz unten) mit eingefügt werden. Per G-code können Pins als Ausgänge definiert und ein-/ausschalten werden. Pins die in der SENSITIVE_PINS Tabelle sind werden da ausgeschlossen.
Der oben genantte Encoder hat zusätzlich neben dem Drehrad in der Mitte noch einen Taster und Aussen 4 weitere Richtungstaster (Oben, Links, Rechts, Unten). Damit könnte man das bisherige Richtungstastenfeld ersetzen und die Temperaturen, etc. viel schneller auf den gewünschten Sollwert einstellen.