Hallo,
habe ein mysteriöses, sporadisches, aber reproduzierbares Problem:
Meine ATmega32-Anwendung verwendet ADC-Ports PA2 und PA3, die über RS232 abgefragt werden können. Wenn die Spannungen an beiden Ports stark unterschiedlich sind, liefern die getadc(3) und getadc(4)-Abfragen so etwa alle 100..200 Messungen (Zeit zwischen den Abfragen über die Serielle 20..50 ms) ein falsches Ergebnis: Beim kleineren Wert in positiver Richtung, beim größeren Wert in negativer Richtung. Sind beide Eingangsspannungen gleich, treten keine (oder nur vernachlässigbare) Störungen auf.
Mit importierter Integrate-Funktion (,int2) wirds massiv schlimmer. Systick auf 1 oder 10 ms -- kein Unterschied. Mittlere ADC-Vorteiler bringen leichte Besserung, in den Extremen (8, 128) wird es wieder schlimmer.
Das Problem tritt in verschiedenen Schaltungs-Designs (c't-Lab ops: ), sowohl in QFP- als auch DIL-Version, auf; mangelnde Abblockung der Vcc- und AVcc-Spannungen kann ich ausschließen -- hat alles nichts gebracht. Ich sperre keine Interrupts, als einzige Besonderheit werden PA0 und PA1 als Inkrementalgeber-Ports benutzt.
Offensichtlich ein Problem des ATmega-internen Multiplexers (Settling Time?) oder des Treibers -- den möchte ich aber nicht vorschnell beschuldigen. Deshalb meine Frage: Hat jemand schon einmal diese Phänomen beobachtet und womöglich sogar eine Lösung parat?
cm
(hier noch die Defines)
Import SysTick, TWImaster, ADCport, SerPort, IncrPort4, LCDmultiPort;
from System import float;
Define
ProcClock = 16000000; {Hertz}
TWIpresc = TWI_BR400;
LCDmultiPort = I2C_TWI;
LCDTYPE_M = 44780; // 44780 oder 66712;
LCDrows_M = 2; //rows
LCDcolumns_M = 8; //chars per line
IncrPort4 = PinA, 1, 32; // pin-reg used, channels, 16 or 32bit integer
IncrScan4 = Timer1, 4; // timer used, scan rate 1kHz (1..100)
SysTick = 1; //msec
SerPort = 38400, Stop1, timeout; {Baud, StopBits|Parity}
RxBuffer = 255, iData;
TxBuffer = 255, iData;
StackSize = $0080, iData;
FrameSize = $0100, iData;
ADCchans = [3..5], iData, int2;
ADCpresc = 64;
habe ein mysteriöses, sporadisches, aber reproduzierbares Problem:
Meine ATmega32-Anwendung verwendet ADC-Ports PA2 und PA3, die über RS232 abgefragt werden können. Wenn die Spannungen an beiden Ports stark unterschiedlich sind, liefern die getadc(3) und getadc(4)-Abfragen so etwa alle 100..200 Messungen (Zeit zwischen den Abfragen über die Serielle 20..50 ms) ein falsches Ergebnis: Beim kleineren Wert in positiver Richtung, beim größeren Wert in negativer Richtung. Sind beide Eingangsspannungen gleich, treten keine (oder nur vernachlässigbare) Störungen auf.
Mit importierter Integrate-Funktion (,int2) wirds massiv schlimmer. Systick auf 1 oder 10 ms -- kein Unterschied. Mittlere ADC-Vorteiler bringen leichte Besserung, in den Extremen (8, 128) wird es wieder schlimmer.
Das Problem tritt in verschiedenen Schaltungs-Designs (c't-Lab ops: ), sowohl in QFP- als auch DIL-Version, auf; mangelnde Abblockung der Vcc- und AVcc-Spannungen kann ich ausschließen -- hat alles nichts gebracht. Ich sperre keine Interrupts, als einzige Besonderheit werden PA0 und PA1 als Inkrementalgeber-Ports benutzt.
Offensichtlich ein Problem des ATmega-internen Multiplexers (Settling Time?) oder des Treibers -- den möchte ich aber nicht vorschnell beschuldigen. Deshalb meine Frage: Hat jemand schon einmal diese Phänomen beobachtet und womöglich sogar eine Lösung parat?
cm
(hier noch die Defines)
Quote
Import SysTick, TWImaster, ADCport, SerPort, IncrPort4, LCDmultiPort;
from System import float;
Define
ProcClock = 16000000; {Hertz}
TWIpresc = TWI_BR400;
LCDmultiPort = I2C_TWI;
LCDTYPE_M = 44780; // 44780 oder 66712;
LCDrows_M = 2; //rows
LCDcolumns_M = 8; //chars per line
IncrPort4 = PinA, 1, 32; // pin-reg used, channels, 16 or 32bit integer
IncrScan4 = Timer1, 4; // timer used, scan rate 1kHz (1..100)
SysTick = 1; //msec
SerPort = 38400, Stop1, timeout; {Baud, StopBits|Parity}
RxBuffer = 255, iData;
TxBuffer = 255, iData;
StackSize = $0080, iData;
FrameSize = $0100, iData;
ADCchans = [3..5], iData, int2;
ADCpresc = 64;