1 | //Quelle für die folgende Methode: www.rn-wissen.de/index.php/ADC_(Avr)
|
2 |
|
3 | long readADC(uint8_t channel){
|
4 | uint8_t i;
|
5 | uint16_t result=0;
|
6 | //Den ADC aktivieren und den Teilungsfaktor auf 8 stellen
|
7 | ADCSRA =(1<<ADEN)| (1<<ADPS0)|(1<<ADPS1);
|
8 |
|
9 | //Kanal des Multiplexers wählen
|
10 | //Interne Referenzspannung verwenden (also 2,56V)
|
11 | ADMUX = channel|(1<<REFS1)|(1<<REFS0);
|
12 |
|
13 | //Den ADC initialisieren und einen sog. Dummyreadout machen
|
14 | ADCSRA |= (1<<ADSC);
|
15 | while(ADCSRA &(1<<ADSC));
|
16 |
|
17 | //Jetzt 3x die Spannung an Kanal channel auslesen und dann einen Durchschnittswert berechnen
|
18 | for (i=0; i<3; i++){
|
19 | //Eine Wandlung
|
20 | ADCSRA |= (1<< ADSC);
|
21 | //Auf Ergebnis waren...
|
22 | while (ADCSRA & (1<<ADSC));
|
23 |
|
24 | result += ADCW;
|
25 | }
|
26 | //ADC wiederdeaktivieren
|
27 | ADCSRA &= ~(1<<ADEN);
|
28 | result /= 3;
|
29 | return result;
|
30 | }
|
31 |
|
32 |
|
33 | /*Funktion zur Anzeigeeiner 32Bit Zahl im Stringformat auf einem LCD
|
34 | Quele: mikrocontroller.net/articles/Festkommaarithmetik
|
35 | Parameter:
|
36 |
|
37 | char* string : Zeiger aud den String, welcher mit my_itoa erzeugt wurde
|
38 | uint8_t start : Offset im String, ab der die Zahl ausgegeben werden soll,
|
39 | das ist notwendig, wenn Zahlen mit begrenztem Zahlenbereich
|
40 | ausgegeben werden sollen.
|
41 | Vorzeichenslose Zahlen: 0..10
|
42 | Vorzeichenbehaftete Zahlen: 1..11
|
43 | uint8_t komma : Offset im String, zeigt aud die Stelle an welcher das virtuelle
|
44 | Komma steht (erste Nachkommastelle)
|
45 | Komma muss immer größer oder gleich start sein
|
46 | uint8_t frac : Anzahl der Nachkommastellen
|
47 |
|
48 | */
|
49 | void schreibe_Zahl(char* string, uint8_t start, uint8_t komma, uint8_t frac){
|
50 | uint8_t i; //Zähler
|
51 | uint8_t flag =0; //Merker für führende Nullen
|
52 |
|
53 | //Vorzeichen ausgeben
|
54 | if (string[0]=='-')
|
55 | lcd_data('-');
|
56 | else
|
57 | lcd_data(' ');
|
58 |
|
59 | //Vorkommastellen ohne führende Nullen ausgeben
|
60 | for(i=start; i<komma; i++){
|
61 | if (flag==1||string[i]!='0'){
|
62 | lcd_data(string[i]);
|
63 | flag =1;
|
64 | }
|
65 | else lcd_data(' ');
|
66 | }
|
67 | lcd_data('.');
|
68 | //Nachkommastellen ausgeben
|
69 | for(; i<(komma+frac);i++) lcd_data(string[i]);
|
70 | }
|
71 |
|
72 |
|
73 | ...................................................................
|
74 |
|
75 |
|
76 | //Schleife, aus der das Ganze aufgerufen wird:
|
77 |
|
78 | while(1)
|
79 | {
|
80 | long result = readADC(0);
|
81 | long spannung = result*(long)5000; //Ermitteln des digitalen Wertes der gemessenen Größe Referenzspannung: 5V
|
82 | spannung = spannung/1024; //Umrechnen, wegen 10Bit auflösung
|
83 | //Die nun errechnete Spannung soll auf 1000el genau (also 3 Nachkommastellen) ausgeben werden.
|
84 | uint8_t i;
|
85 | char string[11]; //String Terminator
|
86 | string[11] ='\0';
|
87 | if(spannung<0){ //ist die Zahl negativ?
|
88 | string[0] ='-';
|
89 | spannung = -spannung;
|
90 | }
|
91 |
|
92 | else string[0] = ' '; //Die Zahl ist positiv
|
93 | for(i=10; i>=1; i--){
|
94 | string[i] = (spannung%10) +'0'; //Modulo rechnen, dan den ASCII Code von '0'addieren
|
95 | spannung/=10;
|
96 | }
|
97 | utoa(spannung, string, 10);
|
98 | schreibe_Zahl(string, 2, 5, 3);
|
99 | _delay_ms(3000);
|
100 | }
|