PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC Wandlerproblem mit ATmega32



ACsenf
19.01.2006, 12:32
Hallo zusammen!
Ich habe eine Anwendung in der 4 analoge Spannungen relativ schnell erfasst werden müssen um darauf zu "regeln". Es wird ein Pulsmuster erzeugt und in der Zeit, wärend der Timer läuft wird gemessen. Passt auch wunderbar!
Nun zum Problem ich habe den ADC im Free runing mode konfiguriert starte ihn einmal und mache dann in einem Sub

v=getadc(0)
w=getadc(1)
.
.
X=getadc(3)

gemessen wird zwar bei allen, aber nur adc 0 ist genau, bei den anderen 3 Eingängen erhalte ich zu stark schwankende Werte!

Laut Datenblatt muss ja beim Multiplexen definitiv die laufende Messung abgeschlossen sein, bevor umgeschaltet wird! Nur wie geht das mit Bascom? Wegen der extremen Ungenauigkeit ist die Auswertung so nicht brauchbar. Also ist die bisher verwendete Konfiguration wohl Mist...
Wenn ich die Eingänge in einem Testprogramm einzeln teste, misst jeder gleich gut, also liegt es wohl an dem Ablauf im Programm nur wie geht dem?

Danke schonmal für eure Hilfe

Gruß

Sven

JanB
19.01.2006, 13:13
Hallo,
du kannst in Free-Running-Mode nicht einfach den Kanal wechseln.
Dann musst du zumindest abwarten bis mit dem neuen Kanal mindestens
eine komplette Wandlung abgelaufen ist.
Warum benutzt du die free-running-Betriebsart ?
In deinem Anwendungsfall wäre es doch besser,
zuerst den gewünschten Kanal einzuschalten,
dann eine AD-Wandlung zu starten und nach Ablauf
das Ergebnis zu lesen.

Gruß Jan

ACsenf
19.01.2006, 13:43
Hallo Jan,

das wäre eigentlich auch mein Ziel, allerdings stehe ich etwas dem Schlauch, wie das mit Bascom umzusetzen ist. Single mode ist kein problem!
Würde das so klappen: single mode usw...bla bla

start adc
v=getadc(0)
stop adc

start adc
w=getadc(1)
stop adc

usw...

macht das Bascom dann richtig? Oder muss ich die Bits laut Datenblatt setzen?

Gruß

Sven

JanB
19.01.2006, 16:13
Hi Sven,
versuchs mal so:

-------------
dim V0 as word, V1 as word, V2 as word

config adc = Single , Prescaler = Auto

start adc

V0=getadc(0)
V1=getadc(1)
V2=getadc(2)

stop adc
--------------


Gruß Jan

felack
20.01.2006, 11:45
Versuch doch mal folgendes:

v=getadc(0)
w=getadc(1)
w=getadc(1)
x=getadc(2)
x=getadc(2)
y=getadc(3)
y=getadc(3)

Dann wird nach dem Kanalwechsel erst ein Wert eingelesen, der aber nicht benutzt wird. Der nächste Wert sollte dann stimmen.

felack