> Controller und Sensor kommunizieren über I2C.
Heisst das, dass der Mikrocontroller den Sensor regelmäßig pollen muss?
Falls du damit wirklich Abweichungen unter 1ms erreichen willst, wird
das knapp.
> Wie kann ich den Timer manuell starten/stoppen?
Falls sich die Frage auf den Systemtimer bezieht: Ich weiß nicht ob man
ihn stoppen kann, aber das sollte man auf jeden Fall tunlichst
unterlassen. Du hältst ja auch nicht die Wanduhr an, wenn du ein Ei
kochen willst.
Die Idee des Systemtimer ist, dass da eine Variable fortlaufend
regelmäßig hochgezählt wird. Typischerweise ein 32bit Integer im 1ms
Intervall. Das hat auch jeder PC und jedes Smartphone so.
Bei ARM kann man auch andere Intervalle festlegen, zum Beispiel 0.5ms.
Aber übertreibe es nicht, denn sonst ist der µC übermäßig mit Interrupts
beschäftigt. Falls du weniger als 0,5ms brauchst, würde ich doch einen
anderen Timer verwenden.
Bedenke, dass der Timer genug Bits haben muss. Ein 32bit Timer im 1ms
Intervall kann fast 50 Tage erfassen. Ein 16bit Timer im 0,1ms Intervall
kann aber nur 6,5 Sekunden erfassen. Reicht das für deine Anwendung?
Wenn du es mit dem Systemtimer machst, dann ungefähr so:
1 | int warte_auf_start=1;
|
2 | uint32_t start_zeitpunkt;
|
3 | uint32_t ende_zeitpunkt;
|
4 | uint32_t zeitspanne;
|
5 |
|
6 | while (1) // endlos-schleife
|
7 | {
|
8 | if (warte_auf_start && messe_entfernung() < 100) // Beginn der Messung
|
9 | {
|
10 | warte_auf_start=0;
|
11 | start_zeitpunkt=systick_count; // oder wie auch immer dein systemtimer heisst
|
12 | }
|
13 | if (!warte_auf_start && messe_entfernung() > 120) // Ende der Messung
|
14 | {
|
15 | warte_auf_start=1;
|
16 | ende_zeitpunkt=systick_count;
|
17 | zeitspanne=ende_zeitpunkt-start_zeitpunkt;
|
18 | }
|
19 | }
|
Die selbe Methode kannst (nicht musst) du auch mit einem schnelleren
Hardware-Timer anwenden. Den lässt du einfach frei durchlaufen (nicht
starten und stoppen). Auch damit kannst du die beiden Zeitpunkte
(start/ende) erfassen und deren Differenz berechnen.
Wichtig ist dabei, dass die verwendeten Variablen (start_zeitpunkt und
ende_zeitpunkt) den selben Typ haben, wie der Zähler. Denn dann darf der
Timer zwischendurch sogar einmal (nicht öfter) überlaufen, und das
Ergebnis bleibt dennoch richtig.
Den Timer durchlaufen zu lassen hat den Vorteil, dass du ihn
gleichzeitig auch für andere Messungen verwenden kannst. Zum Beispiel,
wenn du mehrere solcher Sensoren mit einem einzigen µC verwenden willst.