AVR: ADC einfach auslesen

 

// ADC STUFF
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (0<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1)| (1<<ADPS2) | (0<<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=4; i>=1; i– )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung “single conversion”
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;      // Wandlungsergebnisse aufaddieren
 //if (ADCW <= 350){lo++;lo1+=ADCW;}else{hi++;hi1+=ADCW;}

  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
 

// if (lo>=hi){lo1/=lo; result=hi1;} else {hi1/=hi;result=hi1;}

  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
 
 
// mux==5?uart_puts(“5: “):uart_puts(“7: “);
 // Ausgabe an UART
   // if (debug==1)
  
 
  /* uart_puts(itoa((1024-result),h,10));

 
   uart_puts(“\n\r”);
 
*/

 

 
    
  return result;
}
 


Comments are closed.