- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 30 von 30

Thema: Dieses Mal: ADC-Probleme

  1. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    E-Bike
    Der ADC wandelt den Wert mit 10Bit. Die kann man dann links- oder rechtsbündig als 16Bit-Wert auslesen, es sind aber immer nur 10 davon wirklich wertig.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Jetzt verstehe ich das auch mit links oder rechtsbündig. endweder steht da dann z.B. 0000001111111111 oder 1111111111000000 wobei die Nullen keinen wert besitzen. Ich lese mir grade im datenblatt alles über den ADC durch. Komme immer besser damit klar.
    Danke erstmal für die nette hilfe.

    MfG Jan

  3. #23
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Genau so ist es. Der Wert von AREF wird durch 1024 geteilt, wenn AREF 5V sind und am Eingang liegen 2,5V an, dann bekommst du als Ergebnis 512 .
    AREF sollte daher gleich dem größten zu messenden Wert sein, dann hat man die beste Auflösung. Die Frage ist nur ob man sie tatsächlich immer braucht.
    Hubert

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    40
    Beiträge
    165
    [quote="Spongebob85"]
    Code:
      ADMUX = (1<<REFS0);
      ADMUX = ((0<<MUX0) | (0<<MUX1) | (0<<MUX2) | (0<<MUX3) | (0<<MUX4)); 	//damit ist ADC0-Eingang
    ...und REFS0 wieder ausgeschaltet. Das ganze Register ADMUX ist wieder 0. Falls das nicht nur ein Tippfehler war solltest du dich nochmal dringend mit Bitoperationen auseinandersetzen.
    Verodern mit 0 kann man sich uebrigens sparen.

    More Significant Byte
    Most...

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Verodern mit 0 kann man sich uebrigens sparen.
    Da der Kompiler die Veroderungen eh als berechnete Konstante ablegt ist es egal, wie man es formuliert. Bei (Dummy-)-Nullen im Grundgerüst für verschiedene Einstellungen kann man die jeweiligen Bits setzen ohne zuvor lange im Datenblatt zu stöbern und läuft keine Gefahr, irgendwelche wichtigen Bits zu vergessen. Als Beispiel mein "Grundgerüst" in der Einstellung für maximale Samplerate:

    Code:
    // ADC interne Referenz 2,56V, Ergebniss linksbündig, Kanal ADC4 (E_INT1)
    	ADMUX = (1<<REFS1) | (1<<REFS0)  | (1<<ADLAR) | 4;
    // setze free running triggern
    	SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    // kein interupt, Wandler einschalten, prescaler /2
    	ADCSRA = (0<<ADIE) | (1<<ADEN) | (0<<ADPS2) | (0<<ADPS1)  | (1<<ADPS0);
    // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
    	ADCSRA |= (1<<ADATE) | (1<<ADIF);
    // Initialisierung starten
    	ADCSRA |= (1<<ADSC);
    // und noch die wohl eher unnötige Initiallesung
    	while (!(ADCSRA & (1<<ADIF)));
    	ADCSRA |= (1<<ADIF);
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #26
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Radbruch, Du hast den Prescaller auf 2 stehen, oder hab ich da was falsch gelesen?
    Bei welchem Systemtakt 8 Mhz ? Das funktioniert ?
    Dir ist klar, daß laut Dattenblatt der ADC mit maximal 200 kHz laufen soll ?

    Gruß Sebastian

    P.S. Atmel schreibt zwar, wenn man eine Genauigkeit kleiner 10 Bit braucht kann man den Takt höher setzen, leider schreiben die nicht, wo die Grenze liegt, aber 4 MHz ist schon nicht schlecht...
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #27
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Radbruch, Du hast den Prescaller auf 2 stehen, oder hab ich da was falsch gelesen?
    Ja, prescaler /2 bei 8MHz-ATMega, du hast richtig gelesen. Noch habe ich keine Bestätigung durch Nachbauer:

    Kamera am RP6

    Hier noch mein Thread zur maximalen Samplerate:

    https://www.roboternetz.de/phpBB2/viewtopic.php?t=33070

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #28
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Das dachte ich mir schon
    Allerdings wäre ein Hinweis nicht schlecht, daß Du nur 4 Bits brauchst, sonst gibt es bald fragen, wie: "Ich habe den ADC so eingestellt, wie url=... beschrieben, allerding kommt nur Müll raus... hilfe ich bin Anfänger"
    Weißt Du was ich meine ?
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #29
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ich rechne nur mit den oberen 4 Bits weiter, um Speicher und Rechenpower zu sparen. Es werden aber trotzdem 8 Bit ausgelesen und die sind alle gültig.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #30
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Moin!!!
    Mein Prog funktioniert jetzt. Hier der Code:
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #define F_CPU 1000000UL
    
    int main(void)
      {
      uint16_t result;
      DDRC = (1<<PC0);
      
      ADMUX = 0x00;	//AREF, resultat rechtsbündig, ADC-Eingang ADC0
      ADCSRA = ((1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)); 	//ADC eingeschaltet, Teilungsfaktor 8
      
      while(1)
        {
    	ADCSRA |= (1<<ADSC);
        while (ADCSRA & (1<<ADSC))
          {
    	  ;
    	  }
        result = ADCL;
        result += (ADCH<<8);
      
        if (result >= 512) //LED geht ziemlich genau bei 2,5V an!!!
          {
    	  PORTC |= (1<<PC0);
    	  }
        else
          PORTC &= ~(1<<PC0);
        }
      }
    Jetzt stellt sich mir nur noch so die Frage, was das mit dem Autotrigger bedeutet. Das hab ich im Datenblatt nicht so ganz verstanden.
    Ich hab ja den 5.Bit in ADCSRA nicht gesetzt und auch das SFIOR register ganz außen vor gelassen. Laut der Tabelle im Datenblatt müsste jetzt FreeRunning Mode eingeschaltet sein. Hab ja alles für Single convention vorbereitet.
    Warum klappt das dann trotzdem?
    Was hat das mit dem Autotrigger auf sich?

    MfG Jan

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress