Forum: Projekte & Code Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88


von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Stoppuhr:
Die gezeigte Schaltung misst die Zeit zwischen zwei Flanken an INT0 und 
INT1 und bringt sie zur Anzeige. Es werden die negativen Flanken 
gewertet; die Pullpus an den Eingängen sind aktiviert. Wird einer (oder 
beide) der Eingänge zur Flankenwahl gegen GND geschaltet, wird die 
betreffende positive Flanke ausgewertet.
Sofern sich die Impulse nicht überlappen kann man  mechanische Taster 
anschließen; ein Prellen stört nicht, da nur die allererste Flanke die 
Messung startet oder stoppt.

Geschwindigkeit:
Zudem wird die Geschwindigkeit aus der Zeit errechnet, mit welcher ein 
Körper eine Distanz von 0,1 m (100 mm) zurücklegt. Für einen einfachen 
Messaufbau reichen zwei Lichtschranken im Abstand von 100 mm, durch die 
sich das Objekt bewegt. Da offene Lichtschranken mit Fototransistor 
einen low-Pegel liefern, wird die hintere Kante des Objektes beim 
Austritt aus der Lichtschranke gemessen.

Pulsweite:
Wird ein Signal gleichzeitig an beide Eingänge gegeben, so ergibt sich 
als Messwert bei gleicher Flankenauswertung die Dauer eine einzelnen 
Periode. Durch Umschalten einer Flanke wird entweder die positive oder 
negative Pulsweite des Signals gemessen – bezogen auf die Flanke an 
INT0.

Die Anzeige erfolgt auf einem LCD 2 x 16:
"t:   3.7355 ms  "
"v:   26.770 m/s "

Die Ergebnisse werden 5-stellig mit max. 50 ns Auflösung und einem max. 
abs. Fehler von 1µs angezeigt; die angezeigten Werte sind entsprechend 
zu bewerten. Bei schneller Impulsfolge werden max. 100 Messungen/s 
erreicht.

Eine fast identische Hardware benutze ich bei diversen Schaltungen. Dort 
finden sich auch weitere Beschreibungen.
Beitrag "einfache Drehzahlmessung mit ATmega88"
Beitrag "4-Kanal Drehzahlmessung mit ATmega88"
http://www.mino-elektronik.de/fmeter/neue_versionen.htm

Ein paar Leerplatinen dafür habe ich herumzuliegen. Sie dienen mir ab 
und zu, um bei Musterbestellungen auf eine Mindestplatinengröße zu 
kommen; bei Bedarf einfach fragen.

von Jan T. (cmoses-xd)


Lesenswert?

Hallo,
vielen Dank das ist ja schon die Lösung,
sehr gut sind auch die Kommentare im Quelltext.
Ich werde mich dann demnächst damit beschäftigen.

Ich verstehe aber nicht was genau J1 Progr. in der Schaltung sein soll,
sieht aus wie eine Steckverbindung?

von m.n. (Gast)


Lesenswert?

Jan T. schrieb:
> Ich verstehe aber nicht was genau J1 Progr. in der Schaltung sein soll,
> sieht aus wie eine Steckverbindung?

Das ist der Programmieranschluß (ISP) für den µC; darüber kann man 
jederzeit bequem ein neues Programm einspielen. Bei meinen Platinen 
verwende ich aus Platzgründen die TQFP32 Gehäuse (SMD), die nicht 
steckbar sind. Wenn man einen Lochrasteraufbau plant, gehen natürlich 
auch die DIL28 Gehäuse.

von M. N. (Gast)


Angehängte Dateien:

Lesenswert?

Das ursprüngliche Programm ist leicht fehlerbereinigt und gibt zudem das 
Ergebnis für die Zeitmessung über die ser. Schnittstelle mit 19200 Baud 
aus.

Die Dateiendung .INO zeigt, dass es eine Anpassung für einen Arduino UNO 
R3 ist. Wer mit Arduino nichts zu schaffen hat, ändere die Endung bitte 
in .c und verwende zur Compilierung das AVR-Studio mit ATmega88 bzw. 
..328 als Zielprozessor!

Arduino-Anwender können die Quelldatei "LS_328_ARD.ino" direkt 
verwenden: compilieren (CTRL+R), auf den Prozessor laden (CTRL+U) und im 
Serial Monitor (SHIFT+CTRL+M) die Ergebnisse ansehen. (Der richtige 
COM-Port sowie 19200 Baud müssen vorab eingestellt sein.)
Die Ausgabe erfolgt per USB-Anschluß zum PC.

Ein 2 x 16 LCD ist optional und kann bei Bedarf wie im Schaltbild 
gezeigt angeschlossen werden; unter Umständen muß die 
Kontrasteinstellung angepaßt werden.

von Jan R. (Gast)



Lesenswert?

Hallo M. N.,

Dein Beitrag und Deine Datei für den Arduino UNO R3 sind eine super 
Hilfestellung für mich. Vielen Dank soweit schon einmal!

Ich versuche momentan Deinen Arduino-Code für den Leonardo (mit 
ATmega32U4) ein wenig umzuschreiben, abgesehen von ein paar 
Parameteränderungen für meinen Aufbau.
Ich habe und nutze weder den vorgesehenen Schalter über die PINS zur 
Flankenwahl (sondern ändere den Code etwas ab) noch die 
Anschluss-Möglichkeit für ein LCD-Display. Aber das sollte ja keinen 
Abbruch tun.
Ich möchte die ermittelten Werte eigentlich erstmal nur über den Serial 
Monitor lesen können.

Nun habe ich also im Manual für den ATmega32U4 versucht die richtigen 
Bezeichnungen für die verwendeten Register zu finden und im 
Original-Code zu ersetzen.
Da ich auf diesem Gebiet (Arduino, Interrupt-Programmierung und auch 
Register) sehr unerfahren bin, kann es gut sein, dass ich nicht alles 
richtig gemacht habe.

Das Ergebnis ist, dass der Code nicht auf dem Arduino Leonardo läuft, 
sondern zu einem Absturz führt. Ich muss anschließend einen 
Hardware-Reset durchführen und anderen funktionierenden Code hochladen, 
damit der Leonardo wieder zuverlässig mit meinem Rechner kommuniziert.

Könnte mir bitte jemand helfen und prüfen, ob ich die richtigen 
Ersetzungen vorgenommen habe? Hier meine Änderungen (das Schema wird 
schnell ersichtlich):

UCSR0B -> UCSR1B
UCSR0C -> UCSR1C
UCSZ01 -> UCSZ11
UCSZ00 -> UCSZ10
UBRR0 -> UBRR1
RXEN0 -> RXEN1
TXEN0 -> TXEN1
UDR0 -> UDR1
UCSR0A -> UCSR1A
UDRE0 -> UDRE1

Es könnte natürlich sein, dass mein Problem an einer ganz anderen Stelle 
liegt?! Vielleicht bei den Interrupt-Vektoren? Aber eigentlich denke 
ich, dass es die gleichen für beide Mikrokontroller sind.
Der modifizierte Code angehängt.

Über Unterstüzung würde ich mich sehr freuen.
Mit bestem Gruß
Jan

von Jan R. (Gast)


Lesenswert?

Hallo nochmal,

tut mir leid, dass ich die gleiche Datei zweimal angehangen habe. Das 
war ein Versehen.

Vielleicht ist es noch nützlich zu wissen, dass die On-Board-LED des 
Leonardo nach dem Hochladen des modifizierten Codes im 
Dauer-Leucht-Modus verharrt, wenn der Leonardo "abgestürzt" ist? 
Vielleicht ist es aber auch nur ein ganz normaler Zustand für einen 
"abgestürzten" Leonardo.

Mit bestem Gruß
Jan

von m.n. (Gast)


Lesenswert?

Jan R. schrieb:
> Ich möchte die ermittelten Werte eigentlich erstmal nur über den Serial
> Monitor lesen können.

Hallo Jan,

ich habe keine Ahnung vom Leonardo, aber die Ausgabe über den Serial 
Monitor kann m. E. so nicht funktionieren. Beim Uno werden die seriellen 
Ausgaben vom RS232->USB-Umsetzer weitergeleitet. Beim Leonardo sind 
RxD/TxD aber garnicht beschaltet; die Ausgabe müßte direkt per USB 
erfolgen.

Es gibt zunächst zwei Möglichkeiten, das Programm zur Funktion zu 
überreden.

1. Die Routinen für die USART-Ausgabe ausmaskieren und sehen, ob das 
Programm dann läuft. Eine LED am E-Ausgang fürs LCD sollte bei neuen 
Daten aufblitzen. Dann könnte man sehen, ob die eigentliche Messung 
funktioniert.
Einfach ein Signal 10 Hz - 1 kHz an beide INT-Eingänge legen, das reicht 
zur Simulation für fortlaufende Messungen.

2. Die Routinen für die Messung ausmaskieren und sehen, ob die serielle 
Ausgabe funktioniert. Falls nicht, muß man hier die Ursache suchen und 
beheben, und dann beide Programmteile wieder zusammen aktivieren.

Hilfreich ist es immer, einen Ausgang des µC zur Kontrolle zu verwenden, 
wieweit das Programm beim Ablauf kommt und wo es stehen bleibt.
Da mußt Du durch ;-)

von Jan R. (Gast)


Lesenswert?

Hallo M.N.,

Danke für Deine sinnvollen Vorschläge. Du hast Recht, ich sollte es 
vielleicht erstmal mit einem klassischen Debugging-Ansatz probieren.

Ich werde berichten...

Mit bestem Gruß
Jan

von Jan R. (Gast)


Lesenswert?

Hallo M.N.,

ich bin in der Zwischenzeit leider noch nicht dazu gekommen so wirklich 
an dem Thema weiterzuarbeiten. Aber ich werde es gewiss noch tun.

Aber mir ist eine Frage in den Kopf gekommen:
Du hast ja eigentlich geschrieben, dass das Programm direkt über die 
Arduino IDE auf den Arduino übertragen werden kann, wenn ich es richtig 
verstanden habe. Das habe ich bisher probiert.

Je mehr ich in der Zwischenzeit über die IDE erfahren habe, desto mehr 
bekomme ich jedoch den Eindruck, dass ich das Programm mittels z.B. 
AVR-Studio kompilieren und auf den Arduino übertragen sollte.

Soweit mir bekannt ist, erwartet die IDE doch nur Quelltext-Teil in 
mindestens zwei Funktionen: void setup() und beispielsweise void loop().
Die Integration von header-Dateien dürfte doch über die IDE z. B. gar 
nicht möglich sein.

Oder liege ich total falsch? Über einen Hinweis würde ich mich sehr 
freuen.
Mit bestem Gruß
Jan

von Mike (Gast)


Lesenswert?

Jan R. schrieb:
> Je mehr ich in der Zwischenzeit über die IDE erfahren habe, desto mehr
> bekomme ich jedoch den Eindruck, dass ich das Programm mittels z.B.
> AVR-Studio kompilieren und auf den Arduino übertragen sollte.
<ot>
Mit Atmel Studio scheint das zu funktionieren.
Beitrag "Arduino Library unter Atmel Studio 6.2"
</ot>

von m.n. (Gast)


Lesenswert?

Jan R. schrieb:
> Du hast ja eigentlich geschrieben, dass das Programm direkt über die
> Arduino IDE auf den Arduino übertragen werden kann, wenn ich es richtig
> verstanden habe. Das habe ich bisher probiert.

Beide Dateien, ob .c oder .ino, sind gleich. Mit der Arduino IDE kann 
man auch 'normale' C-Programme schreiben und diese per integriertem 
Bootloader auf einen ATmega328 übertragen. Allerdings ist es etwas 
mühsam, da die IDE doch sehr bescheiden ist. AVR-Studio (ich verwende 
noch 4.19) ist da deutlich komfortabeler.

Bei meinen Programmen verwende ich weder 'setup()' noch 'loop()', da 
hiermit irgendwelche Standardfunktionen eingebunden werden, die die frei 
Verwendung des ATmgea einschränken (timer z.B.).

Hast Du es denn mittlerweile geschafft, Ausgaben per Serial Monitor an 
den PC zu machen? Ich glaube, das Problem liegt an der Hardware des 
Leonardo.

von J.B. (Gast)


Lesenswert?

Hallo,

ich weiß - der Beitrag ist schon sehr alt... aber gibt es noch Platinen?

Und ich sehe gerade nicht was die maximale messbare Zeit ist.

Müsste für meine Zwecke bis zu 200 sec. sein. Die Auflösung und 
Genauigkeit ist genial! Wie sieht es da aber mit dem Quarz und 
Temperaturempfindlichkeit aus?

Viele Grüße
Joachim

von m.n. (Gast)


Lesenswert?

Im Programmkopf steht die Meßzeit von 10 µs - 200 s. Längere Meßzeiten 
sind kein Problem, wenn man die Zähler größer auslegt.
An Stelle eines Quarzes kann man auch einen TCXO bestücken, um die 
Temperaturempfindlichkeit zu reduzieren.
Platinen könnte ich nachfertigen lassen; auf Lager habe ich davon keine 
mehr, da ich für neuere Frequenzzähler - das ist die Hauptfunktion 
dieser Schaltung - den STM32F407 verwende: 
http://mino-elektronik.de/FM_407/fmeter_407.htm
Damit lassen sich Auflösung und Genauigkeit von bis zu ca. 5 ns 
erreichen.

Die oben gezeigte Schaltung ist aber so simpel, daß man sie auch 
problemlos auf Lochraster aufbauen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.