ADC gibt falsche werte aus

OP #651463
Lesenswert?
• ▲
▼
Hallo zusammen!
Habe ein Problem.
Wenn ich void Liefere_UI_Paar() aufrufe bekomme ich werte angezeigt, 
obwohl 0Volt am ADC-Eingang liegen.
Benutze ich die andere funktion, die keinen mittelwert bildet, dann 
bekomme ich 0 angezeigt, wie es sein soll.

uint16_t strom;   //globale Definitionen
uint16_t spannung;

Wäre nett, wenn ihr mir helfen könntet.

Beste Grüße,

David
Gast #651665
Lesenswert?
• ▲
▼
Die Glaskugel sagt mir...
... das vielleicht eine lokale Hilfsvariable, die zur 
Mittelwertberechnung verwendet wird, vor dem Aufruf der 'Funktion 
Liefere_UI_Paar()' nicht zu '0' initialisiert wurde.
OP #656886
Lesenswert?
• ▲
▼
Also, damit es nochmal etwas genauer wird:

Die Schaltung soll erstmal nur dauernd zwei Spannungswerte namens 
Spannung (gemessen am ADC-Eingang PF0) und Strom (ADC-Eingang PF1) über 
die serielle Schnittstelle ausgeben.

Ich habe hier nochmal etwas mehr programmcode angehängt.
Fakt ist, dass die ADC-Eingänge unbeschaltet sind. Nicht ganz. Also der 
PF0 ist mir einem Spannungsteiler beschaltet, PF1 geht direkt in den 
ADC.
Nun fällt mir folgendes auf: Wenn ich den PF0-Pin auf Analogmasse lege, 
dann passiert nichts. WEiterhin wird wirres Zeug angezeigt, aber keine 
00000000-Folge.
Lege ich jedoch PF1 auf Masse, so zeigen beide WERTE 000000 an, wie es 
ein soll.

Woran kann das liegen?
Angehängte Dateien:
Persönliche Seite #656889
Lesenswert?
• ▲
▼
Der Sourcecode ist kaputt. Da fehlt mindestens eine schließende 
geschweifte Klammer.
1
void Liefere_UI_Paar()
2
{  
3
USART_Init(MEIN_UBRR);
4
  while(1)
5
  {  
6
  
7
  spannung=LesePortPF(0);
8
  strom=LesePortPF(1);
9
  dtostrf( spannung, 8, 0, U );
10
  dtostrf( strom, 8, 0, I ); 
11
  uart_puts (U);
12
  MakeLeerzeichen(4);
13
  uart_puts (I);
14
  MakeZeilenende(1);
15
  ADCStoppen(); 
16
}
17

18
void ADCStarten(void)
19
{
20
  ADCSRA |= 0xd7; 
21
}

Was soll das? Was soll das while(1)?

Das hier macht wohl auch was anderes als beabsichtigt:
1
uint16_t LesePortPF(uint8_t n)
2
{
3
  uint16_t Ergebnis;
4
  Ergebnis=0;
5

6
  ADMUX = n;
7

8
  ADMUX |=0xc0; 
9
  
10
  ADCStarten();
11
  
12
  while (!(ADCSRA & (1<<ADIF)) )  
13
  Ergebnis = ADC; 
14
  return Ergebnis;
15
  
16
}
(Kommentare der Übersichtlichkeit halber entfernt)


Was macht das while? Was geschieht wann mit der darauffolgenden Zeile?


Wenn Du Deinen Quelltext anständig formatieren würdest, würdest Du 
einiges vielleicht auch selber erkennen können.
OP #656896
Lesenswert?
• ▲
▼
Hi!
Ja den gesamten Code wollte ich nicht anhängen, weshal ich das 
wichtigste rauskopiert habe. Dadurch sind die Formatierungen verloren 
gegangen.

while (!(ADCSRA & (1<<ADIF)) )  wartet, bis die AD-Wandlung zuende ist. 
Das habe ich im AVR-Tutorial gelesen und das hat auch schon ganz gut 
funktioniert.

Das while(1) soll dafür sorgen, dass auf der Seriellen Schnittstelle 
dauernd die beiden Werte für U und I ausgegeben werden.

Eines möchte ich kurz erwähnen. Das Programm hat so schon funktioniert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren