Forum: Mikrocontroller und Digitale Elektronik ADconversion


von Jochen K. (Gast)


Lesenswert?

Hallo liebe User!
ich hab folgendes Problem (bin neuling!!!!)
hab eine ADconversion die auch soweit funtioniert!
nun die Frage: Wie ist es mir möglich mit der selben Routine weitere 
Abfragen zu machen! Hab ein ATmega88 und nutze bis jetz den Pin ADC4.
Hab als Rückgabewert in der main   "ADvalue = ADconversion(4);"

muss ich das ganze nur kopieren und die ADMUX zuordnung ändern und dann 
umbenennen? kann mir grad nicht vorstellen wie das funtionieren soll

Das Programm selber sieht wie folgt aus:
1
#include "ADconversion.h"
2
3
4
uint16_t ADconversion(uint8_t pin)
5
{
6
7
  uint8_t  i;      // 8 Bit Integer zur Wahl des Eingangs
8
  uint16_t result;  // 16 Bit Integer --> Ergebnis der Wandlung
9
10
11
  // Control and Status Register 
12
13
  // ADEN --> AD Wandler aktivieren
14
  // ADPS0 bis ADPS1 geben den Vorteiler an, der den Takt der CPU verringert
15
  // Ich setzte alle drei Bits auf high --> vorteiler ist 128, damit der AD Takt 156kHz
16
  // Der Soll liegt bei 50 kHz bis 200 kHz
17
  // Der AD-Wandler soll im Modus "Single Conversion" betrieben werden
18
19
20
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);   
21
22
  
23
  // Eingangspin aus PortC waehlen
24
  // pin ist der Index von PC0 (ADC0) bis PC7 (ADC7)
25
26
  ADMUX |= (1<<MUX2);      //MUX0..2 =100->ADC4
27
      //(1<<MUX0) | (1<<MUX1) | 
28
  // externe Referenzspannung nutzen (an Pin 'Aref'  - max Vcc) 
29
  //interne 1,1V is deaktiviert
30
  ADMUX |= (0<<REFS1) | (0<<REFS0);  
31
32
  /* Bevor man den Wandler nutzen kann, empfiehlt es sich, einen Lesevorgang
33
  durchzuführen, um den Wandler 'warm zu machen'. Es wird also eine Wandlung
34
  gestartet, indem ADSC (...StartConversion) aktiviert wird und gewartet wird
35
  bis das Bit wieder low wird (dann ist die Wandlung beendet)
36
  */
37
38
  ADCSRA |= (1<<ADSC);                // Start einer Single Conversion
39
  while ( ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten 
40
  {                
41
  }
42
  
43
  
44
  /* ADCW muss einmal gelesen werden, damit es wieder frei ist für den nächsten Wert.
45
  Wird ADCW nicht ausgelesen, bleibt der Wert gespeichert und neue Messwerte werden verworfen
46
  */
47
48
  result = ADCW;  
49
  result = 0;
50
51
  // Der Wert der Warmlaufmessung wird verworfen und die richtige Messung beginnt 
52
  // Mittelwert aus 4 aufeinanderfolgenden Wandlungen
53
54
  for( i=0; i<25; i++ )
55
  {
56
    
57
    ADCSRA |= (1<<ADSC);            
58
    while ( ADCSRA & (1<<ADSC) ) 
59
    {
60
      // auf Abschluss der Konvertierung warten
61
    }
62
    // Wandlungsergebnisse aufaddieren
63
    result += ADCW;        
64
  }
65
  
66
  // Die Messung ist hier beendet und somit sollte auch der AD-Wandler deaktiviert werden
67
  // Das Bit (ADEnAbled wird auf low gesetzt)
68
69
  ADCSRA &= ~(1<<ADEN);             
70
  
71
  // Summe durch vier teilen = arithm. Mittelwert
72
73
  result /= 25;
74
75
  return result;
76
77
}

Schon mal im vorraus ein dank an die Antworten
lg Jochen

von Düsendieb (Gast)


Lesenswert?

Nee so geht es nicht.

Das ist ein komplettes main programm mit initialisierung des 
Analogeingangs.

Schau mal hier, da gibt es in Beispiel: 
http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte

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.