Kategorie-Archiv: Embedded

Touchsensor TTP223 Test

Ich wollte mal ausprobieren, ob sich die Touchsensoren für den Aufbau von Stellpulten eignen. Die Verwendung ist einfach und sie funktionieren gut, es gibt aber auch ein paar Schattenseiten.

#define TOUCH_INPUT 2
#define SIGNAL 3
#define SETTLE_TIME 100

void setup() {
pinMode( TOUCH_INPUT, INPUT );
pinMode( SIGNAL, OUTPUT );
}

void loop() {
int isTriggered = digitalRead( TOUCH_INPUT );
digitalWrite( SIGNAL, switchState( isTriggered ) );
}

boolean actState = false;
boolean lastActive = false;
boolean switchState( boolean signal ) {
boolean deb = debounce( signal );
if ( deb ) {
if ( !lastActive ) {
lastActive = true;
actState = !actState;
}
} else {
lastActive = false;
}

return actState;
}

int trig = 0;
boolean debounce( boolean signal ) {
if ( signal ) {
if (trig == 0) {
trig = millis();
} else {
int now = millis();
if ( now – trig > SETTLE_TIME ) {
return true;
}
}
} else {
trig = 0;
}

return false;
}

Simulation der Vorsignalansteuerung im Bahnhof Calw, Teil 2

Die Weichen und Signale im Bahnhof Calw wurden bis zum Schluss mechanisch gestellt – mit einer Ausnahme: die Vorsignale zu den Hauptsignalen wurden elektrisch gesteuert. Die Anzeigen für diese Vorsignale haben wir mittels eines Arduino Nanos auf unserer Schauanlage wieder aktiviert.

Den ersten Teil finden Sie hier:

Musik:
Perspectives Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/

Frequenzzähler/ Periodenmesser mit einem PIC32 – Teil 7

Heute habe ich mich mal hingesetzt um den Schaltplan und die Funktionsweise der Counter Teils aufzuzeichnen.

Die Funktionsweise ist eigentlich einfach. Wenn man einfach nur die Signalimpulse über einen definierten Zeitraum (der Torzeit) zählen würde, wäre es praktisch nicht möglich bei niedrigen Frequenzen eine vernünftige Auflösung zu bekommen. Für eine 6-stellige Anzeige benötigt man 1 Millionen Takte. Bei 100 Hertz wäre dafür eine Torzeit von 10.000 Sekunden nötig – rund 3 Stunden.

Alternativ dazu kann man die Periode messen. Dazu gibt das Messsignal die Torzeit vor und man zählt, wie viele Takte das Referenzsignal in dieser Zeit abgibt. Das ist bei 100 Hertz gut machbar, bei 1 MHz wiederum kaum mit guter Genauigkeit möglich.

Das hier verwendete Messprinzip ist im Wesentlichen eine Kombination der beiden Messmethoden. Bei einer Messung werden gleich zwei Zähler aktiv. Über den Zeitraum der Torzeit zählt ein Counter die Takte der Referenzfrequenz und ein weiterer die Takte der Signalfrequenz. Über das D FlipFlop wird sicher gestellt, dass die tatsächliche Torzeit immer nur ganze Perioden der Signalfrequenz beträgt. Andernfalls würde man bei niedrigen Frequenzen einen erheblichen Messfehler bekommen.

Schaltplan Counter

Das Diagramm zeigt ein Eingangssignal von 12,5 MHz an Pin A.

Wenn der Microcontroller eine neue Messsequenz einleiten will, setzt er Pin B auf 1. Da das D FlipFlop ein invertiertes Signal bekommt, wird mit der nächsten fallenden Signalflanke die Torzeit beginnen, der Ausgang Q des FlipFlop springt dann auf 1 (Pin C)

Mit dem Beginn der Torzeit werden über die beiden UND Gatter die beiden Counter für Signal- und Referenzfrequenz freigeschaltet und zählen nun hoch (Pin D und E an Pin 2 und 4 des Microcontrollers).

Der Microcontroller kann den Beginn der Torzeit über seinen Input – Pin C (an Pin 3 des PIC) lesen. Jetzt wartet er die gewünschte Zeit ab (z.B. ca. eine Sekunde) und setzt den Pin B wieder auf 0 zurück. Die genaue Zeit ist hier nicht wichtig, sie geht nicht in das Messergebnis ein solange sie ausreichend groß für die gewünschte Auflösung ist.

Das Tor bleibt jetzt aber noch offen – bis zur nächsten fallenden Flanke des Signals. Damit ist sicher gestellt, dass nur ganze Signalperioden gelesen werden. Wenn der Microcontroller feststellt, dass am Pin C wieder 0 anliegt, weiß er, dass eine Messperiode abgeschlossen ist. Nun kann er die Counter einlesen und das Ergebnis berechnen.

Im Bild sieht man die (viel zu kurze) Torzeit des Microcontrollers am Pin B von 200 nS (5 Referenz-Takte). Durch die Synchronisierung mit dem Signal wird die tatsächliche Torzeit auf 6 Takte gedehnt (Pin C). In dieser Zeit werden 3 steigende Flanken des Signals gezählt und 6 steigende Flanken der Referenz.

Aus diesen Werten kann nun die tatsächliche Signalfrequenz ermittelt werden:
Signalfrequenz = Signal-Takte * Referenzfrequenz / Referenz-Takte = 3 * 25000000 / 6 = 12500000

Natürlich ist die Torzeit in der Zeichnung viel zu kurz. Tatsächlich würde man hier eher eine Torzeit von ca. einer halben Sekunde wählen. Das kann ich nur nicht vernünftig Zeichnen. In diesem Fall würde die Rechnung vielleicht so aussehen ( bei einer Torzeit 0,51 Sekunden):
Signalfrequenz = Signal-Takte * Referenzfrequenz / Referenz-Takte = 6375000 * 25000000 / 12750000 = 12500000

Weiter zum Teil 8 und letzten Teil

Frequenzzähler/ Periodenmesser mit einem PIC32 – Teil 6

Heute bin ich dazu gekommen den internen Oszillator einzubauen. Ich habe dafür einen TCXO mit 25 MHz bestellt – in der Hoffnung, dass ich damit eine gute Stabilität erreiche. Laut Datenblatt sollte die Genauigkeit im Bereich 50ppm liegen. Zur Messung steht mir nur mein Rigol DG1062 zur Verfügung. Ich weiß nicht sicher, wie genau dieses Gerät ist, aber da es recht teuer war, hoffe ich auf gute Eigenschaften. Mein TCXO liegt 23ppm neben der Nomialfrequenz. Im Laufe der letzten Stunde hat die Anzeige meines Frequenzmessers nur um 4 Digits auf der 8. Stelle geschwankt. Das akzeptiere ich mal als sehr gutes Ergebnis.

Aufgrund des Messprinzips kann man sehr niedrige Frequenzen messen. Ich bin mir nicht sicher, ob ich die Originalschaltung falsch gelesen habe oder ob sie tatsächlich eine Race Condition enthält – bei mir hat das dazu geführt, dass ich mit ca. 50%er Wahrscheinlichkeit einen Takt zu viel gezählt habe. Bei 20 MHz und einem Messintervall von 1 Sekunde ist das kein Problem. Bei 1 Hertz gibt das völlig falsche Ergebnisse. Ich habe die Schaltung deshalb so abgeändert, dass das Gate mit fallenden Takt statt mit steigenden Takt geschaltet wird. Bei steigenden Takt zählt der Zähler hoch, so dass ich eine halbe Taktperiode Zeit zwischen den beiden wichtigen Ereignissen bekomme. Nach dieser Änderung steht die Anzeige auch bei sehr niedrigen Frequenzen exakt.

Bei sehr niedrigen Frequenzen unter 2 Hertz verlängert sich das Messintervall, im Durchschnitt auf das 2-fache der Periodendauer. Unter 100 Millihertz bekomme ich aber auch keine sinnvolle Anzeige mehr. Das ist aber auch nicht wichtig, es liegt weiter außerhalb des angepeilten Messbereichs. Nach oben komme ich bis 24 MHz, darüber gibt es ebenfalls erhebliche Messfehler.

Jetzt fehlt noch eine verbesserte Software mit Anzeige des Messbereichs (Hertz, Kilohertz, Megahertz), das Netzteil und das Gehäuse.

Weiter zum Teil 7

Frequenzzähler/ Periodenmesser mit einem PIC32 – Teil 5

Nach einigen Fehlversuchen bin ich nun wieder einen Schritt weiter. Geplant war es eigentlich, dass ich mit einen Referenztakt von 25 MHz arbeite. Bei meinem aktuellen Aufbau komme ich aber nicht zuverlässig über 10 MHz. Allerdings habe ich noch viele lang frei fliegende Leitungen.

Bei einem Referenztakt von 10 MHz und einem Signal von 1,234567 MHz komme ich auf eine Anzeige, die zwischen 1,234567 und 1,234568 pendelt. Besser kann ich es nicht erwarten. Meine Messperiode liegt bei ziemlich genau einer Sekunde.

Meine Hand liegt nicht zufällig links neben dem Zählermodul auf dem Kabel der Spannungsversorgung. Sie dient als Filter damit ich nicht über dieses Kabel erhebliche Störungen einfange. Ohne diesen Filter sind meine Messwerte immer ca. ein Promille zu hoch.

Die nächsten Schritte bestehen darin, dass ich den externen Referenztakt von meinem Funktionsgenerator auf den internen Oszillator umstelle. Dabei werde ich dann nochmal versuchen auf 25 MHz zu gehen und die Messperiode auf eine halbe Sekunde verkürzen. Falls das nicht klappt, bleibe ich eben bei 10 MHz.

Weiter zum Teil 6