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 | }
|