Hallo, ich hab bei der ADC-Messung am ATTINY45 das Problem, dass die Messreihe gelegentlich absurde Ausreißer hat, die sogar oberhalb des 12Bit Maximalwertes liegen. Die CPU läuft mit internem Takt, ohne /8 Teilung, also 8 MhZ. Als Messport word tatsächlich der Reset-Pin verwendet, die entsprechende Fuse ist geändert (sonst bekäme der Prozessor ein Dauer-Reset). Woran könnte das liegen? Gibt es einen eleganteren Weg, auf das erreichen eines Schwellwertes zu reagieren? Hier die relevanten Code-Fragmente (gcc): a) Initialisierung beim Systemstart: DDRB &= ~(_BV(5)); ADCSRA = _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64) | _BV(ADIE); // Interrupts erzeugen ADMUX=_BV(REFS1); // Interne 1.1V Referenzspannung b) Starten der Messreihe ADCSRA |= _BV(ADEN) // ADC Einschalten | _BV(ADSC); // Erste Messung starten c) Auswertung static volatile uint16_t LastADC=0; ISR(ADC_vect) { // Wert auslesen LastADC=ADC; // Wert bearbeiten ... // nächste Messung starten ADCSRA |= _BV(ADSC); }
Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den Tiny in den Noise Reduction Sleep Mode schicken. Oder: Analog Komperator (weiß nicht ob der Tiny45 das hat)
Läubi Mail@laeubi.de wrote: > Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den > Tiny in den Noise Reduction Sleep Mode schicken. Den "noise reduction" sleep kann ich leider nicht gebrauchen, da der Timer weiterlaufen muss. > Oder: Analog Komperator (weiß nicht ob der Tiny45 das hat) Kann man da die Vergleichsspannung softwaremäßig einstellen? Die Beschreibung im Datenblatt sieht mir ehr danach aus, dass zwei externe Spannungen verglichen werden.
>Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den >Tiny in den Noise Reduction Sleep Mode schicken. Das ist Paranoia. Nur bei Controllern mit aktivierter, hoher Eingangsverstärkung und sehr schnellen Meßintervallen macht das wirklich Sinn. Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der Meßquellen hift auch der Noise-Reduction-Mode nicht.
> Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der > Meßquellen hift auch der Noise-Reduction-Mode nicht. Wie hoch darf denn der Widerstand sein? Zum Schutz vor Spannungsspitzen leite ich das Signal über einen 2k2 Widerstand und leite mit einer Z5.1 Diode ab.
>und leite mit einer Z5.1
Wird der ADC nicht schon zerstört wenn die Spannung über der
Referenzspannung liegt ?
Travel Rec. wrote: >>Wichtig: KEINE! Schaltvorgänge während der ADC messung, am besten den >>Tiny in den Noise Reduction Sleep Mode schicken. > > Das ist Paranoia. Nur bei Controllern mit aktivierter, hoher > Eingangsverstärkung und sehr schnellen Meßintervallen macht das wirklich > Sinn. Bei unsauberem / fliegendem Layout oder zu hohen Impedanzen der > Meßquellen hift auch der Noise-Reduction-Mode nicht. Wieso Paranoia??? Es steht explizit im Datenblatt das Schalten während der ADC Wandlung das Ergebnis verfälscht! Und der Tiny hat nunmal nur einen Port! ----- 19.7.2 Analog Noise Canceling Techniques [...] c. If any port pins are used as digital outputs, it is essential that these do not switch while a conversion is in progress. ----- Eventuell hilft aber auch die 2.56V Referenz mit einem Kopelkondesator schon weiter: ----- The Internal voltage reference of 2.56V can optionally be externally decoupled at the AREF (PB0) pin by a capacitor, for better noise performance. ---- Ansosnten isses mir halt auch egal, war ja nur ein Hinweis... Ich hab zumindest bei meinem Tiny auf die weise keine Probleme :P
Christian Ulrich wrote: >>und leite mit einer Z5.1 > > Wird der ADC nicht schon zerstört wenn die Spannung über der > Referenzspannung liegt ? Nein. --> Siehe Datenblatt. Alles > Aref resultiert in einem Maixmalen ADC Wert...
@ Läubi Mail@laeubi.de (laeubi) >Wieso Paranoia??? Es steht explizit im Datenblatt das Schalten während >der ADC Wandlung das Ergebnis verfälscht! Die Frage ist immer. Um WIEVIEL wird die Messung verfäslcht. MfG Falk
Läubi Mail@laeubi.de wrote: > c. If any port pins are used as digital outputs, it is essential that > these do not switch while a conversion is in progress. Die Messfehler treten auch dann auf, wenn kein Portbit umgeschaltet wird.
> Mach doch mal einen Schaltplan :-)
Kommt als Anhang. Es sollten alle relevanten Teile drauf sein.
Hi >..absurde Ausreißer hat, die sogar oberhalb des 12Bit >Maximalwertes liegen. Der ATTiny45 hat nur einen 10-Bit-ADC. Beim Überschreiten der Referenzspannung kommen auch nur $3FF. Wenn du wirklich Werte >$FFF hast, stimmt noch etwas anderes nicht. MfG Spess
Ich hab die Taktfrequenz auf 1MHz gesenkt, danach scheint das Problem nichtmehr aufzutreten. Zusätzlich hab ich alledings jetzt nurnoch eine 8-Bit-Messung drin und den Free-Running-Modus eingeschaltet.
>Ich hab die Taktfrequenz auf 1MHz gesenkt, danach scheint das Problem >nichtmehr aufzutreten. Zusätzlich hab ich alledings jetzt nurnoch eine >8-Bit-Messung drin und den Free-Running-Modus eingeschaltet. Vielleicht solltest du, wenn du dem Problem wirklich auf die Spur kommen möchtest, immer nur eine Variable gleichzeitig verändern... Ansonsten stehst du beim nächsten Mal wieder vor dem gleichen Problem. Schöne Grüße, Alex
Kann das mal sein, daß Du dem ADC gar keinen Vorteiler mitgegeben hast? Der ADC darf, egal wie schnell der Controller läuft, nur maximal 250kHz schnell laufen, damit noch eine 10-Bit Genauigkeit erreicht werden kann. Bei 8-Bit kann der ADC bis 500kHz getaktet werden.
Ich würde noch gerne die Codestelle sehen, wo Du die Daten von LastADC im Hauptprogramm ausliest. Bedenke, dass es sich hierbei um eine 16-Bitzahl handelt, die vom AVR nicht mit einer atomaren Operation (quasi nicht in einem Rutsch) kopiert werden kann. Daher könnte LastADC im ungünstigen Moment aus zwei verschiedenen Messwerten bestehen (Obere und untere 8 Bit). Wenn hier ein Übertrag bei 8 Bit stattfindet, gibt's in der Tat schöne Ausreisser. Es kann aber nicht erklären, warum die Messwerte größer als 0x3FF sind. In jedem Fall muss sich das Hauptprogramm irgendwie mit dem Interrupt synchronisieren, z.B. mit einem pfiffigen Flag.
Travel Rec. wrote: > Kann das mal sein, daß Du dem ADC gar keinen Vorteiler mitgegeben hast? > Der ADC darf, egal wie schnell der Controller läuft, nur maximal 250kHz > schnell laufen, damit noch eine 10-Bit Genauigkeit erreicht werden kann. > Bei 8-Bit kann der ADC bis 500kHz getaktet werden. Mit ADCSRA = _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64) sollte eigentlich ein Vorteiler gesetzt werden.
Probier's mal mit
1 | ADCSRA |= _BV(ADPS2) | _BV(ADPS1) // Eingangstakt 125 kHz (FCPU/64) |
^ Hatte mit dem neuesten WinAVR und dem _BV schon Probleme.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.