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.
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?
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.
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.
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
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
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 ;-)
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
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
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>
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.