Hallo Ich würde gerne alle 20ms die Wandlung des Eingangssignales am ADC beginnen. DAmit dies tatsächlich alle 20ms erfolgt, habe ich diese Zeit mit Hilfe des Timers0 ermittelt (gibt Interrupt bei Overflow und setzt dann das ADC enable bit). ADC ist im "single conversion mode". Muss nun der Clock des Timers oder der des ADC größer sein, oder müssen die Frequenzen annähernd gleich sein? mfg Peter
Die Clock des ADC muss höher sein, damit der ADC bis zur nächsten Wandlung fertig ist.
Das hängt doch von den anderen Einstellungen ab! Der "Clock" an sich hat damit nix zu tun. Timer 0 braucht (Wenn es sich denn um einen AVR-µC und damit um einen 8-Bit-Timer handelt) je nach Einstellung bis zu 256 Zyklen (TCNT0-Anfangswert 0x00) für nen Überlauf, der ADC im Normalfall 13 Zyklen bis er fertig ist! Solange Du nicht mitteilst, wie Du Timer und ADC konfiguriert hast, kann dir da keiner sinnvolle Infos liefern. Ansonsten einfach im Datenblatt nachlesen. Da steht drin, wie viele Taktzyklen wofür gebraucht werden. Abgesehen davon sollte die Wandlung nicht mit zu niedrigem Takt durchgeführt werden. Also ruhig versuchen, den ADC so zu konfigurieren, dass der Takt im Bereich 100-200 kHz liegt. Die 20 ms Abstand zwischen den Wandlungen sind für den Controller ne verdammt lange Zeit. Das ist völlig unkritisch. Vielleicht kannste es Dir noch einfacher machen, wenn Du den ADC im Auto Trigger Mode betreibst. Kannst Dir dann u.U. ne ISR sparen! Gruß Johnny
#define ADC_VREF_TYPE 0x60 void init_ADC() { // ADC initialization // ADC Clock frequency: 62,500 kHz // ADC Voltage Reference: AVCC pin // ADC High Speed Mode: Off // ADC Single Conversion ADMUX=ADC_VREF_TYPE; ADCSRA=0x8E; SFIOR&=0xEF; } void init_Timer0() { // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: CTC top=OCR0 // OC0 output: Disconnected ASSR=0x00; TCCR0=0x02; TCNT0=0x05; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x03; ETIMSK=0x00; } ich verwende den Atmega128 (ist nicht im atmega103 kompatibilitätsmodus) mfg Peter
>>>
Ich würde gerne alle 20ms die Wandlung des Eingangssignales am ADC
beginnen. DAmit dies tatsächlich alle 20ms erfolgt, habe ich diese
Zeit
mit Hilfe des Timers0 ermittelt (gibt Interrupt bei Overflow und setzt
dann das ADC enable bit).
ADC ist im "single conversion mode".
<<<
Wenn du automatische Triggerung aktivierst, kann der ADC automatisch
eine Umwandlung machen, wenn der Timer-Interrupt kommt. Du bräuchtest
den Timer also nur auf die 20ms einstellen und auto-conversion
aktivieren. Wenn du dann noch den Interrupt für die beendete Umwandlung
aktiviert hast, hast du im sauberen Raster von 20ms in der ISR vom
ADC-Interrupt deine neuen Werte.
> Wenn du automatische Triggerung aktivierst, kann der ADC > automatisch eine Umwandlung machen, wenn der Timer-Interrupt > kommt. Nein, das hat mit dem Timer-Interrupt nichts zu tun. Bei automatischer Triggerung wird einfach immer, sobald der ADC mit einer Wandlung fertig ist, die nächste gestartet.
Die ADC-Auto-Conversion kann an den Timer-Interrupt gehängt werden. Hab ich bereits gemacht, daher weiß ich das.
Hmm, bei welchem µC? Ich hab sowas bisher nicht gesehen, aber villeicht ist das ein Feature, das nur die neueren oder größeren können?
Der ATMEGA32 kann das zB. Vermutlich kann das dann fast jeder AVR. Hab noch einen Screenshot angehängt, damit du siehst nach was du suchen musst im Datenblatt.
Ahja, cool. Ich hab bisher nur mit AVRs gearbeitet, die das alle nicht zu haben scheinen. Gut zu wissen, daß es sowas gibt. Danke.
You are welcome :-) Das geht mir in letzter Zeit aber auch ständig so, dass ich auf irgendwelche Features stoße von denen ich noch nie was gehört habe. Irgendwie verwende ich auch immer nur die AVRs, mit denen ich am meisten Erfahrung habe ^^
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.