Gast
#1562794
Hi,
ich nutze die unten aufgeführte Funktion für eine A/D Wandlung. Nun rufe
ich diese für 2 Kanäle mit 2 mux werten auf (Kanal0,Kanal1). Wenn ich
sie jedoch einmal mit Kanal1 aufgerufen habe, dann bekomme ich nur noch
Werte von Kanal 1, auch wenn ich 0 übergebe, wören kann dies liegen?
Dank Euch,
m.
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
/*
ADMUX
.-----.-----.---....
|REFS1|REFS0|
'-----'-----'---...
| |
| |
| |
.--. |\| |
AVCC | |---------------|0 \ |
'--' | | _|_
| |-------.
.---------------. | | |
| Internal 1.1V |--|1 / |
| Reference | |/ |
'---------------' |
|
.--. | .-------....
AREF | |---------------------------o-----| A/D Conf
'--' '-------....
.---.-------.-------.-----------------------------------------------.
|Nb.| REFS1 | REFS0 | Voltage Reference Selecttion (23.8.1 / P.256) |
.---+-------+-------+-----------------------------------------------.
| 0 | 0 | 0 | AREF, Internal VRef turned off |
.---+-------+-------+-----------------------------------------------.
| 1 | 0 | 1 | AVcc with external cap. at AREF |
.---+-------+-------+-----------------------------------------------.
| 2 | 1 | 0 | Reserverd |
.---+-------+-------+-----------------------------------------------.
| 3 | 1 | 1 | Int. VRef 1.1V with ext. cap. at AREF |
'---'-------'-------'-----------------------------------------------'
*/
AD_REF_NB0; //Referenzquelle nach o.g. Tab.
wählen
AD_MUX_CHANNEL(mux); //Kanal waehlen
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren
(1)
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm.
Mittelwert
/*
if(result>=(last+2))
{
last=result;
}
if(result<=(last-2))
{
last=result;
}
*/
return result;
}