Forum: Mikrocontroller und Digitale Elektronik ADC gibt falsche werte aus


von David P. (david_)


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

von GPS (Gast)


Lesenswert?

Ist etwas schwierig..... void Liefere_UI_Paar()... was soll das, was ist 
das ? Welcher Compiler, welcher ADC, welcher controller.

von Stefan (Gast)


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.

von David P. (david_)


Angehängte Dateien:

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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von L. R. (badinode)


Lesenswert?

Definier mal U, I, strom und spannung in der Funktion Liefere_UI_Paar() 
und nicht global.

von David P. (david_)


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.

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.