mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD Wandlung träge


Autor: Hans Peter (gableguy2000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <stdint.h>

int16_t ReadChannel(int8_t mux)
{
  int8_t i;
  int16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX &= ~(1<<REFS1); 
  ADMUX |=  (1<<REFS0); // AVREF als 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(void)
{
  
  
  
  int16_t adcval0, adcval1, spandiff;
  
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 ;
  DDRB = (1 << DDB0) | (1 << DDB1); 
  
  
  



  while(1)
  {
  adcval0 = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
  
  adcval1 = ReadChannel(1); /* MUX-Bits auf 0b0010 -> Channel 1 */
  
  if(adcval0 == adcval1)
    {
  PORTB &= ~(1<<PB0);
  PORTB &= ~(1<<PB1);
    }
  
  
  spandiff = adcval0 - adcval1;

  if(spandiff > 10)
  {
  PORTB |= (1<<PB0);
  PORTB &= ~(1<<PB1);
  }
 else if(spandiff < 0)
  {
   PORTB |= (1<<PB1);
  PORTB &= ~(1<<PB0);
  }
}
}
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

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

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Hans Peter (gableguy2000)
Datum:

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

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

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

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

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

Autor: Hans Peter (gableguy2000)
Datum:

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

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

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

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

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

Autor: Hans Peter (gableguy2000)
Datum:

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

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

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

Autor: Hans Peter (gableguy2000)
Datum:

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

Autor: Dampfmaschin (Gast)
Datum:

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

Autor: Hans Peter (gableguy2000)
Datum:

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

Autor: Dampfmaschin (Gast)
Datum:

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

Autor: Hans Peter (gableguy2000)
Datum:

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

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.