mki
11.10.2007, 12:31
Hi,
ich habe nen problem mit dem adc, auslesen funktioniert aber die ergebnisse sind merkwürdig ==> 20, 21 wenn ich meine hand dierekt vor den sensor halte, bei ca. 30 cm ist es dann immer hin noch eine 19 die ich zurück bekomme.
#define F_CPU 14745600UL
void main(void) {
char buffer[16];
// int adc = (50 * ReadChannel(0)) / 1023;
adc = ReadChannel(0);
uart_puts_P("ch0:");
itoa(adc,buffer,10);
uart_puts(buffer);
uart_puts_P("\r\n");
}
uint16_t ReadChannel(uint8_t mux) {
uint8_t i;
uint16_t result = 0; //Initialisieren wichtig, da lokale Variablen
uint8_t temp;
//ADCSRA |= (1<<ADEN);
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); // requenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
// ADMUX = 0;
ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
// ADMUX |= (1<<REFS0);
/* 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) ) {
//konvertierung abwarten
}
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
result += ADCL; // Wandlungsergebnisse aufaddieren
temp = ADCH;
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
return result;
}
ich habe nen problem mit dem adc, auslesen funktioniert aber die ergebnisse sind merkwürdig ==> 20, 21 wenn ich meine hand dierekt vor den sensor halte, bei ca. 30 cm ist es dann immer hin noch eine 19 die ich zurück bekomme.
#define F_CPU 14745600UL
void main(void) {
char buffer[16];
// int adc = (50 * ReadChannel(0)) / 1023;
adc = ReadChannel(0);
uart_puts_P("ch0:");
itoa(adc,buffer,10);
uart_puts(buffer);
uart_puts_P("\r\n");
}
uint16_t ReadChannel(uint8_t mux) {
uint8_t i;
uint16_t result = 0; //Initialisieren wichtig, da lokale Variablen
uint8_t temp;
//ADCSRA |= (1<<ADEN);
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); // requenzvorteiler
// setzen auf 8 (1) und ADC aktivieren (1)
// ADMUX = 0;
ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
// ADMUX |= (1<<REFS0);
/* 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) ) {
//konvertierung abwarten
}
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
result += ADCL; // Wandlungsergebnisse aufaddieren
temp = ADCH;
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm. Mittelwert
return result;
}