Hallo! Ich möchte mittels einer Lichtschranke die Umdrehungsgeschw. eines Rades herausfinden. Nun zwei Fragen: 1. Ich habe einmal ein Bauteil gesehen mit welchem man eine modulierte IR-Lichtschranke mit minimaler externer Beschaltung realisieren kann. Kennt jemand einen Solchen Baustein und evtl noch einen Schaltplan? 2. Hat das schon mal einer Softwaremässig realisiert? Ich denke, dass ich die Lichtschranke an einen externen Interrupt anschliesse und die Zeit zwischen zwei Interrupts messe (mittels 16-bit Timer). Nun die Frage: Wie muss ich das mit dem Timer genau anstellen, bzw. einstellen? Ich benutze den ATmega8 Grüsse und danke Stefan
Wieso Interrupt? Du kannst doch auch den Impuls der Lichschranke auf einen Freuqenz-Voltage decoder leiten, dieser gibt dir dann proportional zur frequnz eine Spannung aus, die du wiederum mit deinem AD-Wandler auswerten kannst. Gruß Chris
naja, das ist wohl nicht der Hit... Digitales Signal mit einem teuren Baustein in ein analoges Signal verwandeln und das dann wieder digitalisieren?? Abgesehen vom Aufwand entstehen bei jeder Wandlung Fehler. Zur Lösung: das Signal an den ICP-Eingang, Timer durchlaufen lassen mit höchster Frequenz (oder auch Vorteiler bei langsamen Signalen). In der ICP-ISR bildest du einfach die Differenz des alten ICP zum aktuellen, anschliessend noch den neuen Stand Variable alter_ICP speichern. Nur mit 16bit-unsigned-Variablen arbeiten, dann brauchst du dich nicht mal um den Timer-Überlauf kümmern, das Ergebnis stimmt auch bei zwischenzeitlichem Überlauf. Falsch wirds erst, wenn der Timer zwischen 2 ICP-Ereignissen 2 oder mehrmals überläuft. Ist das möglich, kann man das auch per Software lösen.
Hi oder man setzt im ICP-INT den Timer wieder auf 0 zurück. Dann kann man mit dem OV-INT auch feststellen ob die Frequenz ein Minimum unterschritten hat. So mach ich das zumindest immer und hab gute Erfahrungen damit gemacht. Bei deiner Methode muß man das Auftreten eines Stillstandes irgendwie anders erkennen. Zur Lichtschranke: Eine Senddiode mit 36kHz modulieren (Einfach mit 36kHz ein/ausschalten) Als Empfänger dann einen TSOP1736. Matthias
ist im Prinzip richtig, aber es können sich Fehlerquellen einschleichen, wenn auch andere Ints laufen. Rücksetzen auf 0 kommt verspätet, den systematischen Fehler kann man ausgleichen, nicht jedoch, wenn der MC gerade andere Ints bearbeitet. Diese Fehlerquellen entfallen bei meiner Methode, ausserdem kann der Timer1-OV als fester Zeitgeber für andere Programmteile genutzt werden. Aber: es führen wie immer mehrere Wege nach Rom :-)
Hi Stmmt. Ich erfasse mit dieser Methode hauptsächlich langsame Frequenzen (Timer läuft im /8 Modus) Bei der schnellsten zu erwartenden Frequenz von etwa 500Hz hab ich bei 1MHz Abtastung immer noch einen ICR-Wert von 2000. Wenn da mal 30 oder 40 Takte verlorengehen macht das so in etwa garnichts. Man muß eben abwägen was wichtiger ist: Genaue Erfassung der Frequenz oder schnelle Erfassung wenn kein Signal mehr anliegt. Bei mir ist zweiteres wichtiger. Matthias
OK, da ich alle anderen Interrupts ausschalten kann nehme ich wohl die Methode dass ich bei jedem Interrupt den Timer auf 0 zurücksetze und dann beim nächsten interrupt den Zählerstand abspeichern und wieder auf null zurücksetzen, so sollte es dann laufen. Was passiert wenn der Timer überläuft? Gibt es da einen Interrupt oder kann man das sonst irgendwie schön abfangen? Danke für eure Hilfe
OK danke!! Ich meld mich dann nochmals, wenn ich Probleme mit dem Programm habe!
@matthias:
gerade noch mal in alten Programmen nachgeschaut, in der ICP-ISR wird
ein Register gelöscht, in der T1_ov-ISR wird es incrementiert und auf
>1 getestet. Wenn ja -> Signalausfall.
Ausserdem wurde eine OCR-PWM benutzt, Pin_set on T1_OV, Pin_clr on
T1_OCR.
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.