www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 AD-Wandler /Komperator


Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe schon mehrere Threads in diesem Forum über den AD-Wandler vom 
ATmega32 gelesen.
Nichts hat so richtig zu meinem Problem gepasst.
Ich würde gerne eine Schaltung aufbauen, und an die Eingänge vom ATmega 
Solarpanels hängen. Die Spannung der Panels soll vom ATmega verglichen 
werden, um bei bestimmten Abweichungen untereinander die Ausgänge zu 
beschalten.
Jetzt habe ich bei Conrad verschiedene Solarpanels gefunden, die mir 
auch verschiedene Spannungen und Ströme liefern.
Meine Frage jetzt:
1. Ich weis nicht, welche Spannungen und Ströme ich auf den AD-Wandler 
des ATmegas geben kann (was er aushält ohne zerstört zu werden)?
2. Der AD_Wandler hat eine Auflösung von 10-Bit, gibt es mC die eine 
höhere Auflösung haben, z.B. 16 bit? Wenn ja, welche sind das?
3. Die Eingänge des ATmega ADC0 bis ADC7 sind die AD-Wandler Eingänge. 
Ist es möglich, da ich 5 Sensoren habe, immer 2 davon irgendwie zu 
vergleichen, und die übrige als Referenzspannung zu bestimmen?
Ich würde z.B. gerne den Eingang ADC0 mit dem Eingang ADC1 vergleichen.
Aber gleichzeitig würde ich gerne den Sensor an z.B.ADC4 mit den übrigen 
4 Eingängen vergleichen. Wenn ADC4 größer ist als alle anderen, dann 
soll er .... tun, wenn er kleiner ist, als irgendeiner, dann soll 
geschaut werden, ob z.B. die Sensoren an ADC0 und ADC1 gleich sind, wenn 
das nicht der Fall ist dann soll er ... tun.

Das war jetzt vielleicht etwas weit ausgeholt, sorry.

Kurz: Ich will mit dem uC einen Sonnensensor bauen, mit 5 Solarzellen.

LG und schönes WE.

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:


> Jetzt habe ich bei Conrad verschiedene Solarpanels gefunden, die mir
> auch verschiedene Spannungen und Ströme liefern.
> Meine Frage jetzt:
> 1. Ich weis nicht, welche Spannungen und Ströme ich auf den AD-Wandler
> des ATmegas geben kann (was er aushält ohne zerstört zu werden)?

Dein oberes Limit ist die Versorgungsspannung des Mega. Im Normalfall 
sind das 5V. Aber der Spannungsteiler ist schon erfunden, mit dem man zb 
12V auf 5V herunterteilt.

Um den Strom brauchst du dir keine Sorgen machen. Der AD Wandler zieht 
nur soviel Strom, wie er braucht.

> 2. Der AD_Wandler hat eine Auflösung von 10-Bit, gibt es mC die eine
> höhere Auflösung haben, z.B. 16 bit? Wenn ja, welche sind das?

Wie genau brauchst du das denn?
Bei 5V kannst du theoretisch die Spannung auf ~5mV genau messen. Für die 
meisten Anwendungen ist das mehr als ausreichend. Vor allem mit dem 
Hintergrund, dass du ja auch Störungen und äussere Einflüsse mitmisst. 
Ohne speziellen Aufbau ist es gar nicht so einfach die Auflösung eines 
16-Bit Wandlers auch sinnvoll zu nutzen.

Im Vergleich: Klar kann man Entfernungen auch auf 1/10000 Millimeter 
messen. Nur braucht ein Maurer nun mal nicht diese Genauigkeit. Für den 
reicht es schon, wenn seine Mauer auf den Zentimeter genau ist.

> 3. Die Eingänge des ATmega ADC0 bis ADC7 sind die AD-Wandler Eingänge.
> Ist es möglich, da ich 5 Sensoren habe, immer 2 davon irgendwie zu
> vergleichen, und die übrige als Referenzspanung zu bestimmen?

Das machst du in Software.
Erst einen Eingang lesen
dann den anderen Eingang lesen
dann die beiden Werte vergleichen

Das nennt man dann programmieren, wenn man mit gemessenen Werten anhand 
einer Logik neue Werte berechnet und die wiederrum mit anderen Werten 
verknüpft und davon abhängig irgendwelche Vorgänge auslöst.

> Ich würde z.B. gerne den Eingang ADC0 mit dem Eingang ADC1 vergleichen.
> Aber gleichzeitig würde ich gerne den Sensor an z.B.ADC4 mit den übrigen
> 4 Eingängen vergleichen. Wenn ADC4 größer ist als alle anderen, dann
> soll er .... tun, wenn er kleiner ist, als irgendeiner, dann soll
> geschaut werden, ob z.B. die Sensoren an ADC0 und ADC1 gleich sind, wenn
> das nicht der Fall ist dann soll er ... tun.

Macht man alles in Software.
Und die zu entwickeln wird dir noch viel Kopfzerbrechen, aber auch viel 
Spass bringen.

Autor: Jörn Paschedag (jonnyp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du so geil auf einen 16Bit ADC bist, dann kannst du die Messungen 
natürlich auch über einen externen ADC machen. Bedenke aber, das du dann 
auch noch einen externen Multiplexer brauchst um die Messtellen auf den 
ADC zu schalten. Das ganze Zeugs hast du aber beim ATmega in einem 
Stück.
Alles andere hat kbuchegg ja schon verklickert.

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin nicht geil, sondern ich würde gerne eine Sensor bauen, der eine 
sehr hohe Empfindlichkeit hat. Und ich dachte mir, desto höher die 
Auflösung, desto genauer kann ich auf die kleinsten Unterschiede bei den 
Eingängen reagieren, oder sehe ich das falsch?

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Hans Peter schrieb:
> Ich bin nicht geil, sondern ich würde gerne eine Sensor bauen, der eine
> sehr hohe Empfindlichkeit hat. Und ich dachte mir, desto höher die
> Auflösung, desto genauer kann ich auf die kleinsten Unterschiede bei den
> Eingängen reagieren, oder sehe ich das falsch?

Auflösung und Genauigkeit sind 2 verschiedene paar Schuhe.

Wie genau willst du denn die Spannung messen bzw. wie genau brauchst du 
es denn?

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da es sich ja um eine Nachführung handelt, wird in diesem Fall die 
Genauigkeit in Grad angegeben.
Die Genauigkeit soll max. 0,25 Grad sein, besser wäre noch darunter.

Wenn ich doch 10 Bit habe, 2^10 ist 1024,
Der abgefahrene Winkel ist von 10° bis 170°.

Dann entspricht:

  160° = 1024 Werten
  1°   =  6,4
  0,2° = 1,28

Habe ich da einen Denkfehler?


LG

Autor: Hans Peter (gableguy2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

muss noch mal was fragen.
Ich will wie bereits erwähnt, jeweils 2 Eingänge miteinander 
vergleichen.
Über den AD-Wandler.
Habe vier Sensoren, jedes Sensorpaar soll miteinander verglichen werden.
Ich stelle es mir nicht so schwer vor, die Eingänge abzufragen, und dann 
miteinander zu vergleichen.
aber ich brauche keine Referenzspannung, oder die Referenzspannung soll 
der andere Eingang sein.
Kann ich jetzt trozdem den AD-Wandler benutzen, auch ohne 
exteren/interne Referenzspannung?
Habe mir mal ein Testprog geschrieben, wo eine Spannung am AD Wandler 
anliegt, und ich mit einem Poti die Werte verändern kann, am Ausgang 
waren LED´s angeschlossen.
Jetzt will ich aber 2 Eingänge einlesen, und dann je nach dem welche 
Spannung anliegt, verschiedene Ausgänge schalten.

Das war der Code von damals.
Kann ich nicht die Funktion ReadChannel etwas abändern und in der main 
einfach die funktion auf z.B. Eingang 0 und 1 anwenden?

Oder lege ich die exteren Ref Spannung von 5V an, und vergleiche jeden 
Eingang mit dieser Spannung. Die Differenzen die bei den Vergleichen 
enstehen, vergleiche ich dann miteinander?

#include <avr/io.h>
#include <stdint.h>

uint8_t i;
uint16_t adc_wert;


uint16_t ReadChannel(uint8_t mux)

{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX &= ~(1<<REFS1); 
  ADMUX |= (1<<REFS0);  // interne Referenzspannung nutzen
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                               // setzen auf 8 (1) und ADC aktivieren (1)
 
  /* 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;
}

int main()
{
  DDRB = 0xFF;

  while( 1 )
  {
    PORTB = ReadChannel( 0 ) / 4;
  }
}

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.