Hallo liebe Forumsmitglieder,
ich habe ein kleines Problem und mit der SuFu leider nichts gefunden.
Hier erstmal mein Programm :
1 | PORTB = 0x00;
|
2 | PORTC = 0x00;
|
3 | PORTD = 0x00;
|
4 | //DDRA = 0x00;
|
5 | DDRB = 0x0C;
|
6 | DDRC = 0x00;
|
7 | DDRD = 0x03;
|
8 |
|
9 | .
|
10 | .
|
11 | .
|
12 |
|
13 | uint16_t ReadChannel(uint8_t mux)
|
14 | {
|
15 | uint16_t result;
|
16 |
|
17 | ADCSRA = (1<<ADEN) | (1<<ADPS2) |(1<<ADPS1); // Frequenzvorteiler
|
18 |
|
19 | ADMUX = mux; // Kanal waehlen
|
20 | //ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
21 |
|
22 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
23 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
24 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
25 | while ( ADCSRA & (1<<ADSC) ) {;}
|
26 | result = ADC;
|
27 | /* Eigentliche Messung - Mittelwert aus 5 Wandlungen */
|
28 | result = 0;
|
29 | for (i=0; i<5; i++)
|
30 | {
|
31 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
32 | while ( ADCSRA & (1<<ADSC) ) {;}
|
33 | result = result + ADC;
|
34 | }
|
35 | result = result / 5;
|
36 | ADCSRA &= ~(1<<ADEN);
|
37 | return result;
|
38 | }
|
39 | .
|
40 | .
|
41 | .
|
Das ganze natürlich schön verpackt und in der main aufgerufen über
1 | .
|
2 | .
|
3 | .
|
4 | if (ReadChannel(5) == 1023)
|
5 | {
|
6 | PORTD &= ~((1<<PD0));
|
7 | }
|
8 | .
|
9 | .
|
10 | .
|
Sinn dahinter sollte sein, den Spannungsabfall über einem Widerstand zu
messen, und daraus rückwirkend den Stromfluss eines Motors bestimmen zu
können, um diesen bei Überlast ausschalten zu können (Über PortD).
So, nun ist mein Problem, dass, wie schon in aus dem Code ersichtlich,
er immer den Wert 1023 annimmt (AVcc ist 5V, Aref ist 0,07V, Vin ist
0,02V).
Ich bin wirklich am verzweifeln, von den Spannungen her dürfte er ja
netmal die hälfte des Messbereichs ausschöpfen? Kann mir bitte einer
Weiterhelfen ?
Vielen Dank im Voraus.