ADC Problem Mega8

Gast #617133
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;
}
Gast #617134
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
Gast #617177
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.
Gast #617197
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...
Gast #617199
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.
#617210
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

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