Hallo, ich bin gerade über meiner Studienarbeit und soll aus einem PIR Sensor Signal eine Bewegung erkennen. Mein Problem ist, dass ich schon mal ein halbwegs vernünftiges Signal hatte. Jedoch war das Programm vom Unterricht und ich komme jetzt nicht mehr an die ADC Einstellungen. Kurz: Ich weiß dass es geht, weiß aber nicht wie :-( Verwendet wird: ATMega8A-PU LHI 878RF mit Minimalbeschaltung laut Datenblatt SiSy C++ zur Programmierung Was soll rauskommen: Der Sensor liefert am Ausgang ca 0,82V bis 0,89V (Multimeter). Als Ausgangssignal kommt eine sehr kleine Spannungsspitze. Multimeter ist zur Erfassung zu langsam, Oszi zu schnell. Zuvor hatte ich ein Signal von ca 2 bis ca 72 von 256(1Byte) bei starker Bewegung. Also ein Ausschlag von ca +-35. Signallänge ca 100-200ms. Der Wert im Ruhezustand war ca 45-50. Nun ist es 100 bei 2,56V. Vermutung liegt nahe, dass es Vref(5V) war. Das kommt raus: Ein Signal welches nur um ca +-1 ausschlägt. Damit kann ich nichts erfassen. Je nach Vref ca 50 oder ca 100 als Mittelwert. Bisherige Versuche: ADC läuft auf 10Bit(Maximum) im FreeRunning Modus. Abfrage per UART von 100ms auf 10ms (falls sich das Signal "versteckt") hat nichts gebracht. ADMUX: REFS habe ich die Referenzspannung auf 2,56V eingestellt, damit kam ich auf +-2. Die anderen Einstellungen brachten keinen Vorteil. 1,1V hat er laut Datenblatt nicht. ADPS Einstellungen brachten eher eine Verschlechterung (115kHz, 230kHz, 57,5kHz). Eine Verstärkung wäre naheliegend. Ist jedoch laut Datenblatt nicht enthalten. Mehr konnte ich aus dem Datenblatt und Suche zur ADC Signalverbesserung nicht entnehmen. Frage am Rande: https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC Was bedeutet bei der Kanalwahl(MUX) die 1,23V Vbg? Ist das mit den 0V zum Kalibrieren des ADC? Sensor funktioniert, auf ein Feuerzeug reagiert er mit einem schön großen Ausschlag. Das ist aber nicht Sinn der Sache, den Bewegungsmelder mit einem Feuerzeug zu schalten ;-) Am Aufbau wurde nichts verändert, nur am Programm. Irgendwo muss da noch was sein, womit man den Ausschlag des Signals verstärkken kann. Danke für die Hilfe.
Heinz M. schrieb: > Was bedeutet bei der Kanalwahl(MUX) die 1,23V Vbg? Ist das mit den 0V > zum Kalibrieren des ADC? Du schaltest damit nur alle Kanäle quasi weg und hängst vor dem ADC, an dessen Eingang, eine Spannung von 1,23 Bandgap. Im net mal Bandgap eingeben was das ist. (Bandabstandsreferenz) ;-) Programm und Schaltplan fehlt.
Schaltung: VCC des PIR mit 10Ohm gegen 5V vom Controller GND mit GND Signalleitung mit 47kOhm und 22µF gegen GND Gemessen wir direkt an der Signalleitung gegen Masse. Also über die 47kOhm und 22µF. Es ist für die ganze Studienarbeit wichtig die Minimalbeschaltung beizubehalten. Wie gesagt hatte ich mit der Beschaltung bereits ein Signal. Programm: Es wurden die Bibliotheken von SiSy verwendet und die grafische Oberfläche. Hier mal als Pseudocode:
1 | //onStart |
2 | ADMUX = (1<<REFS0) |
3 | ADMUX = (1<<REFS0) |
4 | |
5 | //ADMUX = (1<<ADPS0) //Auskommentiert weil liefert nur noch Vollausschlag(256) |
6 | //ADMUX = (0<<ADPS1) |
7 | //ADMUX = (1<<ADPS2) |
8 | |
9 | //onWork |
10 | uint8_t wert; //vordersten zwei Bits des ADC sind unwichtig, da die Spannung zu klein ist |
11 | wert=sensor2.getValue(); //Sensor2 ist ein fertiges Unterprogramm, was den adc abfragt -> kein Code von mir |
12 | ControlCenter.writeByte(wert); //ControlCenter ist die UART Schnittstelle |
Mal sehen, ob ich in dem ADC Unterprogramm noch was finde. Danke für die Erklärung von Vbg.
Heinz M. C müsstest Du noch lernen und das Datenblatt des AVR µC ist deine Bibel ! Das ist unsinnig:
1 | ADMUX = (1<<REFS0) |
2 | ADMUX = (1<<REFS0) |
Es wird immer alle gelöscht.
Das Zweite muss natürlich REFS1 heißen. Im Programm steht es richtig.
Hi
>Das Zweite muss natürlich REFS1 heißen. Im Programm steht es richtig.
Das ist auch nicht das, was du erreichen willst.
MfG Spess
Kannst du bitte etwas mehr schreiben. Die Aussage ist sehr mehrdeutig. -Ist der Befehl falsch? -Bringt er nichts in Hinblick auf das adc Signal? -...
Mit der zweiten Zeile löscht du wieder alle anderen Bits bis auf das REVS1. Du musst das zweite und jedes andere Bit das du zusätzlich setzen willst mit dem Register verodern. Gruß JackFrost
:
Bearbeitet durch User
Heinz M. schrieb: > Das kommt raus: > Ein Signal welches nur um ca +-1 ausschlägt. Damit kann ich nichts > erfassen. Je nach Vref ca 50 oder ca 100 als Mittelwert. So ein PIR hat einen verdammt kleinen Hub. Du brauchst einen Differenzverstärker, der aus der klitzekleinen Spannungsspitze ein Signal von mehreren hundert mV bei wenig Bewegung vor der aktiven Fläche erzeugt. Also Verstärkungs-Faktor 500-1000 wäre schon nicht schlecht. Für den Sensor selbst ist noch eine Fresnellinse zu empfehlen, die die IR-Strahlung aus dem geplanten Erfassungsbereich auf den Sensor im Brennpunkt bündelt.
Wie gesagt hatte ich bereits den Spannungshub gemessen. Wirklich klein, aber würde für den Zweck vollkommen ausreichen. Das soll möglichst günstig und einfach sein. Daher wäre eine direkte Erfassung schöner.
Ich bin jetzt auf die Referenzspannung gegangen. Ich kann per Programm schon mal erfassen, dass sich meine Hand 3cm über dem Sensor befindet. Für Lehrzwecke im Notfall ausreichend. Schön ist es noch nicht. Hat vielleicht noch jemand eine Idee, was da Programm/adc mäßig anders gewesen sein könnte? @Knut: Fresnellinse habe ich. Dürfte aber nicht die Beste sein.
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.