mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage ADC Atmega16


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus AVR-Gemeinde,

hab da mal ne Frage um ADC des Atmega 16.
Habe vor längerer Zeit mal ein Steuergerät für ne Standheizung mit 
Überwachung der Bordspannung programmiert.
Jetzt hab ich mir den Code wiedermal angeschaut und dabei festgestellt, 
das ich den ADC-Wert seltsam berechne.
Erstmal den Code:

Hier wird der ADC gestartet usw. und ausgelesen.
Der Code entspricht ja ungefähr dem, aus dem Tutorial.
uint16_t adc_Read_Channel(char mux)
{
  uint8_t i;
  uint16_t result = 0;

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);

  ADMUX = mux;

  ADMUX |=  (1<<REFS0);

  ADCSRA |= (1<<ADSC);

  while ( ADCSRA & (1<<ADSC) );

  for(i=4;i<4;i++);
  {
    ADCSRA |= (1<<ADSC);
    while ( ADCSRA & (1<<ADSC) );

    result += ADCW;
  }

  ADCSRA &= ~(1<<ADEN);

  result /= 4;

  return result;
}

Hiermit berechne ich dann den Spannungswert aus dem ADC-Wert:
uint16_t adc_Get_Voltage(void)
{
  uint16_t adc;
  uint16_t voltage_1;
  uint16_t bat_voltage;
  uint16_t reference_voltage;
  uint16_t a;
  uint8_t R1;
  uint8_t R2;

  #define Vref_halbe  250;              //berechnung mit halber Vref, da sonst werteüberlauf in Variable

  R1 = 51;
  R2 = 11;

  reference_voltage = Vref_halbe;

  adc = adc_Read_Channel(0);

  a = ( (reference_voltage * adc) / 256);
  
  voltage_1 = a * 2;                  //adc-wert umrechnen

  bat_voltage = ( voltage_1*(R1+R2) / R2);      //spannungsteiler berechnen

  return bat_voltage;

}

Nun ist mir aufgefallen, dass ich eigentlich durch 1024 und nicht durch 
256 teile müsste. Das würde ja aber meine gemessene Spannung vierteln, 
und die stimmt ja aber!
Hab auch mal bissl rumgerechnet und dabei festgestellt, dass im 
ADC-Register auch nur ein Viertel von dem steht, was eigentlich drin 
stehen müsste!
Ich weiß aber auch nicht mehr, wie ich damals auf die 256 gekommen bin!

Hat jemand vielleicht ne Idee, was ich da getrieben hab? Oder besser 
gesagt, warum in meinem ADC-Register genau ein Viertel von dem steht, 
was drin stehen müsste?
Ich komm einfach nicht drauf!

Viele Grüße
Micha

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gefunden:
 for(i=4;i<4;i++);
  {
    ADCSRA |= (1<<ADSC);
    while ( ADCSRA & (1<<ADSC) );

    result += ADCW;
  }

  ADCSRA &= ~(1<<ADEN);

  result /= 4;


die for schleife läuft nur einmal...

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich falle auf die Knie!!!!
Na so blöde muss man erstmal sein!
Wer richtig abschreiben kann ist klar im Vorteil!

DANKE DANKE DANKE

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, die for-Schleife dürfte eigentlich gar nicht durchlaufen werden. 
Schließlich ist die Bedingung "i < 4" schon bei der Initialisierung 
nicht erfüllt (i = 4)!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.