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


von Hans P. (gableguy2000)


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.

von Karl H. (kbuchegg)


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.

von Jörn P. (jonnyp)


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.

von Hans P. (gableguy2000)


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

von Karl H. (kbuchegg)


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?

von Hans P. (gableguy2000)


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

von Hans P. (gableguy2000)


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?

1
#include <avr/io.h>
2
#include <stdint.h>
3
4
uint8_t i;
5
uint16_t adc_wert;
6
7
8
uint16_t ReadChannel(uint8_t mux)
9
10
{
11
  uint8_t i;
12
  uint16_t result;
13
 
14
  ADMUX = mux;                      // Kanal waehlen
15
  ADMUX &= ~(1<<REFS1); 
16
  ADMUX |= (1<<REFS0);  // interne Referenzspannung nutzen
17
 
18
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
19
                               // setzen auf 8 (1) und ADC aktivieren (1)
20
 
21
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
22
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
23
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
24
  while ( ADCSRA & (1<<ADSC) ) {
25
     ;     // auf Abschluss der Konvertierung warten 
26
  }
27
  result = ADCW;  // ADCW muss einmal gelesen werden,
28
                  // sonst wird Ergebnis der nächsten Wandlung
29
                  // nicht übernommen.
30
 
31
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
32
  result = 0; 
33
  for( i=0; i<4; i++ )
34
  {
35
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
36
    while ( ADCSRA & (1<<ADSC) ) {
37
      ;   // auf Abschluss der Konvertierung warten
38
    }
39
    result += ADCW;        // Wandlungsergebnisse aufaddieren
40
  }
41
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
42
 
43
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
44
 
45
  return result;
46
}
47
48
int main()
49
{
50
  DDRB = 0xFF;
51
52
  while( 1 )
53
  {
54
    PORTB = ReadChannel( 0 ) / 4;
55
  }
56
}

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.