mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC - Atmega128


Autor: kein anschluss unter dieser Nummer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich hab jetzt schon einige Zeit gesucht aber nix gefunden...
Hier mein Problem:
Ich habe die ADC Routine aus dem GCC Tutorial genommen aber leider tut 
die nicht ganz.

Ich bekomme folgende Werte:
Init done!
Systime:0 ms
ADC 0: 511  ADC 1: 479  ADC 2: 476  ADC 3: 514  ADC 4: 536  ADC 5: 550 
ADC 6: 552  ADC 7: 550      ADC BG: 373  ADC 0V: 0

Systime:520 ms
ADC 0:  57  ADC 1:  70  ADC 2:  82  ADC 3: 106  ADC 4: 129  ADC 5: 154 
ADC 6: 177  ADC 7: 200      ADC BG: 373  ADC 0V: 0

Systime:1050 ms
ADC 0:   1  ADC 1:   0  ADC 2:   0  ADC 3:   1  ADC 4:   1  ADC 5:   0 
ADC 6:   2  ADC 7:   3      ADC BG: 373  ADC 0V: 0

wie man sieht fallen die Werte langsam gegen 0, doch das tun sie auch 
wenn ich VCC anschließe oder die PORTS anschalte (wie in diesem Fall 
DDRA=0xFF PORTA=0xFF).
Die Werte von der BG (MUX=30) und GND (MUX=31) stimmen sofort 
(373/1,23V*1024 = 3,37V)

Hat jemand eine Idee oder einen Link (bitte nicht das Tutorial)?

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

Bewertung
0 lesenswert
nicht lesenswert
OK. DU verwendest du Tutorial Routinen.
Aber wie sieht dein Programm aus?
(und auch wenn wir die Routinen kennen, lass sie trotzdem drinnen).

Was passiert eigentlich, wenn du immer nur 1 Kanal sampelst?

Autor: kein anschluss unter dieser Nummer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Board läuft mit 7,273800Mhz und das hier ist es:
http://www.chip45.com/AVR-Mikrocontroller-System-P...

Hier die Main:
int main()
{
  adc_init();
  timer_init();
  uart_init(UART_BAUD_SELECT(19200,F_CPU));
  stdout = &mystdout;
  sei();
  printf("Init done!\r\n");

  DDRA = 0xFF;
  PORTA= 0x0F;

  while(1){
  printf("Systime:%lu ms\r\n",ulTime);
  _delay_ms(200);

  for(uint8_t i= 0 ; i<8 ; i++){
    uint16_t val = getAdcValueAvg(i);
    printf("ADC %d: %3d  ",i,val);
  }   
  printf("ADC BG: %3d  ",getAdcValueAvg(30));
  printf("ADC 0V: %3d\r\n",getAdcValueAvg(31));
  }
}

und hier die ADC Routine
void adc_init(){
 
  uint16_t result;
 
  ADMUX = (0<<REFS1) | (1<<REFS0);            // AVcc als Referenz benutzen
  ADCSRA = (1<<ADPS2)|(1<<ADPS1) | (0<<ADPS0);// Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                        // ADC aktivieren
 
  /* 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
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
     Wandlung nicht übernommen. */
  result = ADCW;
}

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


uint16_t getAdcValueAvg(uint8_t bChannel){
  uint32_t result = 0;
  for (uint8_t i = 0; i < 128; ++i )
    result += getAdcValue( bChannel );
  return (uint16_t)( result / 128 );
}

Autor: Uwe S. (de0508)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hänge man meinen C Code an.
Der läuft ohne Probleme.

Ich hoffe es hilft Dir.

.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

JTAG-Fuse

MfG Spess

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.