-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Probleme mit adc

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2006
    Beiträge
    11

    Probleme mit adc

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    Ich bin neuling und versuche ein paar tests auf dem ATMega 16.
    Ich benutzte das board von Pollin.
    Nun zu meinem Problem:
    Mein AVcc ist an Vcc, GND an GND und mein ARef an Vcc oder an Masse mit einem Kondensator 100nF. Egal wie ich es mache und auch die passenden Bits setzte ich bekomme kein ergebnis. kann mir jemande helfen.

    PS. Als routine benuzte ich die vom Wiki.

    gruss markus

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    wir wissen ja nicht welche Kombination Du ausprobiert hast,
    wenn man aussen Vcc anlegt bei AREF, sollte man das auch auf ext. Reference konfigurieren.
    Wenn man nur den Kondensator dran hat, muss man eine interne, oder AVCC als Referenz wählen.
    Den Kondensator sollte man allerdings immer dran haben, egal wo die Spannung zu AREF herkommt.

    Das gemessene Signal sollte dann auch zum AREF passen, bzw. eig. andersrum. Wenn man bis 5V Messen will, braucht man AVCC, damit man den ganzen Bereich vom ADC ausnutzen kann.
    Ist die gemessene Spannung max. 2,5V, reicht die interne Referenz.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    29.04.2008
    Beiträge
    49
    hi


    also ich benutze ein zweites Netzteil mit dem ich 0V-2,5V anlegen kann und das is wie folgt angeschlossen

    erste Stromquelle nur an VCC und GND um das board zu versorgen
    zweite stromquelle am +pol mit dem gewünschten ADCpin verbunden (in meinem fall PA1) und am -pol mit GND verbunden
    dann noch einen Kondensator von AREF zu GND (wobei es auch ohne den kondensator geht)

    alles andere ist konfigurationssache des programms

    mein programm:

    ADC.c
    Code:
    #include <avr/io.h>
    #include <avr/iom16.h>
    #include <inttypes.h>
    #include "ADC.h"
    
    
    uint16_t ReadChannel(uint8_t mux)
    {
     uint8_t i;
     uint16_t result;
     ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); 	// Frequenzvorteiler
     												// setzen auf 8 (1) und ADC aktivieren (1)
     ADMUX = mux; 									// Kanal waehlen
     ADMUX |= (1<<REFS1) | (1<<REFS0); 				// interne Referenzspannung nutzen
     
     /* 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;
    }
    main.c
    Code:
    #include <avr/io.h>
    #include <avr/iom16.h>
    #include <inttypes.h>
    #include "ADC.h"
    #define F_CPU 4000000UL
    #include <util/delay.h>
    
    int main (void)
    {
     DDRA = 0;
     DDRD = 1;
     _delay_ms(500);
     PORTD = 0xff;
     _delay_ms(500);
     PORTD = 0x00;
     _delay_ms(500);
     uint16_t adcval = 0x00;
     while(1)
     {
      adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
      PORTD = adcval;
      _delay_ms(250);
     }
     return 0;
    }
    ADC.h
    Code:
    uint16_t ReadChannel(uint8_t mux);
    ich benutze übrigens auch den ATmega 16 und das pollin board (allerdings zusammen mit dem addonboard)


    mfg Grandalf

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2006
    Beiträge
    11
    Also bei dem beispiel habe ich den ARef Pin über einen 100nF Kondensator auf masse gelegt.
    Da ich 8 MHz benutze habe ich einen Prescalrer von 64 genommen.

    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2); // Frequenzvorteiler

    ADMUX |= (1<<REFS0); // AVCC als Referenzspannung nutzen

    Dann mache ich einen dummy readout

    anschliessend messe ich viermal eine und bilde einen mittelwert.

    wenn ich dann adc0 auf masse bzw. vcc lege ändert sich der wert nicht.

    mfg Markus

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo Markus,

    Zitat Zitat von Gleiti84
    ....ARef Pin über einen 100nF Kondensator auf masse gelegt.
    das ist i.O., da Du AVcc als Referenz nimmst.

    Da ich 8 MHz benutze habe ich einen Prescalrer von 64 genommen.
    A/D-Wandlerfrequenz also 125 kHz -- auch i.O.!

    Dann mache ich einen dummy readout
    anschliessend messe ich viermal eine und bilde einen mittelwert.
    Zeige uns doch mal Deinen Code dazu (am besten nicht abschreiben, sondern direkt in Dein Posting kopieren -- ganz, mit Initialisierung, so dass alles kompilierbar ist!).

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2006
    Beiträge
    11
    Code:
    uint16_t ReadChannel(uint8_t mux)
    {
    	uint8_t i;
    	uint16_t result;
    	
    	ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2); // Frequenzvorteiler
    	
    	// setzen auf 8 (1) und ADC aktivieren (1)
    	ADMUX = mux; // Kanal waehlen
    	ADMUX |= (1<<REFS0); // AVCC als Referenzspannung nutzen
    	/* 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;
    }
    und aufrufen tue ich alles über x = ReadChannel(0);

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Hallo,

    in dem von Dir geposteten Code kann ich keinen Fehler entdecken. Bist Du sicher, dass ADC0/PA0 als Eingang programmiert ist?

    ..mein ARef an Vcc oder an Masse mit einem Kondensator 100nF
    Du hast Aref nie direkt mit Massse verbunden, oder?


    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2006
    Beiträge
    11
    nein nur über einen kondensator

    ich habe eigentlich den pin als eingang geschrieben

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    24.02.2006
    Ort
    3. Planet eines kleinen Sonnensystems in einem Seitenarm der Milchstraße
    Alter
    63
    Beiträge
    622
    Jallo,

    Dein Pollin Board kenne ich nicht -- da ist PA0 ansonsten unbeschaltet? Kannst Du uns auch noch Deine Port-Initialisierung zeigen?

    Gruß

    Fred
    Only entropy comes easy. - Anton Checkhov

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    29.04.2008
    Beiträge
    49
    Zitat von Gleiti84
    Also bei dem beispiel habe ich den ARef Pin über einen 100nF Kondensator auf masse gelegt.
    Da ich 8 MHz benutze habe ich einen Prescalrer von 64 genommen.

    ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS2); // Frequenzvorteiler

    ADMUX |= (1<<REFS0); // AVCC als Referenzspannung nutzen

    Dann mache ich einen dummy readout

    anschliessend messe ich viermal eine und bilde einen mittelwert.

    wenn ich dann adc0 auf masse bzw. vcc lege ändert sich der wert nicht.

    mfg Markus
    meinst du mit "bei dem Beispiel" meinen geposteten code?
    da ich es hier alles vor mir liegen habe muss das funktionieren es funktioniert ja auch bei mir.

    um halt bei mir was zu sehen musst du an PORTD 8 LEDs anschließen um den gemessenen wert binär angezeigt zu bekommen (wobei nicht wundern wenn zwischen 0V und 2,55V der ADC mehr als 1x bis 255 zählt)
    du kannst aber natürlich das ganze für ne LCD anzeige umbauen oder wie du möchtest aber die ADC funktion müsste funktionieren.

    hast du das ausprobiert?

    mfg Grandalf

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •