Frage ADC Atmega16

Gast #1052549
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.
1
uint16_t adc_Read_Channel(char mux)
2
{
3
  uint8_t i;
4
  uint16_t result = 0;
5

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

8
  ADMUX = mux;
9

10
  ADMUX |=  (1<<REFS0);
11

12
  ADCSRA |= (1<<ADSC);
13

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

16
  for(i=4;i<4;i++);
17
  {
18
    ADCSRA |= (1<<ADSC);
19
    while ( ADCSRA & (1<<ADSC) );
20

21
    result += ADCW;
22
  }
23

24
  ADCSRA &= ~(1<<ADEN);
25

26
  result /= 4;
27

28
  return result;
29
}

Hiermit berechne ich dann den Spannungswert aus dem ADC-Wert:
1
uint16_t adc_Get_Voltage(void)
2
{
3
  uint16_t adc;
4
  uint16_t voltage_1;
5
  uint16_t bat_voltage;
6
  uint16_t reference_voltage;
7
  uint16_t a;
8
  uint8_t R1;
9
  uint8_t R2;
10

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

13
  R1 = 51;
14
  R2 = 11;
15

16
  reference_voltage = Vref_halbe;
17

18
  adc = adc_Read_Channel(0);
19

20
  a = ( (reference_voltage * adc) / 256);
21
  
22
  voltage_1 = a * 2;                  //adc-wert umrechnen
23

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

26
  return bat_voltage;
27

28
}

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.