Forum: Mikrocontroller und Digitale Elektronik Atmega8 ADC Schaltung drum herum


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich lese die letzten tage schon zich Beiträge, finde aber nur teils zum 
ziel.

Problem ist mein ADC Wert springt wie er will. Nun habe ich schon 
gesehen, dass man digitale und analoge Masse einführen sollte. Soweit so 
gut. Ich wollte mal fragen ob jemand hier vielleicht mal seine rundum 
Beschaltung posten kann. Ich nutze die interne Frequenz und ansonsten 
einige Pufferkondensatoren.

Habe meine Schaltung mal angehangen. Nicht wundern an den ADC Eingängen 
hängt was dran, ist nur abgeschnitten.

Ich habe aktuell am ersten Pin einen Spannungsteiler 10K zu 10K wobei 
parallel zu einem 100nF puffern und selbst da wackelt der adc Wert. Ich 
nutze die interne Referenz 5V

Würde mich freuen wenn jemand ma ne Schaltung postete von der 
Versorgungsseite wie er es gelöst hat :)

danke mfg michael

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

Du hast Aref, also deine Referenzspannung nicht beschaltet

von spess53 (Gast)


Lesenswert?

Hi

>Du hast Aref, also deine Referenzspannung nicht beschaltet

Der notwendige Kondensator ist doch dran.

>Ich habe aktuell am ersten Pin einen Spannungsteiler 10K zu 10K wobei
>parallel zu einem 100nF puffern und selbst da wackelt der adc Wert.

In welcher Größenordnung?

MfG Spess

von Knut (Gast)


Lesenswert?

> nutze die interne Referenz 5V

Der hat keine interne 5V Referenz, sondern nur ne 2,56V Referenz. Du 
misst gegen die VCC, dass kann die Schwankungen auslösen.

Knut

von Michael (Gast)


Lesenswert?

Wenn beim ADC Wert von maximal 1024 Werten ausgeht schwankt er immer 
zwischen 50 und 60 Werten.

Die Schwankung tritt auch auf, wenn ich gegen die 2,56 V Messe.

von Blackbird (Gast)


Lesenswert?

Vcc ist nicht beschaltet. Alleine mit AVcc geht's nicht.


Blackbird

von Michael (Gast)


Lesenswert?

ach du scheiße, was hab den ich da fürn mist gebaut.....wieso liegt vcc 
auf masse?!

Augen auf....das wird es sein denke ...ich teste ma und berichte

von Sönke O. (soenio)


Lesenswert?

Mit welcher Frequenz lässt du den ADC laufen?
Mach mal ein Bild von deinem Aufbau. Lass einfach mal den ADC langsamer 
laufen.

Hier mal drei Links die vllt. helfen könnten.

http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf 
(S.195-198)
http://www.atmel.com/dyn/resources/prod_documents/doc8003.pdf
http://www.atmel.com/dyn/resources/prod_documents/doc1619.pdf

von Michael (Gast)


Lesenswert?

danke, habs ma eben umgelötet, hatte ja gepasst nur eine brücke 
vergessen, ändenr tut sich trotzdem nichts. Auch wenn ich den ADC ganz 
langsam mache ändert sich nichts

von Vlad T. (vlad_tepesch)


Lesenswert?

wie wärs denn mal mit Code, Details zur Spannungsversorgung und 
Taktquelle

von Michael (Gast)


Lesenswert?

Also als Takt nutze ich intern die 1 Mhz

Spannungsquelle hab ich mir ein 7805 Regler aufgebaut, aber auch schon 
meine Labornetzteil genommen, ist bei beiden das gleiche problem.



/* ADC initialisieren  */
void ADC_Init(void) {

  uint16_t result;

  ADMUX = (0<<REFS1) | (1<<REFS0);      // AVcc als Referenz benutzen
  ADCSRA = (1<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);      // 
Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
  while (ADCSRA & (1<<ADSC) ) {}        // auf Abschluss der 
Konvertierung warten
  result = ADCW;
}



/* ADC Einzelmessung */
uint16_t ADC_Read( uint8_t channel )
{
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung 
warten
  return ADCW;                    // ADC auslesen und zurückgeben
}



int main(void)
{
_delay_ms(100);
  lcd_init();
  lcd_clear();
  ADC_Init();

while (1)
  {
  char Buffer[30];

    result= ADC_Read(2);
    _delay_ms(10);

         lcd_goto_xy( 8, 3 );
   itoa(result, Buffer, 10);
         while(strlen(Buffer) <4) strcat(Buffer," ");
   lcd_write(Buffer);



so das ist der code, Einführung etc hab ich ma weggelassen. Ich weiß das 
er sicher net optimal ist aber es geht um erste Linie darum, dass mir 
adc wert um bis zu 60 werten springt.

von Michael (Gast)


Lesenswert?

keiner mehr eine idee?

von Ulrich (Gast)


Lesenswert?

An der Software sollte es nicht liegen, die sieht OK aus.

Für die Abblockkondensatoren und Störungen über die Versorgung kommt es 
nicht nur darauf an wie der Schaltplan aussieht, sondern auch wie die 
Verbindungen liegen, und ggf. auch was für Kondensatoren das sind. Durch 
die Pinbelegung ist es aber so, das man es in der Regel richtig macht, 
weil die Kondensatoren gerade zu den dicht beieinander liegenden 
Pin-Paaren gehören.

Wenn die Versorgungsspannung keine größeren Störungen hat, sollte es so 
gehen.  Ein Versuch wäre es sonst noch die Analoge Versorgung noch mal 
extra zu filtern, mit einer kleinen Induktivität oder ggf. ersatzweise 
ein Widerstand von etwa 10 Ohm, wenn da keine nennenswerte Last an Port 
A hängt.

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.