PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] ATmega328P, TPFP @20MHz : ADC7 mit falschen Werten



oberallgeier
04.12.2018, 18:56
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:
/ ================================================== =========================== =
// === 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:
// ================================================== ============================ =
// === 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.

Holomino
05.12.2018, 08:16
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.)

Siro
05.12.2018, 10:32
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

Siro
05.12.2018, 14:31
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.

oberallgeier
05.12.2018, 22:42
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!

Moppi
06.12.2018, 05:28
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:


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.

oberallgeier
06.12.2018, 09:05
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
.. 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.

......https://dl.dropbox.com/s/lmf8x6r51ao6gai/DSC04136_mod_15%25.jpg?dl=0 (https://dl.dropbox.com/s/ty8zo85a50krmyp/DSC04136_mod.jpg?dl=0)
......© 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.

Moppi
06.12.2018, 09:28
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