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.
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.
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
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?
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
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.
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.