Forum: Mikrocontroller und Digitale Elektronik Frage zu AVR-GGC Tutorial - messen eines Widerstands


von Messi (Gast)


Lesenswert?

Hallo,

im AVR-GCC Tutorial wird eine Möglichkeit beschrieben, wie mit nur einem 
Pin ein Widerstand bzw. eine Spannung gemessen wird.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Messen_eines_Widerstandes

Ich würde das gern mit einem ATtiny 2313 machen.

Wie funktioniert das genau aus Code-Sicht?
Gibt es einen Beispielcode dazu?

Danke und Gruß

von Tut (Gast)


Lesenswert?

/* ADC initialisieren */
void ADC_Init(void) {

  uint16_t result;

//  ADMUX = (0<<REFS1) | (1<<REFS0);      // AVcc als Referenz benutzen
  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung 
nutzen
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

  /* 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
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;
}

/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung 
warten
  return ADCW;                    // ADC auslesen und zurückgeben
}

/* ADC Mehrfachmessung mit Mittelwertbbildung */
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t average )
{
  uint32_t result = 0;

  for (uint8_t i = 0; i < average; ++i )
    result += ADC_Read( channel );

  return (uint16_t)( result / average );
}

...

/* Beispielaufrufe: */

int main()
{
  uint16_t adcval;
  ADC_Init();

  while( 1 ) {
    adcval = ADC_Read(0);  // Kanal 0
    // mach was mit adcval

    adcval = ADC_Read_Avg(2, 4);  // Kanal 2, Mittelwert aus 4 Messungen
    // mach was mit adcval
  }
}

von Messi (Gast)


Lesenswert?

OK, so macht man es, wenn man einen ADC hat...

Wie macht man es, wenn man wie im Beispiel des AVR-GCC-Tutorials keinen 
ADC hat (z.B. ATtiny2313), sondern mithilfe eines RC-Glieds eine Zeit 
mißt und daruas auf eine Spannung schließt. (Ich meine jetzt nicht die 
Methode mit 3 Pins aus appnote AVR400).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.