Forum: Mikrocontroller und Digitale Elektronik IR-Proximity mit ATmega8 und ADC


von Joe (Gast)


Lesenswert?

Hallo,
ich möchte mit meinem ATmega8 einen IR-Poroximity-Sensor konstruieren.

Dazu möchte ich den Timer1 zum einen dazu verwenden, um über den 
OC1A-Pin eine IR-LED mit PWM anzusteuern, den ADC0-Pin zum Auslesen des 
Photostroms einer Photodiode verwenden und eine PWM je nach ADC-Wert 
über den OC1B-Pin auf eine LED geben.

Geht das prinzipiell bei Verwendung nur eines Timers?

Mein Code:
1
/*
2
 * IR_Proximity.c
3
 *
4
 * Created: 09.03.2015 21:14:05
5
 *  Author: Joe
6
 */ 
7
8
#include <avr/io.h>
9
#include <avr/interrupt.h>
10
11
int main(void)
12
{
13
  
14
  // Pin PB2, PB1 und PB0 als Ausgang
15
  DDRB |= (1<<PB2) | (1<<PB1) | (1<<PB0);       
16
17
  //---Timer1 konfigurieren---//
18
  //--------------------------//
19
  //lösche OC1A beim Compare-Match und setze OC1A nach dem Timer-Reset -> COM1A1 = 1, COM1A0 = 0
20
  
21
  //Fast PWM 8 Bit Modus -> WGM10 = 1, WGM11 = 0, WGM12 = 1, WGM13 = 0
22
  
23
  //Timer1 Clock Source
24
  // 1/8 des Controller-Clocktakts -> CS10 = 0, CS11 = 1, CS12 = 0
25
  
26
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);  
27
  
28
  TCCR1B = (0<<CS10) | (1<<CS11) | (0<<CS12) | (1<<WGM12);
29
  
30
  //Duty-Cycle einstellen -> Duty-Cycle = 50% (n-1/256)
31
  OCR1A = 127;  
32
  
33
  //ADC konfigurieren --- ADC0 ist der Messeingang für die Fotodiode SFH 203 FA
34
  //zunächst werden Referenzspannung, die interne, und der ADC-Input-Pin festgelegt  
35
  ADMUX = (1<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1);
36
  
37
  //nun wird festgelegt in welchem Modus der ADC läuft und mit welchem Takt
38
  ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE);
39
  
40
  //Globale Interrupts aktivieren
41
  sei();
42
  
43
  //Konvertierung starten
44
  ADC |= (1<<ADSC);
45
  
46
  for(;;);                          
47
  {
48
    
49
  }
50
  return 0;                         
51
}
52
53
//Interrupt-Service-Routine
54
ISR(ADC_vect)
55
{
56
  
57
  
58
  //OCR1B = ADC;
59
  
60
  
61
  
62
  if(ADC > 1000)
63
  {
64
    PORTB |= (1<<PB0);
65
  }
66
  else
67
  {
68
    PORTB &= ~(1<<PB0);
69
  }
70
}

Ich habe versucht mit der auskommentierten Zeile in der ISR die PWM für 
den OC1B-Pin zu setzen, leider ohne Erfolg.

Meine Status-LED flackert ohne Objektkopplung und wird nicht heller bei 
Objektannäherung.

Ist der Denkfehler bei Verwendung eines Timers oder woanders ein Fehler 
im Code?


Vielen Dank für jede Hilfe!

Gruß
Joe

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.