PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wieder einer mit dem Impulslängenproblem :-)



Hei.Mor
31.01.2008, 21:52
Hallo,

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.

Danke und Gruß
Heinz

Ceos
31.01.2008, 22:06
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)

Hei.Mor
31.01.2008, 22:32
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.

Gruß

Ceos
31.01.2008, 22:45
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

pongi
01.02.2008, 10:29
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.

Ceos
01.02.2008, 10:49
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)

Hei.Mor
01.02.2008, 16:19
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).

Hei.Mor
01.02.2008, 18:35
Hallo,

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

Oder?

moto
01.02.2008, 20:20
bis wieviel zählt so nen timer? 255? kann das von sowas kommen?

Hei.Mor
01.02.2008, 20:29
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.

Ceos
02.02.2008, 00:54
grübelgrübel ... das iss echt merkwürdig Q_Q versuch es mal mit nem dazwischengefrickelten pnp-transistor als verstärker EVENTUELL hilft das ... mehr als raten kann cih lleider auch nciht mehr an der stelle, tut mir leid

sechsrad
02.02.2008, 12:10
nimm den "icp1/icp-anschluss" zum puls-messen.

Besserwessi
02.02.2008, 13:39
Zur genauen Pulsmessung sollte man wie gesagt den ICP Anschluss nehmen. Ablternativ geht auch der Komerator, wenn da signal klein ist. Aber die Signalstärke scheint ja schon geklärt.
Für die immer gleichen 15.75 us könnte ich 2 mögliche Erklärungen geben:
1) Störungen vom PC Monitor oder 100 HZ TV (31 kHz Horizontal, 1:1 Tastverhältnis -> ca- 16 us)
2) Der das Interrruptflag wurde nicht gelöscht, sodass sofort ein zweiter interrrupt ausgelöst wird. 16 us sind zwar eine recht lange Zeit für eine ISR routine aber in Basic könnte das schon mal passieren.

Hei.Mor
02.02.2008, 16:54
Habe das Programm mal mit 12MhZ ext.Quarz anstelle den 8Mhz internen Quarz laufen lassen. Gleiches Ergebnis. Liegt also nicht an einer Bearbeitungszeit, sonst wäre es unterschiedlich.
Habe jetzt mal die 3. Version probiert mit icp. Und ext. Quarz mit 12Mhz
Funktioniert zwar auch, aber die Werte passen immer noch nicht.
Vielleicht doch Störimpulse?

Oder habe ich den Sensor falsch, nicht optimal eingesetzt?
Was mich schon wundert das ich 50K Widerstand in Reihe zum SFH205 nehmen muss um ein brauchbares Signal (am SFH205 abgegriffen) zu bekommen. Passt nicht ganz mit dem Datenblatt überein.
Wenn ich das Signal verstärken wollte, wie müsste das mit den Widerständen aussehen um einen BC546B als Schalter zu verwenden?

Besserwessi
02.02.2008, 19:31
Eine gut Verstärkerschaltung für Photodioden/Transtoren geht wie folgt:
NPN-Transistor (möglicht hohe Verstärkung) mit Emitter gegen Masse. Photodetektor von der Basis nach Masse. Widerstand von ca. 5 K bis 50 K vom Kollektor nach VCC. Ausgang ist der Kollektor. Und schließlich noch ein Widerstnd vom Kollektor zur Basis. Der Wert dieses letzten Widerstandes gibt die Empfindlichkeit vor. Bei einer Photodiode sollten das ca. 100K-10 MOhm sein, bei einem Phototransitor eher 1K-1 M. Je nach Stärke des Lichsignals und Empfänger noch etwas mehr oder weniger.

Hei.Mor
03.02.2008, 14:47
habe die Verstärkerschaltung mal aufgebaut mit 500K Poti zur Basis, verstärkt wirklich sehr gut, d.h. Senderabstand kann größer werden. Aber der Effekt bleibt. Jetzt habe ich mal das Sensorsignal mit einem Oszilloskope angesehen. Das Signal ändert sich in der Amplitude wenn man mit dem Sender näher an den Sensor kommt, was einleuchtet, aber es ändert sich auch die Periode, d.h. die Frequenz ändert sich. Kann natürlich nicht sein aber das liegt wohl an der Signalverarbeitung das sich die Schwellwerte für 1 und 0 bei verschiedenen Amplituden ändern.

Werde die Signalerkennung mal über den Analog/Digital laufen lassen und da feste Werte abfragen ab wo 0 und 1 sein sollen.

Hei.Mor
05.02.2008, 20:47
O:) O:)

ich habe das Problem gefunden. Oh mannnnn.
Habe, nachdem eigentlich alle Programmvarianten nichts gebracht haben folgendes Probiert.
Wenn IRSensor = 1 dann Aufgang x auf 1 sonst auf 0
Beide Signale an 2Kanal Oszi und gestaunt das der Ausgang nicht immer kommt und wenn dann nur etwa halb so lange wie er müsste.
Dann habe ich einfach mal in einer Programmschleife den Ausgang getoggelt und am Oszi geschaut und gestaunt.
12MhZ Quarz ergibt eine Freq des Ausgangs von....
18 Hz, kein Einheitenfehler !
Dann Analog-Digitalwandler Abfrage raus ..... 3300 Hz, schließlich meine Anzeige (LCD) raus ergibt 1 MHz. Immer noch sehr wenig finde ich bei 12MhZ Taktung, aber schneller gehts nicht, warum auch immer. Ist halt Basic....
Jetzt erkenne ich auch das 3kHz Signal was vorher bei 18Hz Abfrage nicht klappte
](*,) ](*,)

Übel oder

Grüße und danke für die Hilfe

pongi
05.02.2008, 21:09
Ich benutze zwar nicht Basic, sondern C, aber das kommt mir schon komisch vor. Nach Deiner Beschreibung könnte kein Code funktionieren, die in Bascom geschrieben worden ist, und zeitkritisch ist...
Gibts da im Compiler nicht irgendwelche Optimierungsstufen, die man einschalten muss?

Besserwessi
06.02.2008, 14:03
Die Abfrage des AD Wandlers und das Ansprechen des LCD sind immer recht langsam (auch in C oder Assembler). Bei den LCDs wird bei jedem Übertragenem Byte auf die Bestätigung des LCD-Moduls gewartet und dass kann halt dauern. Beim AD Wandler gibt es nur relativ wenige Befehle, die entsprechend alle eventuelaitäten vorsehen müssen und entsprechend auch mal 2 Wandlungen abwarten müssen. Außerdem gint es beim AD Wandler noch einiges zu konfigurieren.

Einen Ausgabefrequenz von 1 MHz für eine Software Toogle-Schleife ist doch sogar gut, die Schleife ist also nur 6 Zyklen lang. In Assembler kommt man auch nur auf 2 Zyklen (3 MHz) und das auch nur ausnutzen der Spezillen toogle funktion der Ports. Ich glaube kaum dass GCC da besser sein wird, aber muss man mal testen.

pongi
06.02.2008, 14:17
Naja, etwas stimmt trotzdem nicht, die 18Hz sind extremst wenig...

Ich hab ein Durchflussmesssystem in der Firma entworfen, basierend auf einer Atmega8 mit 1Mhz internem Takt. Der rechnet die Uhrzeit für sich selber, misst eine Impulslänge vom Sensor, gibt alle Daten am LCD aus, und entscheidet über Alarmzustände. Das ganze ist in GCC, und ich hab keine Probleme.

Die Impulslängenabfrage und die Uhrzeitberechnung sind mit Interrupts implementiert, und in dem Fall ist es wurst, was man grad mit dem LCD macht. Den AD-Wandler kann man auch per Interrupt machen, dann muss man nicht immer alles abwarten.

Besserwessi
06.02.2008, 14:22
Habe eine einfache Toogle Schleife mal mit GCC getestet:
da komme ich auf eine Schleifenlänge von 11 bzw. 12 zyklen (mit -Os). Also fast dopplet so lange wie oben fpr BASCOm angegeben !. Dieses Beispiel hängt aber auch sehr davon ab wie man die hardware anschricht und ich bin kein Experte im Umgang mit GCC, da kann man vielleicht auch noch was optimieren.