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