Forum: Mikrocontroller und Digitale Elektronik mehrkanal AD mit Atmega -> programmablauf


von Erik D. (dareal)


Lesenswert?

Bin gerade dabei einen mehrkanal AD-Wandler für meinen Atmega zu 
realisieren.

Dabei werte ich 6 Kanäle aus. Soweit klingt das ganze jetzt noch recht 
simpel. Ich möchte jedoch für jeden Wert den Mittelwert bilden. Das 
könnte man jetzt für jeden Kanal einzelnd machen, ich möchte das aber 
fortlaufend und gestalten. Soll heißen:

Kanal wird eingelesen, zum Mittelwertspeicher addiert und es wird zum 
nächsten Kanal gewechselt. Für diesen das gleiche, das ganze dann eine 
bestimmte Anzahl an durchgängen und zum schluss werden die Mittelwerte 
gebildet und am LCD ausgegeben.

Das problem hierbei ist für mich: bei der Anzahl der Messwerte muss ich 
schon auf den SRAM zurückgreifen ... was 1. Zeitintensiv ist, viel 
Speicerplatz im Code benötigt und eventuelle sprünge nicht mehr 
realisierbar macht (RJMP).

Gibt es da möglicherweise tricks bzw. routinen, die das erleichtern?


Um Register zu sparen rechne ich derzeit lediglich 64 Messwerte hoch, 
womit ich beim Summierspeicher nur zwei Register benötige.

Damit komme ich auf 12 Register allein für die Messwerte.


Hier mal ein Codeschnipsel von einem Kanal.
1
sample_ch0:
2
  sbi    ADCSRA, ADSC
3
4
wait_ch0:
5
  sbic  ADCSRA, ADSC
6
  rjmp  wait_ch0
7
8
9
; ADC einlesen
10
 
11
  in    adlow, ADCL
12
  in    adhigh, ADCH
13
  lds    temp1, ch0l
14
  lds    temp2, ch0h
15
  add    adlow, temp1
16
  adc    adhigh, temp2
17
  sts    ch0l, adlow
18
  sts    ch0h, adhigh

Allein das holen der Messwerte und abschließende Abspeichern kostet 8 
Cycles und 4 zeilen im Programmcode.

von Marius W. (mw1987)


Lesenswert?

Ich würde das ganze über einen Interrupt machen.

Dann kannst du während der schon den nächsten Wert aufnimmt, den 
aktuellen Wert bearbeiten. Somit nutzt du die Zeit während der Wandlung.

Da der AD-Wandler bis maximal 200 kHz geht hast du schon einigen 
Freiraum.

MfG
Marius

von Dussel (Gast)


Lesenswert?

Wieso musst du auf den SRAM zurückgreifen? Für sechs Kanäle wären das 
sechs Register plus eins, das den aktuellen Wert hat. Dann einfach zu 
dem entsprechenden Register den aktuellen Wert addieren und fertig. Mal 
davon abgesehen, weißt du, wie langsam der ADC ist im Vergleich zur CPU? 
Wenn du das alles während der nächsten Wandlung berechnest sollte das 
kein Problem geben.

von AVRFan (Gast)


Lesenswert?

>Das problem hierbei ist für mich: bei der Anzahl der Messwerte muss ich
>schon auf den SRAM zurückgreifen ... was 1. Zeitintensiv ist, viel
>Speicerplatz im Code benötigt und eventuelle sprünge nicht mehr
>realisierbar macht (RJMP).

Hast Du denn einfach alles mal sauber durchgerechnet?  Taktfrequenz des 
Controllers, RAM-Größe, Anzahl der ADC-Kanäle, gewünschte 
Aktualisierungsrate, Mittelung über soundsoviele Werte... aus diesen 
Daten sollte sich doch eine brauchbare Vorhersage kalkulieren lassen, ob 
Dein Controller die gewünschten Anforderungen bewältigen kann.

Speicherplatz im Code?  Das ist doch nur ein Problem, wenn Du den Platz 
anderweitig benötigst, oder kein Controller mit mehr Platz verfügbar 
ist.  Ansonsten: Benutzen und fertig.

Zeitintensiv?  Solange der Controller mit seiner Arbeit rumkommt, ist es 
egal, ob er 10 % oder 90 % der Zeit ausgelastet ist.

Einen Codeabschnitt, der 100 Taktzyklen benötigt, kann ein mit 8 MHz 
getakteter Controller theoretisch 80000 mal pro Sekunde ausführen. Ich 
finde, das ist eine ganze Menge.  Angenommen, Dein Codeabschnitt zur 
Mittelwertbildung verschlingt 1000 Zyklen, muss 6 mal ausgeführt werden 
muss (6 Kanäle), und Deine Aktualisierungsrate ist 50/s - wie groß ist 
die dadurch verursachte Prozessorlast bei 8 MHz Taktfrequenz? Richtige 
Antwort: Nur 3.75 %.

>Damit komme ich auf 12 Register allein für die Messwerte.

Wenns mit Registern eng wird, kann man sie auf dem Stack zwischenlagern 
(push/pop).

>Allein das holen der Messwerte und abschließende Abspeichern kostet 8
>Cycles

8 Instruktionen meinst Du.  Cycles sinds ein paar mehr.

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.