Handhabung AD Wandler

Gast #367019
Lesenswert?

Ich habe eine Frage zum Handling des ADC von einem AT90PWM3:

Ich möchte eine Signal mit 2kHz abtasten und über den ADC wandeln. Die
Abrtastrate gerneriere ich mir über einen Timer Interrupt.

Muss ich den ADC in Single Convertion oder im Dauermode betreiben?

Das Problem im Singe Convertion Mode ist das warten auf ADIF Bit im
ADCSRA Register. Ehe das Bit gesetzt ist, ist der Timer schon wieder
übergelaufen.
Gast #367021
Lesenswert?

Das problem ist, ich muss in der interruptroutine mehrere AD Kanäle
abfragen und eine Berechnung durchführen. Den Timer OVF Löst meine ISR
aus. Du meinst als Tiggersorce für den AD Wandler? Wie handhabe ich das
dann mit mehreren Kanälen? Die können ja nur sequentiell abgefragt
werden.
Gast #367023
Lesenswert?

Ich brauche die Kanäle (es sind 2 Strück) Zeitgleich für die Berechnung.
Das Problem ist, der nächste Timer OVF passiert noch wärend der
Berechnung, weil die AD Wandler zu lange brauchen.

Was wäre denn wenn ich den ADC im Free running mode betreibe und dann
einfach nur aller 500µs den aktuellen Wert auslese und
weiterverarbeite? Würde das funktionieren?
Gast #367024
Lesenswert?

wenn du die dinger gleichzeitig gesampled brauchst dann musst du 2 adcs
haben.. die avrs haben 1nen adc mit nem multiplexer davor...

wenn die samples zeitlich versetzt gemacht werden dürfen dann setz den
timer auf 4khz und sample abwechselnd die kanäle...

das mit dem zu langsamen adc kannst eigentlich nur durch schnellere
adcs kompensieren... ka wie lang so ein channel switch dauert... aber
samplen bis 30ksps sollte für nen avr kein prob sein... vllt hast du
irgendwelche prescaler-werte im adc nicht richtig initialisiert...

73
Gast #367025
Lesenswert?

Ein geringer Zeitversatz ist durchaus denkbar.
Ich stelle mir das folgendermaßen vor:

mein Zeitfenster beträgt 500µs
Der Interrupt wir ausgelöst, und die ISR aufgerufen.
Der erste AD Kanal wird abgefragt,
Der zweite Kanal wird abgefragt,
die Berechnung wird gemacht,
Die Daten werden ausgegeben,
Die ISR verlassen

Der DAC ist schon so initialisiert, dass er mit dem höchsten Tak läuft
im Highspeed Mode.
Persönliche Seite #367026
Lesenswert?

Nein so bringt das nix.

Besser ist:

Der ADC Start wird automatisch vom Timer ausgeführt. (Trigger Source
= Timer OVF, diese Einstellung gibts!)



ADC-ISR wird aufgerufen (Also jedesmal wenn ein Kanal fertig ausgelesen
wurde):

ADC-Daten werden in eine Variable gesichert
Flag für neue Daten wird gesetzt
Abzufragender Kanal wird für nächsten Start umgestellt.
ISR verlassen


mainloop: (Also was der Prozessor im Idle macht)

Prüfen ob Flag gesetzt
Wenn ja:
  Berechnungen durchführen und Sachen ausgeben



So würde ich das machen und so ist es nur eine saubere Programmierung.
Die ISR sollte nur so kurz wie es nur geht sein, damit andere
Interrupts nicht unnötig hinausgezögert oder sogar ausgelassen werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren