- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: AD-Wandler in C mit mega32

  1. #1
    Neuer Benutzer
    Registriert seit
    08.12.2004
    Ort
    Ravensburg
    Alter
    42
    Beiträge
    4

    AD-Wandler in C mit mega32

    Anzeige

    Powerstation Test
    hi,

    also gleich zu meinem problem, ich arbeite auf dem RN-Control 1.4 mit dem ATMELmega32 Chip und 2x SHARP GP2D12 Abstandmessungs Sensoren, welche ich an PORTA PA0 und PA1 angeschlossen habe. Nun sollte der AD-Wandler mir die eingehende Spannungen (zwischen) 0.4 und 2.6V in 2 Variablen (eine pro Sensor) speichern. Timer und so ist schon alles aufgesetzt, sollte also, kein problem darstellen, initialisiert hab ich ihn auch, nur weiß ich einfach nicht, wie ich den ADC ansprechen soll, da mir dazu einfach die kenntnisse fehlen, sollte jemand dort ein programmschnipsel haben, wäre ich sehr dankbar.

    greez eXe`

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Also hier bisschen Code mit vielen Kommentaren.
    Wobei die Defines nicht die eleganteste Lösung sind. Es ist besser du
    machst dir ne eigene adc_init() Funktion und setzt dort nur die Bits die du in deinem Fall brauchst.
    Code:
    #include <avr/io.h>
    
    /* Analog/Digiatl konverting */
    #define ADCchannel_init   DDRA=0x00                 // ADC Port als Eingang deklarieren
    #define ADCinit           ADCSRA|=(1<<ADEN)         // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
    #define ADCdisable        ADCSRA &=~(1<<ADEN)       // machs das vorherige wieder rückgänig
    #define ADCstart          ADCSRA|=(1<<ADSC)         // startet eine konvertierung auf dem gewünschten Kannal/Pin
    #define ADCfree           ADCSRA|=(1<<ADATE)        // schaltet den freilaufenden Modus ein
    #define ADCvintern        ADMUX=(1<<REFS1) | (1<<REFS0)     // interne Spannungsversorgung
    #define ADCinterrupt_on   ADCSRA|=(1<<ADIE)                // ADC interrupt wird freigeschalten
    #define ADCprescaler_2    ADCSRA |=(1<<ADPS0)              // gewünschter Teilungsfaktor/Prescaler 
    #define ADCprescaler_4    ADCSRA|=(1<<ADPS1)
    #define ADCprescaler_8    ADCSRA=(1<<ADPS1) | (1<<ADPS0)
    #define ADCprescaler_16   ADCSRA|=(1<<ADPS2)
    #define ADCprescaler_32   ADCSRA=(1<<ADPS2) | (1<<ADPS0)
    #define ADCprescaler_64   ADCSRA=(1<<ADPS2) | (1<<ADPS1)
    #define ADCprescaler_128  ADCSRA=(1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
    #define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)    // setzt Prescalerbits zurück     
    #define ADCchannel_1                                      //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
    #define ADCchannel_2      ADMUX|=(1<<MUX0)                // bei nicht freilaufen muss ADCchannel_x vor
    #define ADCchannel_3      ADMUX|=(1<<MUX1)                // ADCstart kommen dann kann man mit getadc() der 
    #define ADCchannel_4      ADMUX= (1<<MUX1) | (1<<MUX0)    // Adcwert des gewählten Kannals auslesen
    #define ADCchannel_5      ADMUX|=(1<<MUX2)
    #define ADCchannel_6      ADMUX= (1<<MUX2) | (1<<MUX0)
    #define ADCchannel_7      ADMUX= (1<<MUX2) | (1<<MUX1)
    #define ADCchannel_8      ADMUX= (1<<MUX2) | (1<<MUX1) | (1<<MUX0)
    #define ADCchannel_reset  ADMUX= ~(1<<MUX2) & ~(1<<MUX1) & ~(1<<MUX0)
    inline unsigned int getadc(void)
    {
       while (ADCSRA & (1<<ADSC)) {}          // Warten bis Messung fertig
       return ADC;
    }
    
    void main(void)
    {
       unsigned int adc_wert;
       ADCchannel_init;
       ADCinit;                   // A/D Converter aktivieren
       ADCvintern;                   
       ADCprescaler_128;
       ADCchannel_1;
       ADCstart;                   // Startet Messung an A/D Pin1 d.h. PINA0
       adc_wert=getadc();
       ADCchannel_reset;
       ADCchannel_2;                   // Startet Messung an A/D Pin2
       ADCstart;
       adc_wert=getadc();
       ADCdisable;
    }

  3. #3
    Neuer Benutzer
    Registriert seit
    08.12.2004
    Ort
    Ravensburg
    Alter
    42
    Beiträge
    4
    also dann bedanke ich mich erstmals, und werd nachsehen ob ichs nun auf die reihe bekomme.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    18.04.2005
    Ort
    Regensburg
    Alter
    45
    Beiträge
    13
    Hallo,

    ich habe den Mega8 und hab den Codschnippsel mal getestet,

    aber leider kennt er den Bezeichner DDRA nicht.

    Wo liegt da der Fehler?

    Danke

    Gruß
    Matthias

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,
    beim Mega 8 gibts nur Port B, C und D,
    deswegen gibts auch kein DDRA !
    Du musst Dir einen anderen Port aussuchen,

    Die ADCs sind beim M8 auf Port C.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.04.2005
    Ort
    Regensburg
    Alter
    45
    Beiträge
    13
    Ok,

    auf das bin ich dann auch noch gekommen, aber reicht es einfach diese Zeile:

    #define ADCchannel_init DDRA=0x00
    in
    #define ADCchannel_init DDRC=0x00

    zu ändern oder muß ich noch mehr ändern?

    Danke

    Gruß
    Frostie

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Hier noch zwei Funktionen...

    Gehd bei ATMEGA8535, 32, 128.... und andere wo die Register passen.

    Macht X Dummy-Messungen, dann aus x Messungen den Mittelwert

    Code:
    void ADC_init(void) { 
        ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1); 
    } 
    
    uint16_t ADC_wert(uint8_t mux) { 
    	uint8_t i;
    	uint8_t ii;
    	uint16_t result;
    	uint16_t ergebnis;
    	ergebnis = 0;
    	//    +------------ Dummy-Check ------------+
    	i = 5;										// i x Dummy-Check
    	while(i){
    		ADMUX = mux;    						// Kanal waehlen
    		ADCSRA |= (1<<ADSC);            		// eine Wandlung "single conversion"
    		while(!(ADCSRA & (1<<ADIF)));   		// auf Abschluss der Konvertierung warten (ADIF-bit)
    		result = ADCL + (ADCH << 8);			// Wandlungsergebnisse erfassen
    		result = 0;								// Zurücksetzen
    		i--;
    	}
    	//    +------------- Ermittlung ------------+
    	i = 8;
    	ii = i;										// Schnitt aus i Ergebnissen
    	while(i){
    		ADMUX = mux;    						// Kanal waehlen
    		ADCSRA |= (1<<ADSC);            		// eine Wandlung "single conversion"
    		while(!(ADCSRA & (1<<ADIF)));   		// auf Abschluss der Konvertierung warten (ADIF-bit)
    		result = ADCL + (ADCH << 8);			// Wandlungsergebnisse erfassen
    		ergebnis = ergebnis + result;			// Aufaddieren
    		i--;
    	}
    	//    +-------- Umrechnung & Ausgabe -------+
    	ergebnis = ergebnis / ii ;
    	return ergebnis;
    }
    Gruß,
    Franz

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    18.04.2005
    Ort
    Regensburg
    Alter
    45
    Beiträge
    13
    Hm,

    ich kriegs einfach ned zum laufen.

    Wie kann ich herausfinden, was da für ein Wert rauskommt?

    Ich hatte immer abfragen wie:

    if(result > 12 ....


    Probiert, aber das klappt einfach nicht.

    Wenn ich ein Analoges Eingangssignal zwischen 0,5-3,0V habe, mit welchem Wert muß ich dann rechnen?

    Danke
    Gruß
    Frostie

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    38
    Beiträge
    795
    Hi,

    Hast du den Controller min. so angeschlossen:

    Bild hier  

    Der ADC muss extra mit spannung versorgt werden.


    EDIT:

    Der ADC liefert werte zwischen 0 und 1023.
    Kommt darauf an was du an AREF angeschlossen hast.

    wenn 5V, dann entspricht 5V 1023, 0V 0.

    EDIT2:
    bei 5V AREF:

    0,5V ca. 102
    3,0V ca. 614
    Gruß,
    Franz

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    @Kaiser-F
    das ist aber ein SMD M32, nicht das da einer mit den Pins durcheinander kommt !

    der Frostie wollte doch einen M8 verwenden, aber die Pins heissen zumindest genauso.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests