Atmega8 ADC Schaltung drum herum

Gast #2190837
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
Angehängte Dateien:
Gast #2190842
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
Gast #2191220
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.
Gast #2192754
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren