Forum: Mikrocontroller und Digitale Elektronik ADC Problem Mega8


von Herrmann (Gast)


Lesenswert?

Hi



Ich will eine Spannung am ADC Nessen´.

und habe da´zu z.B eine 3,3V Batterie mit + über einen 12KOhm 
wiederstand an den ADC 7 gehängt.
die Batterie Masse an GND.


mein Code

mux=7

ales ergebniss bekomme ich 1023
auch wenn nichts dran ist(batterie ab);

ist der code falsch oder die schaltung???
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;

  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler
                               // setzen auf 8 (1) und ADC aktivieren 
(1)
 ADMUX = mux;
                      // Kanal waehlen
  ADMUX |=  (1<<REFS0) ; // VCC Referenzspannung nutzen

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

  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden 
Wandlungen */
  result = 0;
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ) {
      ;   // auf Abschluss der Konvertierung warten
    }
    result += ADCW;        // Wandlungsergebnisse aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)

  result /= 4;                     // Summe durch vier teilen = arithm. 
Mittelwert

  return result;
}

von pumpkin (Gast)


Lesenswert?

Abgesehen davon dass dein Codeschnipsel unglaubliuch anstrengend zu 
entziffern ist wäre die Portkonfiguration interessant. Port als Eingang? 
Pullups deaktiv? Wenn alternative Portfunktionen beim Mega8: Fusebits?

pumpkin

von The D. (devil_86)


Lesenswert?

Wenn du immer 1023 bekommst (also 11111...), hast wohl was falsch 
konfiguriert.

von Herrmann (Gast)


Lesenswert?

So jetzt gehts schaltung falsch


Ich habe ein Poti dazwischen gehangen und kann jetzt von 0 bis 1023 
drehen.


Ich benötige dies um eine 360 Positionierung zu gestalten.


An einer drehscheibe (die von einen Motor angetrieben wird befindet sich 
dann das Poti und soll mir die Position einer Makierung auf der Scheib 
anzeigen.


Die Makierung wird ausgerichtet auf 360 Grad=1023 oder 0 im ADC


rein rechnerisch kann ich doch um z.B 270 Grad angezeigt zu bekommen

folgender maßen rechnen


grad=(adcwert*360)/1023;

macht es aber nicht es kommt z.B bei adc=1023 en grad von 93 raus.

wie kommt das der PC Rechner spuckt 360 aus.

von Werner A. (homebrew)


Lesenswert?

war die tage schonmal. pc rechnet in grad, du in radiant. also einfach 
umwandeln

von Punzi (Gast)


Lesenswert?

hi!

lass mich raten .. deine variablen (grad und adcwert) sind uint16_t ?

dann rechnet er 1023*360 und das passt leider in 16bit nicht rein .. 
d.h. du verlierst die oberen bits ...

lg
    Punzi

von Herrmann (Gast)


Lesenswert?

Wie kann ich das verstehen????

von Karl H. (kbuchegg)


Lesenswert?

Werner A. wrote:
> war die tage schonmal. pc rechnet in grad, du in radiant. also einfach
> umwandeln

Äh. nein.
Das ist nur bei sin/cos relevant.
Hier geht es um eine ganz normale lineare Umrechnung.
Und die kann nun mal zwischendurch einen Overflow produzieren.

von Jörg X. (Gast)


Lesenswert?

Probier's mal mit:
grad=(adcwert*360L)/1023;

Denn adcwert*360 passt nur bis ~91 in ein signed int (16Bit -> der 
Standardtyp für Berechnungen beim AVR-GCC).

hth. Jörg

ps.: Für Quellcode gibt's die Tags -- die stehen direkt über deinem 
Username beim Posten...

von Punzi (Gast)


Lesenswert?

d.h. deine variable KANN nur werte bis 65535 speichern ...
1023*360 = 368280 ... das geht sich nicht aus ...
wennst dann nur die 2 niederwertigeren bytes nimmst ist das 40600
und wennst dann 40600/1023 machst .. dann kommt 39 grad raus ...

d.h. deine rechnung stimmt schon .. nur hast du einen variablenüberlauf.

von Herrmann (Gast)


Lesenswert?

Danke das war die rettung

von Karl H. (kbuchegg)


Lesenswert?

Herrmann wrote:
> Wie kann ich das verstehen????

Ganz einfach.
Die größte Zahl die mit 16 Bit darstellbar ist lautet:
65535 (2^16 - 1)

1023 * 360 = 368280

und das ist ein bischen größer.

Du musst auf den Datentyp long ausweichen.
Größte unsigned Zahl mit 32 Bit = 2^32 - 1 = um etliches größer

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.