- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: ATmega328P, TPFP @20MHz : ADC7 mit falschen Werten

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678

    ATmega328P, TPFP @20MHz : ADC7 mit falschen Werten

    Anzeige

    LiFePo4 Akku selber bauen - Video
    In einem laufenden Projekt messe ich ständig die aktuelle Versorgungsspannung. Dazu wird die Versorgungsspannung 1:1 über einen Spannungsteiler 10k-10k an den ADC geleitet. Nach ersten Läufen wurden die in der Bauform TQFP verfügbaren ADC-Kanäle aktiviert - und das Drama begann. Es endet mit der Frage:
    Wieso funktioniert der ADC-Kanal 7 bei meinem ATmega328P/TQFP@20MHz fehlerhaft?

    Aufbau:
    Steckbrett mit angeschlossener Experimentierplatine, auf der Huckepack ein arduino-nano-Clone (mit mega328P/TQFP) sitzt. Quarzfrequenz 20 MHz. Labornetzteil, Versorgung 7,5V/max. 1,5A - aktuell Verbrauch rund 47 mA. Der komplette ADC-Port wird auf Eingang konfiguriert, die erwähnten Erscheinungen treten mit und ohne gesetzten internem Pullup auf (noch mehr Grübelgrübel).

    Die übliche Initialisierung:
    Code:
    / ============================================================================= =
    // ===  Initialisierung fuer ADC mega328P/TQFP mit Interrupt 
    //  .. input clock frequency between 50kHz and 200kHz to get maximum resolution ..
    // ===    ADC auf 10 Bit, Interrupt ausgelöst <=> free running
      void ADC_init (void)          // ADC3, free runng, 10 Bit, I-rupt;  Aufruf: main
     {                            //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ADCSRA |= (1<<ADATE);         // Auto Triggering Enable          doc S 307 + 319
      ADMUX  |= (1<<REFS0);         // Referenzspannung ist AVcc                   317
                                    //      AVCC with external capacitor at AREF pin
    //  ADMUX  |= (1<<MUX2)|(1<<MUX1)|(1<<MUX0);      // Wandlung mit ADC7         318
      ADMUX  |= (1<<MUX2)|(1<<MUX1);        // Wandlung mit ADC6                   318
      ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);   // Prescaler = clock/128       320
    //  Prescaler NUR für system clck ==> 83,2 µs, gemessen (Oszi Gould) 83,5 µs
    //                                <=> 12 019,23/sec (6,009 kHz)
      ADCSRA |= (1<<ADIE);          // ADC Interrupt Enable                        319
      ADCSRA |= (1<<ADEN);        // ADC Enable                                  319
      ADCSRA |= (1<<ADSC);            // Free Rung .. to start the first conversion  319
                                    //
      volatile uint8_t  adc3cnt1;   // ADC-Wert wird x mal aufaddiert
      volatile uint8_t  adc3cnt2;   // ADC-Wert wird x mal aufaddiert, nochn Teiler
     }                      // Ende void ADC3_10_init_irupt(void)
    // ============================================================================== =
    Die ISR liest den Wert aus und fängt Fehlfunktionen bei zu niedriger Spannung ab:
    Code:
    // ============================================================================== =
    // ===  ISR für ADC mega328P/TQFP  ============================================== =
    //      Aufruf alle 83,2 µs, siehe oben (gemessen Oszi Gould: 83,5 µs).
      ISR(ADC_vect)                 //
     {                              //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      adc3_dat      = ADC;          // Hole Wert
      adcs          = adc3_dat;     // aktuell ausgelesener Wert wird hier gesichert
    // - - - - - - - - - - - - - - - -
      if (adc3_dat < ADCMMM)        // Mindestspannungsschwelle ADC wählbar beim Start
      {                             // es folgt ein Notstop wegen low battery
        sei();
        uputs0 ("\r\tADC \t\t");    // Melde AKTUELLEN ADC-   I S T   -Wert        inf
        itoa (ADC, abc, 10);        // aktuell (adc-s = sicher) erfasster ADC-Wert
        uputs0 (abc);               //   ... ausgeben                              inf
        uputs0 ("\r\tSTOP");        //
        cli();                      //
        while (1) {}                // Notstop bei Unterspannung
      }                     // Ende if (adc3_dat < ADCMMM)
     }           // Ende ISR(ADC_vect)
    // ============================================================================== =
    Das "Drama":
    Nach anfänglichen Tests mit ADC-Kanal 3 wurde auf den im TQFP verfügbaren Kanal 7 umgestellt, siehe Initialisierungsroutine. Es folgten dauernd Abbrüche (Anmerkung: Mindest-ADC-Wert für Spannungsmessung ist auf 592 gestellt - Variablenname ADCMMM). Gegenprobe mit Kanal 3 lief mit sonst identischem Code fehlerlos. Aktuell ist Kanal 6 angewählt der ebenfalls in der Bauform TQFP verfügbar ist und klaglos funktioniert, wie die frühere Variante auf Kanal 3. Mit einigen Codeänderungen habe ich festgestellt, dass der Kanal 7 bei ansonst identischer Beschaltung/Versorgung statt ADC=763+/-2 nur etwa ADC=560 bringt. Die restlichen Kanäle bringen die genannten Messergebnisse ADC=763+/-1. Die genannten Werte wurden mit einem anderen nanoClone nachgefahren und waren dort innerhalb der hier genannten Toleranzen.

    Die erwähnte Fehlmessung des Kanal 7 existiert auch, wenn im Sekundenabstand zehn Messungen hintereinander erfolgen. Auch dieser Fehler ist auf den den Kanälen 3 und 6 nicht feststellbar.

    Daher obige Frage:
    Wieso funktioniert der ADC-Kanal 7 bei meinem ATmega328P/TQFP@20MHz fehlerhaft?

    Nächste Frage:
    Kennt jemand dieses oder ein ähnliches Problem?

    Danke für Rat, Hilfe und Erklärung.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    897
    Du schreibst: "Es funktioniert generell, aber eben auf der einen Platine nicht". Hast Du mal die Leiterbahn mit nem Ohmmeter/Pieper vom Steckpin bis auf den Controllerpin gemessen? Das kann z.B. eine kalte Lötstelle sein.

    Dann noch etwas: Um Fehler in der Software auszuschließen, kannst Du Dir einmal die Mühe machen und die Messwerte bei variabler Eingangsspannung ausgeben und die Plausibilität über eine lineare Zweipunktegleichung prüfen? (Ich gehe nicht davon aus, dass Dein Code generell nicht funktioniert, aber die Messung gegen AVCC bedingt die entsprechende Kondensatorbeschaltung an ARef und da wäre es einfach schöner, ein Stückchen Quellcode drüberzujagen, das erst einmal generell die Funktion verifiziert, anstatt gleich abzubrechen.)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo oberallgeier
    du benutzt in ALLEN deinen ADC Zugriffen immer die OR Funktion
    ADMUX |= blabla
    da werden ja NIE Bits gelöscht....
    Das funktiniert also nur wenn vorher im Register eine Null drin steht.
    Nach einem Hardwarereset sollte es so ein, aber nach einem Softwarereset
    steht da noch der letzte Wert drin.
    Keine Ahnung ob daraus der Fehler rührt, vermutlich nicht, war mir nur grad aufgefallen.

    Im Datenblatt ATmega328PB Punkt 28.5 stehen einige Problematiken beim Einstellen des MUX Registers.
    Wenn Du das MUX Register einstellst sollte noch kein Interrupt eingeschaltet sein, scheint okay bei Dir
    und die erste Messung muss evtl. verworfen werden.
    könnte es sein, dass der erste Interrupt Dich in die Mindestschwelle führt,
    der Wert aber noch nicht gültig ist.
    Kannts Du den Code so ändern, dass z.B. die Ersten xx Werte ignoriert werden nach der Initialisierung.
    ---
    eben noch was gesichtet:
    Es gibt Unterschiede zwischen den Typen
    ATmega328/P und ATmega328PB
    Dokument AT15007: Differences between ATmega328/P and ATmega328PB

    das betrifft unter anderem wohl auch die Analogeingänge 6 und 7

    ADC7– Port E, Bit 3
    PE3 can also be used as ADC input channel 7.
    Note: ADC input channel 7 uses analog power AVCC
    liegt hier evtl. das Problem

    Noch eine Idee:
    ADC7 liegt beim TQFP direkt neben einem GND .
    Liegt da evtl. etwas Restzinn, so etwas hatte ich auch schon...
    Nochmal richtig reinigen.

    und noch eine:
    Könnte es sein, dass an dem Eingang eine interne Schutzdiode leitend geworden ist und somit Strom wegzieht.
    Das kann man nur prüfen wenn man den Controller tauscht oder ein anderes Board, wenn zur Verfügung, probiert.

    Gibt es bei den Atmels eigentlich keine "Errata Sheets" ? zu jedem PIC gibt es entsprechende Dokumente, was da nicht richtigt funktioniert
    und da ist oftmals so Einiges zu finden.
    Auf der Microchip Seite oder auch im Netz habe ich dazu aber noch nichts gefunden.
    Bei meinen NXP Prozessoren habe ich auch Tage gesucht wegen Ausreißer bei den ADU Werten,
    da stellte sich dann heraus, dass es tatsächlich ein Chipfehler ist, den man mit entsprechendem Code umgehen konnte.
    Beim PIC18F4620 z.B. gibt es 44 Offizelle Fehler die im Errata Sheet dokumentiert sind.
    oder baut Atmel etwa voll funktionstüchtige Chips.....

    Siro
    Geändert von Siro (05.12.2018 um 15:04 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich würde nun erstmal so vorgehen:
    Verbinde deine Messspannung die ja funktionierte wieder mit dem ADU Kanal 3
    und messe mit einem Voltmeter die Spannung an dem Pin.

    Verbinde deine Messspannung nun an ADU Kanal 7
    und messe ebenfalls mit dem Voltmeter die Spannung an dem Pin.
    Dies müssen nun identisch sein.

    Sind sie unterschiedlich ist schon etwas faul.
    Konfiguration der Register, Pullups was auch immer
    oder sogar der Chip defekt.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Liebe Forumskollegen,
    vielen Dank für eure Denkanstöße und Fehlersuch-Empfehlungen. Die Fehlersuche war erfolgreich, alles paletti - im grünen Bereich.

    Du schreibst: "Es funktioniert generell, aber eben auf der einen Platine nicht" ..
    Na ja, ich hatte ja berichtet, dass die genannten Werte bei der Fehlersuche mit einem zweiten, anderen nanoClone nachgefahren wurden, der dieselben Fehler am ADC7 gebracht hatte. NUR am Kanal 7, bei beiden Platinen.

    .. Das kann z.B. eine kalte Lötstelle sein.
    Warm, sehr warm.

    .. Liegt da evtl. etwas Restzinn, so etwas hatte ich auch schon ..
    Noch wärmer.

    Ich würde nun erstmal so vorgehen .. Kanal 3 und messe mit einem Voltmeter die Spannung .. nun .. Kanal 7 .. Dies müssen nun identisch sein ..
    Was sagt der gebildete Bayer: Siro, you made my day. Denn: die Spannungen an den Pinnen der nano-Clone war bei Kanal 0 bis 6 gleich, bei Kanal 7 niedriger.

    Kurze Erläuterung: ich hatte ja zwei Clone getestet (siehe Eingangspost), beide mit denselben Fehlern. Die Clone sitzen huckepack auf einer Experimentierplatine, auf der ich schon mehrere nano-Clon-Projekte aufgebaut und erfolgreich getestet hatte ( :-/ NIE mit ner Wandlung am ADC7 ). ABER - irgendwo war Restzinn oder Schmutz oder halt irgendwas. Jedenfalls zeigte die Spannungsmessung einen deutlichen, reproduzierbaren Unterschied auf beiden Clone-Platinen, sogar auf ner dritten, vorher noch nicht benutzten ! ! Da mal drübergeputzt >>auf der Experimentierplatine<< - und schon läuft alles wie erwartet.

    Sprich: der ADC-Kanal 7 zeigt JETZT denselben Wert wie der Kanal 6 und der denselben Wert wie der Kanal 3 (wenn ich die zu prüfende Spannung anlege), auch das Voltmeter bestätigt die gleiche Spannung an den Pinnen. Danke euch allen!
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Hinweis:

    Das machte mich jetzt doch etwas stutzig. Ich habe nochmal nachgeschaut, weil mir im Hinterkopf feststeckte, dass der Pin7 - bei einer Beschaltung mit einem Spannungsteiler gegen Vcc - identisch zu den andern ADC-Pins versorgt wird und es dennoch zu Abweichungen kommt:

    Zitat Zitat von oberallgeier Beitrag anzeigen
    Mit einigen Codeänderungen habe ich festgestellt, dass der Kanal 7 bei ansonst identischer Beschaltung/Versorgung statt ADC=763+/-2 nur etwa ADC=560 bringt.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    Hinweis: Das machte mich jetzt doch etwas stutzig ..
    Ich versteh den Hinweis nicht. Wo hatte ich mich da unverständlich ausgedrückt? Ich hatte zum Schluss festgestellt
    Zitat Zitat von oberallgeier Beitrag anzeigen
    .. irgendwo war Restzinn oder Schmutz oder halt irgendwas ..
    .. und da ich den Anschluss von nem Spannungsteiler (Arbeitsumgebung Steckbrett und fliegende Leitungen) ohne sonstige Änderungen von einem Eingangspinn des nanoclones auf den nächsten steckte, war ich davon ausgegangen, dass an den Pinnen die gleiche (Eingangs-)Spannung lag. Lag sie wohl nicht, da ein stromhungriges Etwas an der Experimentierplatine auf der dieser Clone aufgesteckt worden war, mehr Energie schluckte als der 10k-10k-Spannungsteiler liefern konnte. Mein Fehler lag darin, dass ich die geänderte Beschaltung nicht nachgemessen hatte und die geänderte Spannung nicht bemerkt hatte.

    ......Bild hier  
    ......© 2018 oberallgeier (höhere Auflösung im Bild verlinkt)

    Alles mittlerweile total unwichtig. Die tatsächliche Spannung an den Eingangspinnen war nachgemessen worden, ein Unterschied war festgestellt worden, die Ursache wurde beseitigt, nun sind gleiche Eingangsspannungen an den ADCpinnen 6 und 7 usw egal welcher Pinn gerade verbunden ist - und die Wandelergebnisse sind gleich ± 1 Digit. Damit ist das Problem (das auf/in/bei der Experimentierplatine lag) beseitigt, Controller und nanoClone funktionieren mit der >entstörten< Experimentierplatine störungsfrei.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich war über "identischer Beschaltung/Versorgung" gestrauchelt und hatte das so interpretiert, dass an den ADC-Pins eben eine definierte Spannung anliegt, denn eine Spannung sollte ja gemessen werden. Also muss ich, zum Vergleich mehrerer ADC-Kanäle dieselbe Spannung anlegen. Also wenn ich andre Werte messe, als ich erwarte, bin ich davon ausgegangen, dass die Spannung die an den Pins ankommt - die kann man auch direkt mit einer Messspitze am IC-Gehäuse abgreifen - identisch ist.

    Ist sie aber nicht gewesen.

    Das das mittlerweile unwichtig ist, ist schon klar. Es sollte auch nur ein Hinweis wegen der Fehlerbeschreibung sein.

    Alles gut!
    MfG

Ähnliche Themen

  1. ATmega8 einfache TasterAuswertung Low/High über ADC7(Pin22)
    Von Ze_ro|Co_ol im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 17.08.2008, 21:25
  2. AVRs mit 16MHz und mit 20MHz
    Von CowZ im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 03.11.2007, 00:25
  3. ATMega644 Fuses (für 20Mhz)
    Von galdo im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 21.06.2007, 00:20
  4. ADC7 an TQFP Atmega8
    Von Bluesmash im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 03.01.2007, 18:52
  5. Pic16F84 mit 20MHz?
    Von Klick_here im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 12.05.2004, 08:47

Stichworte

Berechtigungen

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

Labornetzteil AliExpress