mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Problem Mega8


Autor: Herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: The Devil (devil_86)
Datum:

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

Autor: Herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner A. (homebrew)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war die tage schonmal. pc rechnet in grad, du in radiant. also einfach 
umwandeln

Autor: Punzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich das verstehen????

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Punzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herrmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke das war die rettung

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.