Forum: Compiler & IDEs Handhabung AD Wandler


von Paul (Gast)


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.

von Simon K. (simon) Benutzerseite


Lesenswert?

Du stellst als Triggersource einfach den Timer OVF Interrupt ein.

von Paul (Gast)


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.

von Hans (Gast)


Lesenswert?

musst du wirklich 2khz haben bzw alle syncron einlesen???

ggf. sample mit 2k*anzahl der kanäle schnell und immer nen anderen.. im
endeffekt hast dann pro kanal 2k aber halt versetzt...

73

von Paul (Gast)


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?

von Hans (Gast)


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

von Paul (Gast)


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.

von Simon K. (simon) Benutzerseite


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.

von Simon K. (simon) Benutzerseite


Lesenswert?

@Paul: Im Highspeed Mode bekommt der ADC 200kHz Clocktakt. Damit
erreicht er etwa 20ks/s. Und das sind 10mal mehr als deine 2kHz. Also
irgndetwas stimmt bei dir nicht.

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
Noch kein Account? Hier anmelden.