Die Applikation servocontrol verwendet ein Potentiometer (mit 10 kOhm) und ein handelsübliches Modellbauservo: Über ein Drehen des Potentiometers wird die Helligkeit der LED und die Stellung des Servos verändert, wie im folgenden Video gezeigt.
Das Beispiel dient als Referenzimplementierung der Kapitel
- Kapitel 8.1.3, „Messen am Spannungsteiler“
- Kapitel 8.2, „Werte filtern“
- Kapitel 8.5.4, „Pulsweitenmodulation (PWM)“
Schaltungsaufbau
Das Potentiometer links ist wie in Kapitel 8.1.3 besprochen über einen Spannungsteiler versorgt. Es wird GPIO2 als ADC-Eingang verwendet. Der Anschluss des Servos ist in Kapitel 8.5.4 mit der „Level Conversion“ durch den Transistor beschrieben. Als Pull-Up wird ein 10 kOhm-Widerstand verwendet, eine Strombegrenzung vom Ausgang GPIO3 zur Basis des Schalttransistors übernimmt ein 1 kOhm-Widerstand.
Sourcecode
components/ringbuffer
enthält die Implementierung eines Ringpuffers als abstrakter Datentyp, wie er in Kapitel 8.2.1 beschrieben wird.
components/filter
enthält Implementierungen eines allgemeinen Filters mit den polymorphen „Unterklassen“ FIRFilter und IIRFilter, wie er in Kapitel 8.2.1 beschrieben wird.
main
baut auf dem ADC-Beispiel des ESP-IDF auf. Kanal 2 von ADC 1, der auf GPIO 2 geleitet ist, wird in der Hauptschleife zyklisch mit einer Periode von 50 ms ausgelesen und in drei Filter, nämlich einen moving average FIRFilter 2. Ordnung, einen moving averge FIRFilter 10. Ordnung und einen IIRFilter 2. Ordnung geleitet. Über die Einstellung „use filter for servo control“ in der „servocontrol Configuration“ kann gewählt werden, welche Filterausgabe anschließend zum Stellen des Servos (und der LED-Helligkeit) verwendet wird.
Die Filterwerte werden per printf() auf der Konsole ausgegeben. Es ist nun möglich, die Daten per FlexiPlot auszuwerten (siehe Kapitel 8.2).