Forum: Mikrocontroller und Digitale Elektronik A/D Wandlung


von Frank (Gast)


Lesenswert?

Hallo,
beschäftige mich seit kurzer Zeit mit allgemeiner Assambler
Programmierung und bin im Moment auf ein Problem gestossen, dass ich
nicht ganz alleine lösen kann.
Deshalb wende ich mich an Euch. Und zwar möchte ich 3 verschiedene
Sensoren, mit unterschiedlichen Abtastfrequenzen mit einem internen A/D
Wandler eines MC in digitale Werte wandeln.
Habe schon gelesen wie das funktioniert und welche Ports und Register
man dazu benutzen muss (bei nur einem analogen Eingang).
Habe auch gelesen das man mit Hilfe eines Multiplexer zwischen den
analogen Eingengen switchen kann.
Mein Problem ist das ich nicht weiss wie ich das mit unterschiedlichen
Abtastfrequenzen der Sensoren regeln soll. Einfach wäre es ja wenn alle
Sensoren die selbe Abtastfrequenzen hätten dann würde man immer
nacheinander die input Ports abrufen aber wie macht man das mit
untersciedlichen Abtastfrequenzen? hatte schon jemand das Problem und
kann mir paar Tips geben, denke das es irgendwie mit Timern geregelt
werden muss aber habe keine Erfahrung wie man das am besten anstellen
soll.

Frank

von Clemens (Gast)


Lesenswert?

Hallo Frank,

wenn dein AVR genug Time besitzt, kannst du jeden Timer anders
einstellen, und somit in jeder Overflowroutine eine andere Frequenz
erhalten.

Du kannst - für "krumme" Frequenzen - das Timer-Counter-Register auch
direkt nach dem Aufruf der Overflowroutine mit einem negativen Wert
initialisieren. Dann Zählt der Timer nur bis null und nicht bis 256!
Dadurch lässt sich z.B. aus einem 4Mhz-Quarz eine 125-Hz-Frequenz
erzeugen: 4000000 / 256 (prescaler) / 125 = 125

Der Code müsste etwa wie folgt aussehen:

Ovfx:
       in r0, SREG
       ldi r16, -125
       out TCNTx, r16
       ;behandlung ...

       out SREG, r0
       reti

Natürlich musst du entsprechend die Register sichern!

Schöne Grüße, Clemens

von Rahul (Gast)


Lesenswert?

Nabend.
Ich habe jetzt noch nicht praktisch mit dem Problem auseinandergesetzt.
Ich würde eine Zeitsteuerung mit einem Timer realisieren.
Dazu würde ich einen Timer reglemässig überlaufen lassen.
In der ISR würde ich dann für jeden Sensor eine Variable herunterzählen
lassen.Im Hauptprogramm wird dann überprüft, ob eine Variable = 0 ist
und dann entsprechend den AD-Wandler anschmeissen.
Natürlich muß auch die Variable auf den Anfangswert gesetzt werden.

Halt so als Idee...
Gruß Rahul

von Frank (Gast)


Lesenswert?

Hallo,
also mit den Timern realisieren.
Leider verstehe ich den Code von Clemens nicht, vielleicht paar
kommentare was da wirklich passiert, wie gesagt habe bis jetzt nicht
mit Assambler programmiert und habe mir die standart Befehle angeschaut
wie movlw,..............usw.

Das mit den Variablen ist eine gute Idee, was mache ich den wenn ich 2
gleiche Abtastfrequenzen habe und noch 2 unterschiedliche, z.B.:
Sensor 1: f=8 kHz
Sensor 2: f=8 kHz
Sensor 3: f=1 kHz
Sensor 4: f=60 Hz

Dann würde sich doch der timer für Sensor 1 und 2 gleichzeitig melden
und was macht man dann?
ruft den einen ab und die anderen Daten gehen verloren?
Kann ja auch gut sein das die anderen Sensoren sich auch noch
irgendwann genau bei der selben Zeit melden wie die anderen und
dann??????

HILFEEEEEEEEEEE

von Michael Wilhelm (Gast)


Lesenswert?

Setz den Interrupt für Sensor 1 und Sensor 2 auf 4 KHz und toggel ein
Bit. Wenn das Bit 0 ist aktiviere Sensor 1 auslesen und setzte es dann
auf 1. Nach dem nächsten 4KHz Interrupt wird Sensor 2 ausgelesen, setze
das Bit auf 0 ...

MW

von Michael Wilhelm (Gast)


Lesenswert?

Muß natürlich 16KHZ heißen.

MW

von Frank (Gast)


Lesenswert?

OK,
das ist eine gute Idee, aber komme ich dann nicht irgendwann mit den
den anderen Sensoren in die quere?

Möchte ein System das ich vorher Konfigurieren kann, d.h. die Sensoren
werden von Fall zu Fall anders gewählt je nach Applikation. Bei 2
gleichen Abtastfrequenzen würde das so funktionieren wie der Michael
Wilhelm sagte, aber wie wäre es jetzt mit 3 gleichen Sensoren und einem
unterschiedlichen, da kann man ja nicht mehr die doppelte bzw. dreifache
frequenz dann nehmen da ich nur 2 unterschiedliche Kontroll Bits (0 und
1) zur Unterscheidung zwischen Sensor 1 und 2 habe und so bleibt Sensor
3 auf der strecke. oder?

von Michael Wilhelm (Gast)


Lesenswert?

Wenn du einen Timer so konfigurierst, daß er 32000 mal in der Sekunde
überläuft, kannst du verschiedene Vorteiler einsetzen, um die Aktion zu
erzwingen, die du möchtest. Z.B. Vorteiler 2. um Sensor 1 und 2 zu
bedienen, einen Vorteiler von 32 um sensor 3 zu bedienen,... Du mußt
die Vorteiler nur so konfigurieren, daß pro Überlauf nur ein Sensor
gemessen wird. Wobei, so ganz genau erschließt sich mir der Sinn nicht,
daß, wenn ich die Rechenzeit habe, ich einen Sensor relativ selten
abfrage. Ich würde es so machen: Timerüberlauf auf 32KHz, eine
Laufvariable inkrementieren, wenn 1-Sensor 1, wenn 2-Sensor 2, wenn
3-Sensor 3, wenn 4-Sensor 4 und Variable auf 1. Was spricht dagegen?
Die Analogspannungen liegen doch eh am Controller an.

MW

von Frank (Gast)


Lesenswert?

Hallo,
verstehe das nicht ganz.

1.
>Wenn du einen Timer so konfigurierst, daß er 32000 mal in der Sekunde
>überläuft, kannst du verschiedene Vorteiler einsetzen, um die Aktion
>zu erzwingen, die du möchtest. Z.B. Vorteiler 2. um Sensor 1 und 2 zu
>bedienen, einen Vorteiler von 32 um sensor 3 zu bedienen,... Du mußt
>die Vorteiler nur so konfigurieren, daß pro Überlauf nur ein Sensor
>gemessen wird.


das mit den Vorteiler, der generiert mir doch nur ein anderen Takt und
ich kann mir mit Hilfe dessen ein Timer bauen, richtig?


2.
>Ich würde es so machen: Timerüberlauf auf 32KHz, eine
>Laufvariable inkrementieren, wenn 1-Sensor 1, wenn 2-Sensor 2, wenn
>3-Sensor 3, wenn 4-Sensor 4 und Variable auf 1. Was spricht dagegen?

verstehe diesen Ansatz nicht.


bitte um verständnis

mfg
Fraank

von Arno (Gast)


Lesenswert?

Hallo,
wenn mehrere Sensoren die gleiche Abtastrate haben, lässt man alle
AD-Wandlungen direkt hintereinander ablaufen. Ich verstehe diese
Klimmzüge mit 16 und 32 kHz Timern nicht.
Dann ist der Haupttakt hier 8kHz und beim ersten Aufruf werden alle
Werte gewandelt. Somit habe ich eine Zeitreferenz und kann über
Zähler/Timer die anderen Sensoren abfragen.
Arno

von Frank (Gast)


Lesenswert?

Hallo,
also habe nochmal die Postings von Michael gelesen und die Idee und
ablaufweise habe ich jetzt auch verstanden also bei 3 gleichen Sensoren
den timer quasi immer so stellen das er in einem Takt von 3* die
Abtastfrequenz des Sensors ausgelöst wird. dann eine Variable (Sensor
NR.) die immer inkrementiert wird und so die drei Eingänge immer
abfragt..
wie ich es jetzt in assambler umsetze weiss ich noch nicht ganz genau
aber denke das wird schon.


Leider stört mich da noch was und zwar das mit den anderen kleineren
Abtastfrequenzen. Habe keine Erfahrung mit MC deshalb denke ich das die
möglichkeit doch irgendwann besteht, das die Timer für die schnellen
Abtastraten und kleineren Abtastraten irgendwann zusammen ausgelöst
werden, was passiert dann??
Störzt der MC ab oder macht ihm das nichts?
was ist mit den Daten die von den anderen Eingängen gleichzeitig kommen
müssten??

mfg
Frank
gehen diese verloren??

von Andi (Gast)


Lesenswert?

Das hängt alles davon ab wie gut (intelligent) Du das programmieren
wirst.
Man muß auch noch bedenken, das der ADC-Teil eine gewisse Zeit für ein
ADC-Sample benötigt also muß quasi ein Status-Bit abgefragt werden.
Bisher hast Du uns noch nicht verraten, mit welchem µC Du das ganze
machen möchtest. movlw kenn ich nicht. Ist das PIC?

MfG
Andi

von Frank (Gast)


Lesenswert?

Möchte das so intelligent programmieren, dass keine Daten verloren gehen
und das mit den wandeln alles hinhaut.

Richtig erkannt, habe über PICs gelesen und diese erschienen mir für
mein Vorhaben ideal. Weiss aber noch nicht welchen PIC genau ich
benutzen soll, deshalb auch nur allgemeine Fragen.

Das mit der Erholungszeit nach der Wandlund ist mir auch gewiss,
deshalb die frage, was passiert wenn die Timer sich mal beide melden
usw...........siehe oben.

Frank

von Andi (Gast)


Lesenswert?

So wie ich das aus den bisherigen Vorschlägen sehe sind das nicht
mehrere (Hardware-) Timer sondern nur einer.
Das ganze mußt Du in dem einen Timer (16KHz?) dann alles mit Variablen
(Werte in Speicherzellen) abhandeln wann auf welchen Sensor
umgeschaltet wird und wohin ein ADC-Wert geschrieben wird.
Allerdings wünsche ich Dir viiiiel Spaß mit den PIC´s.
Die Dinger haben schon einen sehr eigenwilligen ASM-Diallekt mit dem
ich selber nie was zu tun haben möchte.

MfG
Andi

von ...HanneS... (Gast)


Lesenswert?

Tip am Rande:

Versuche auch, vorausschauend zu programmieren.
Also die ADC-Quelle (Eingangsmultiplexer) nicht erst umschalten, wenn
du das Ergebnis brauchst, sondern schon nach der vorhergehenden
Messung. Das spart Zeit.

...

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.