Forum: Mikrocontroller und Digitale Elektronik Entfernungsmesser mit TSOP31240 oder Zufallszahlengenerator


von Jan S. (jannemann)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe folgendes Problem.
Ich möchte mit einem IR-Reciver Modul und einer IR-Diode einen 
Abstand/Entfernung messen.
Dazu Pulse ich eine IR LED und werte das reflektierte Signal aus.
Der Schaltplan ist im Anhang.
Datenblätter gibts z.B. hier:

IR-Modul TSOP31240
http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME=A500%252FTSOP312SERIES_DATASHEET.pdf

IR-LED 274-3
http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME=X100%252Fld_274-3.pdf

µC: ATMEGA8
http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

Mein Problem ist, dass mir meine LED Zeile nur Müll ausspuckt. Leider 
habe ich zu hause keine Möglichkeit zum Oszilographieren oder Debuggen.

Auf der LED-Leiste bekomme ich Werte zw ca 0 und 128, und die springen 
wie wild hin und her.

Hat jemand eine Ahnung warum ich hier keinen halbwegs konstanten wert 
bekommen? Die Schaltung ist aufm Steckbrett aufgebaut.
Das Problem tritt auch auf, wenn ich die LED direkt vor den TSOP halte 
oder den TSOP abdecke. Wenn ich den ADU eingang an ein Poti zwischen VCC 
und GND hänge habe ich eine stabile Ausgabe.

Ich hoffe ihr habe Ideen wie ich meinen Zufallszahlengenerator hier 
wieder seinem eigentlichen Zweck zuführen kann.

Hier ist der Quellcode für den µC:
1
 /*IR_Diode.c
2
 *
3
 * Function: Program erzeugt einen 40kHz Rechteck Takt an OC2 (PB3), liest AD-Werte an ADC0 (PC0) ein und gibt diese aus. 
4
 *
5
 * Created: 17.08.2011 21:33:07
6
 * letzte Änderung: 02.11.2011, 18.11.2011 (Einfügen der Variable temp)
7
 * Author: Jan
8
 */ 
9
10
#define F_CPU 1000000L
11
12
#include <avr/io.h>
13
#include <avr/interrupt.h>
14
#include <util/delay.h>
15
16
17
void init_timer2();
18
void adu_init();
19
20
int main(void)
21
{
22
  init_timer2();
23
  adu_init();
24
  
25
  PORTB |= 1;  //alles läuft
26
  
27
    while(1)
28
    {
29
    TCCR2 |= 1<<CS00;    //IR Takt starten
30
    _delay_ms(1);      //ca. 40 Takte warten
31
    ADCSRA |= 1<<ADSC;    //Start Conversion
32
    }
33
}
34
35
void init_timer2()
36
{
37
  DDRB = 0xff; //Port B auf Ausgang schalten (Toggle PORTB3)
38
  
39
  //Mode CTC
40
  TCCR2 |= (1<<WGM21)| (0<<WGM20);
41
  //Toggle OC2
42
  TCCR2 |= (1<<COM20) | (0<<COM21);
43
  //Comparewert 12Takte, f=1MHz
44
  //13=35kHz; 12=38,8kHz
45
  OCR2 = 12;  
46
  //Timer Starten
47
  TCCR2 |= 1<<CS00;  //Kein Prescaler, Timer Starten
48
}
49
50
//Ausgabe auf PortD
51
void adu_init()
52
{
53
  //Adu initialisieren  
54
  DDRD = 0xFF;          //PortD ist Ausgang
55
  PORTD =0x00;
56
  
57
  ADMUX =0;            //MUX3..0=0 ADC0 ist Eingang
58
  ADMUX |= 1<<REFS0 | 0<<REFS1;  //Vacc ist auch Ref-Spannung
59
  ADMUX |= 1<<ADLAR;        //ADC9-ADC2 stehen in ADCH, ADC1-ADC0 stehen in ADCL
60
  
61
  ADCSRA = 0;            //ADPS2..0 = 0 Kein Prescaler
62
  //ADCSRA |= 0<<ADFR;      //single Conversion Modus
63
  ADCSRA |= 1<<ADIE;        //Interrupt Freischalten (Conversion complete)
64
  ADCSRA |= 1<<ADEN;        //ADC Enable (einschalten)
65
  sei();
66
67
}
68
69
70
ISR(ADC_vect)
71
{
72
  unsigned char temp;  
73
  TCCR2 &= ~(1<<CS00);    //Timer2 stoppen
74
  temp= ADCH;
75
  PORTD=0xFF-temp;      //TSSOP ist lowaktiv -> naher Gegenstand = 0V (gewünscht ist naher Gegenstand = 255
76
  _delay_ms(100);        //Warten bis sich der Sensor wieder "beruhigt" hat
77
}

Edit: Ich weiß dass bei meiner LED Leiste Widerstände fehlen, auf meinem 
Steckbrett sind sie, habe vergessen sie auch im Schaltplan zu zeichnen

von Karl H. (kbuchegg)


Lesenswert?

Irgendwie steh ich auf dem Schlauch.
Was willst du denn mit einem TSOP am ADC Eingang?
Der TSOP hat einen Digitalausgang. Der sagt dir, ob auf seinen Sensor 
(gepulstes) Licht fällt oder nicht.

von Jan S. (jannemann)


Lesenswert?

Ich habe im Internet irgendwo mal einen Beitrag gefunden, in dem ein 
TSOP zur Entfernungsmessung verwendet wurde.
Leider finde ich ihn nicht mehr. Ich bin davon ausgegangen, dass der 
TSOP eine variable Ausgangsspannung hat. Mir ist bewusst, dass man damit 
keine richtige Entfernung messen kann, das das reflektierte Licht 
anhängig vom Matrial ist.
Trotzdem habe ich es mal gesen und wollte es mal versuchen nachzubauen.

Für den Fall das der Baustein nur einen Digitalausgang hat, müsste ich 
doch dann an der LED Zeile zumindest soetwas wie  0xFF oder 0x00 haben.

Mit der Betrachtung, dass du Recht hast, liest sich Fig 3. im Datenblatt 
auch ganz anders. Vo[H] Vo[L]

Gruß Jan

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
Noch kein Account? Hier anmelden.