Forum: Mikrocontroller und Digitale Elektronik AD Wandlung träge


von Hans P. (gableguy2000)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin es mal wieder.
Ich versuche gerade ien AD-Wandlung mit dem ATmega32 durchzuführen.
Das klappt auch soweit, baer ich habe zur Kontrolle an die Ausgänge 
LED´s geschaltet.
Und die Umschaltung finde ich etwas träge, von der Empfindlichkeit ganz 
zu schweigen.
Beschaltung:
Vor Pin 40 (ADC0) und Pin 39 (ADC1) den Spannungsteiler wie im Anhang. 
Nur mit 5k Poti und 4,7k Widerstand.
AREF über 100n Kondensator an GND, AVCC an 5V.
der Code sieht so aus:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int16_t ReadChannel(int8_t mux)
5
{
6
  int8_t i;
7
  int16_t result;
8
 
9
  ADMUX = mux;                      // Kanal waehlen
10
  ADMUX &= ~(1<<REFS1); 
11
  ADMUX |=  (1<<REFS0); // AVREF als Referenzspannung nutzen
12
 
13
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
14
                               // setzen auf 8 (1) und ADC aktivieren (1)
15
 
16
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
17
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
18
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
19
  while ( ADCSRA & (1<<ADSC) ) {
20
     ;     // auf Abschluss der Konvertierung warten 
21
  }
22
  result = ADCW;  // ADCW muss einmal gelesen werden,
23
                  // sonst wird Ergebnis der nächsten Wandlung
24
                  // nicht übernommen.
25
 
26
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
27
  result = 0; 
28
  for( i=0; i<4; i++ )
29
  {
30
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
31
    while ( ADCSRA & (1<<ADSC) ) {
32
      ;   // auf Abschluss der Konvertierung warten
33
    }
34
    result += ADCW;        // Wandlungsergebnisse aufaddieren
35
  }
36
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
37
 
38
  result /= 4;                     // Summe durch vier teilen = arithm. Mittelwert
39
 
40
  return result;
41
}
42
 
43
int main(void)
44
{
45
  
46
  
47
  
48
  int16_t adcval0, adcval1, spandiff;
49
  
50
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
51
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
52
  DDRB = (1 << DDB0) | (1 << DDB1); 
53
  
54
  
55
  
56
57
58
59
  while(1)
60
  {
61
  adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
62
  
63
  adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
64
  
65
  if(adcval0 == adcval1)
66
    {
67
  PORTB &= ~(1<<PB0);
68
  PORTB &= ~(1<<PB1);
69
    }
70
  
71
  
72
  spandiff = adcval0 - adcval1;
73
74
  if(spandiff > 10)
75
  {
76
  PORTB |= (1<<PB0);
77
  PORTB &= ~(1<<PB1);
78
  }
79
 else if(spandiff < 0)
80
  {
81
   PORTB |= (1<<PB1);
82
  PORTB &= ~(1<<PB0);
83
  }
84
}
85
}
Es soll später mal ein empfindlicher Sonnensensor werden, aber davon bin 
ich noch weit entfernt :-)

Für Hilfe bin ich wie immer sehr dankbar.

Den oberen Teil habe ich aus dem Tutorial.

LG

von Karl H. (kbuchegg)


Lesenswert?

In welcher Größenordnung verändert sich den dein LDR bei 
unterschiedlicher Beleuchtung?

Was muss man sich unter "etwas träge" vorstellen?
Das LDR nicht gerade die schnellsten sind, ist ja bekannt.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das Poti muß anders geschaltet werden, linker Pin an Masse, rechter Pin 
an den Fotowiderstand und Mittelanzapfung an den ADC.

von Hans P. (gableguy2000)


Lesenswert?

Sonnenschein (am Freitag gemessen) ca. 40 Ohm, Dunkel (in einer 
Schublade gemessen) über 50MOhm.
Ich glaube nicht, das ich dne Wert draußen erreiche.
Muss mal Abends um 18 oder 20 Uhr messen.

Träge meine ich vom umschalten her. Und Sie reagieren nur, wenn ich den 
Finger kurz davor habe. Das meine ich mit Empfindlichkeit.

Sorry wenn ich mich falsch ausgedrückt habe.

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:
> Sonnenschein (am Freitag gemessen) ca. 40 Ohm, Dunkel (in einer
> Schublade gemessen) über 50MOhm.
> Ich glaube nicht, das ich dne Wert draußen erreiche.
> Muss mal Abends um 18 oder 20 Uhr messen.

Und bei welchem Ohm Wert soll die Schaltschwelle liegen?

TravelRec hat natürlich recht. Das Poti muss anders verschaltet werden. 
Aber abgesehen davon musst du noch darauf achten, bei welchen Ohmwerten 
du deine ungefähren Schaltpunke haben willst und die Widerstände danach 
dimensionieren.

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:

> Träge meine ich vom umschalten her. Und Sie reagieren nur, wenn ich den
> Finger kurz davor habe. Das meine ich mit Empfindlichkeit.

Wie kurz?
1 Sekunde, 1 Minute, 1 Stunde, 1 Zehntelsekunde?

Und: Ist das in deiner Anwendung ein Problem?

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

habe die Schaltung geändet, habe beide LDR´s der gleich ausgerichtet, 
aber trotzdem brennt immer eine LED. Die Spannungen sind auch fast 
gleich ADC0 = 3,612V und ADC1 = 3,617 und trotzdem brennt eine LED. Ich 
bekomme Sie nicht richtig kalibriert, so das wenn Sie beide ausgerichtet 
sind, keine LED brennt.
Ich muss wie gesagt, sehr nah an den LDR´s vorbeifahren mit dem Finger, 
damit Sie umschalten.
Die LDR´s sollten auf die kleinste Abschattung reagieren.
Mein Wert liegt ja bei 10, wenn ich das umrechne, dann ist das eine 
Spannung von 0,0483...V das ist schon eine sehr kleine Spannung, aber es 
wird nicht richtig reagiert. Hat von euch jemand eine Idee, wie ich mein 
Prog oder die PIN-Beschaltung belegen soll/kann um die Empfindlichkeit 
zu erhöhen.
Ist meine Schleife falsch?


Meine Ref Spannung ist 4,956V.

LG

von Karl H. (kbuchegg)


Lesenswert?

Das hier:

  if(adcval0 == adcval1)

ist sehr optimistisch.
Selbst wenn die Spannung um ADC Eingang konstant gehalten wird, schwankt 
der Wert vom ADC immer leicht. Größenordnung: so um die +/- 2 Einheiten 
sind jederzeit drinnen. Die Mittelwertbildung filtert das zwar ein wenig 
aus, aber mit 4 Werten gemittelt ist immer noch mit einer kleinen 
Abwechung zu rechnen.

Du kannst es drehen und wenden wie du willst: Du brauchst eine 
Möglichkeit um dir die Werte ausgeben zu lassen. Alles andere ist 
Stochern im Nebel.

von Karl H. (kbuchegg)


Lesenswert?

> Die LDR´s sollten auf die kleinste Abschattung reagieren.

Vielleicht erinnere ich mich falsch.
Aber wolltest du nicht irgendwelche Solarpaneele nachführen?

Bist du dir sicher, dass jeder vorbeifliegende Vogel, dessen Schatten 
zufällig auf die Auswertung fällt, die Nachführung betätigen soll?

von Hans P. (gableguy2000)


Lesenswert?

Hallo,

alles klar.
Aber du hast recht mit der Zeit, das ist kein Problem.
Mir würde auch eine Abfrage alle 0,5 Minuten reichen.
Ich muss aber später insgesamt 5 oder auch mehr Eingänge abfragen, 
möglichst parallel. Aber das ist ja so nicht möglich. Aber 6 ADC 
Eingänge in einer halben Minute abfragen, sollte doch keien Problem 
sein, oder liege ich da falsch?
Ich habe mir ja ein Display bestellt, hoffe das es morgen da ist.
Dann kommt aber das nächste Problem, die Ansteuerung. Na ja, ich habe ja 
euch :-).

LG

von Karl H. (kbuchegg)


Lesenswert?

Hans Peter schrieb:

> Dann kommt aber das nächste Problem, die Ansteuerung. Na ja, ich habe ja
> euch :-).

Darauf würde ich schön langsam nicht mehr zählen.
Schliesslich ist es DEIN Projekt.

von Hans P. (gableguy2000)


Lesenswert?

War ja auch nur Spass.
Nein, auf jeden Vogel nicht, aber schon auf Wolken vor der Sonne.
Und ein Anfang wäre, wenn der Sensor auf mich reagieren würde, wenn ich 
mal 5 Meter weit weg stehe.

LG

von Dampfmaschin (Gast)


Lesenswert?

Bist Du eigentlich sicher, daß es den Wirkungsgrad Deiner Solaranlage 
steigert, wenn da ständig Motoren laufen und bei der kleinsten Wolke 
reagieren ? Hast Du das mal realistisch abgeschätzt ?

von Hans P. (gableguy2000)


Lesenswert?

Ja, da hast du recht.
Es ist weder klug noch wirtschaflich, die Anlage jede Minute 
nachzuführen.
Aber es ist eine Aufgabe, die ich erfüllen muss.

von Dampfmaschin (Gast)


Lesenswert?

Hast Du die Mechanik im Griff ? Die soll ja sicher auch bei Eis und -10 
Grad funktionieren. Hm, aber das könnte man ja mit beheizten Motoren in 
den Griff bekommen ;-)

Evtl wäre es besser, einfach ein Paneel mehr zu nehmen :-)

von Hans P. (gableguy2000)


Lesenswert?

Hört sich komisch an, aber über die Mechanik mache ich mir keinen 
Gedanken, da diese nicht zu meinen Aufgaben gehört.
Mein Part ist die Sensoreinheit incl. mC und da brauche ich noch Hilfe.

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.