ich möchte mit einem Empfänger die Pulslänge einer Sendediode bestimmen.
Die Sendefrequenz liegt zwischen 2khz und 6 khz, PWM. Daher möchte ich nicht die Frequenz sondern die Pulslänge highsignal bestimmen.
Da mehrere Versuche bisher nicht zuverlässig funktionierten, habe ich mal folgendes probiert:
int0 auf steigende Flanke
int1 auf fallende Flanke
beide Interupt-Eingänge an den Empfänger angeschlossen,
start timer1 bei int0
stop timer1 bei int1
aber ich erhalte immer den Wert 133 ?? Egal wie lange, kurz ich eine Testsendediode (nicht gepulst) an den Empfänger halte.
Kann mir jemand sagen wo mein Fehler liegt? Habe hier schon mal andere Ideen angeschaut, aber warum geht meins nicht?
Programm ist angefügt.
kannst du nicht einfach während des interrupt die flankenempfindlichkeit von pin0 umdrehen ? also nachdem rising interrupt config int0 = Falling ?? oder kostet das zu viel zeit eventuell ? vielleicht liegt das problem darin das der impuls zu schwach ist ? ich musste meinem cmps03 modul einen transistor auf vcc spendieren damit das signal hoch genug für einen interrupt ist und der taktet bei 1-37ms taktbreite mit flankenabstand steigend 56ms
EDIT: falls es am code liegt .... so sehr ich mich angestrengt habe ... so wenig konnte ich den code entziffern ... tut mir leid ich bevorzuge c >_< (nix persönliches ich verstehe es einfach nur besser)
Das mit der Flankenumkehr habe ich noch gar nicht probiert. Das ist natürlich besser als zwei Interrupts zu verbraten.
Als Empfänger habe ich eine "normale" Fotodiode mit Tageslichtsperrfilter SFH205 in Reihe mit 50K als Spannungsteiler
+Vcc .
.
.
R
.
. ....... Int 0/ Int 1 Atmega8
.
.
SFH205
.
.
GND
Das das Signal zu schwach ist könnte bei hohen Frequenzen vielleicht stimmen, aber das klappt ja auch bei einer hingehaltenen IR-LED schon nicht.
irgendwie versteh ich an der stelle den spannungsteiler net ... müssten GND und vcc nicht andersrum sein ? ich weis es net sorry >_< ich hab naja ... einfach en pnp genommen, vcc zu C impulsleitung zu B und E zum eingang int0 und indirekt einen widerstand in form der statusLED zu gnd also im pinzip deine schaltung mit einem transistor da wo deine SFH sitzt und statt deines R eine LED mit vorwiderstand und VCC und GND genau anders herum als deins
1. Bei den Atmega-s kann man die Interrupt Eingange so konfigurieren, dass bei jeder Änderung ein Interrupt auftritt.
2. Weiters muss Du beachten, dass Du eine genügend hohe Abtastrate hast (Shannon'sches Abtastheorem). Ausserdem kommt bei Dir nur dann ein Interrupt an, falls die Impulslänge einen Mindestwert erreicht.
3. Messe mal die Pegel, es kann gut sein, dass da was faul ist
4. Wie ist die Taktfrequenz des Prozessors? Du musst sicherstellen, dass Deine Interruptfrequenz unter ALLEN Umständen schneller abgearbeitet wird, als dass ein neuer Interrupt auftreten kann.
ich geh mal davon aus das er mind. 1 MHz hat sicherlich aber 8, das sollte doch net das problem sein ...
ich vermute eher das die pegel nicht ausreichen, wie es bei mir fer fall war ....
obwohl wenn cih so drüber nachdenke ...
WENN deine lowphasen zwischen 2 pulsen IMMER den gleich abstand haben, ist es absolut logisch das du bei deiner schaltung IMMER den gleichen wert erhälst ...
WENN die flanke fällt (IR-signal fällt ab) dann steigt die spannung am port! wenn die IR-Flanke hochgeht, fällt der widerstand, die spannung am port nimmt ab !!!
d.h. du misst den abstand zwischen 2 Impulsen und wenn der modulationsbedingt immer gleich ist, ist logisch das du immer denselben wert misst ... dreh mal die polung um, VCC und GND tauschen (auch den transistor umdrehen)...
das wäre jetzt den elktrisch logische schluss für mich wenn es nicht der pegel ist der ein problem bereitet (ich merke hier an, dass ich in elektrotechnik keine wirkliche leuchte bin)
Das mit den Interrupts auf jede Änderung reagieren hatte ich noch nicht probiert. Ist natürlich eleganter als beide Int zu benutzen.
Ich habe den Atmega mit 8Mhz laufen.
Abtastrate müsste hinkommen (nicht berechnet) da der Controller nnichts anderes macht als auf die Int zu warten.
Warum kommt bei mir nur ein Interrupt an wenn die Impulslänge einen Mindestwert hat? Vom Pegel liege ich zwischen 4,5V und 0,5V, sollte also gehen.
Die Anmerkung zum Spannungsteiler stimmt natürlich. Habe durch meine Anordnung umgekehrte Logik, Sendesignal 1 -> Eingang 0 und umgekehrt.
Aber: ich habe ja zum Testen eine IR-LED konstant mit Vcc versorgt und gehe damit über den Empfänger. Daher dürfte die Abtastrate ja auf alle Fälle reichen und ich habe ja eigentlich immer andere Werte (Impulslängen).
man muss nur mal mit netten Leuten wie euch darüber reden. Natürlich passt der Spannungsteiler nicht mit der Interrupt-Abfrage 0/1/0 überein da ja in unbeleuchteten Zustand 1 anliegt. Änderung der Flankenerkennung auf 1/0/1 funktioniert jetzt mit der IR-LED die ich von Hand vorbeibewege. Immer andere Werte, so wie es sich gehört.
Nur ein 3 Khz PWM Signal das ich ja erkennen will oder zum Test mal eine TV-Fernbedienung genommen zeigt als Wert immer 126 an.
D.h. der Zähler zählt bis 126, bei 8MhZ Taktung und Timer Teiler 1
--> 8MhZ = 0,125 uS pro Timerwert
--> 0,125uS * 126 = 15,75 uS
--> 63,492 KhZ
sind aber nur 3Khz PWM mit 3:1 Puls-Pausenverhältnis und irgendwas anderes bei der TV-Fernbedienung
Wo kommt jetzt der gemessene Wert her und warum ist das gleich wie bei der Fernbedienung?
Der Zähler zählt bis 126, bei 8MhZ Taktung und Timer Teiler 1
--> 8MhZ = 0,125 uS pro Timerwert
--> 0,125uS * 126 = 15,75 uS
--> 63,492 KhZ
sind aber nur 3Khz PWM mit 3:1 Puls-Pausenverhältnis und irgendwas anderes bei der TV-Fernbedienung
3 khz = 333,33 uS pro Periode
Puls-Pausenverhältnis 3:1
333,33uS für 4 Teile
--> Pause 83,33uS Puls 250uS
Puls von 250uS / 0,125uS pro Timerwert würde bedeuten das ein Wert von 2000 angezeigt werden müsste und nicht 126
Timer0 ist ein 8bit Zähler und bis 255, Timer1 ein 16 Bit, aber habe beide ausprobiert, beide gleiches Ergebnis und ich habe auch einen Übertrag gespeichert.
Stellt man den Teiler der Zähler auf 1/8 ein ist das Ergebnis auch nur 1/8 von 126. Also scheint das System zu haben. Nur woher kommt der Wert?
Habe jetzt mal mit nur einem Interrupt das Progr. geschrieben also wie der Vorschlag war, aber gleicher Effekt nur das jetzt immer 139 anstelle von 126 erscheint.
Lesezeichen