Forum: Mikrocontroller und Digitale Elektronik Messwerterfassung


von Name (Gast)


Lesenswert?

Hallo Leute,

Ich messe mit dem internen ADC eines ATMega32 die Spannung eines 
Drucksensorsals 10-bit-Werte.
Hierzu wird in der ADC-ISR erst der nächste Kanal eingestellt und die 
nächste Messung angestoßen und anschließend der Messwert abgeholt und 
gemittelt.

Nun möchte ich ohne die ADC-ISR wesentlich zu verlängern die Messwerte 
als Rohwerte ausgeben.

Ein einfaches Print in der ISR vervielfacht die Dauer um Potenzen, ein 
Flag und Ausgabe in Main führt aufgrund der sehr langen Durchlaufzeit 
der Main-Loop im Verhältnis zu den ADC-Interrupten ebenfalls zu 
Datenstau.

Ein Byte des Messergebnisses in der ADC-ISR ins UDR schreiben würde 
gehen, aber da alle Timer für PWM und einer 1-ms-Takterzeugung genutzt 
werden, finde ich noch keinen Trigger zur Ausgabe des zweiten Bytes.

f_cpu = 12,288 MHz
ADC_Prescaler = 64
baud = 115200

Zusammengefasst: Wie lassen sich die Messwerte des ADC in nahezu 
free-run-Geshwindigkeit ohne externe Hardware über eine Messdauer von 
3-4 Sekunden an einen PC übertragen.


Danke

von Weingut P. (weinbauer)


Lesenswert?

hmmm ... du kannst den PWM-Timer auch als Timer nutzen, der bei Überlauf 
ne ISR auslöst,

Wie überträgst Du die Werte? als String "512" mir CR-LF oder Byteweise?
letzteres kann nochmal Zeit ersparen ist nur ätzend zu synchronisieren 
...

Zwischenpuffern ... evtl. externes RAM-dran als Zwischenspeicher ...

Möglichkeiten sind vielfältig

von Udo S. (urschmitt)


Lesenswert?

Wie überträgst Du?
Normalerweise macht man sich einen Ringpuffer, in den schreibst du rein 
wenn du Daten hast, und der Interrupt deines UART sogt dafür, daß das 
nächste Byte gesendet wird, wenn das vorige weg ist - zumindest falls 
noch eins im Ringpuffer ist.
Sonst übernimmt das Senden die Schreibe Funktion zum Schreiben in deinen 
Ringpuffer.

von Name (Gast)


Lesenswert?

Hallo,

ich habe gerade gesehen, dass es einen USART Data Register Empty 
Interrupt gibt - dieser wäre genau der Trigger für das zweite Datenbyte.

In diesem sende ich nun das zweite Byte und schalte eigentlich den 
Interrupt enable UDRIE wieder aus.

Aktuell habe ich aber noch falsche Ausgaben...ich sende testweise nur 
{48} und {49} bekomme aber viel mehr 1er als 0er raus.

Über das Synchronisieren habe ich mir noch gar keine Gedanken gemacht.

von MaWin (Gast)


Lesenswert?

> Wie lassen sich die Messwerte des ADC in nahezu
> free-run-Geshwindigkeit ohne externe Hardware über
> eine Messdauer von 3-4 Sekunden an einen PC übertragen.

In dem du eine ausreichend schnelle Schnittstelle wählst,
du hast etwa 30000 Bytes pro Sekunde zu übertragen.

Da der gewählte AVR weder Ethernet noch USB noch sonst
eine schnelle Schnittstelle hat, war er wohl die falsche
Wahl, denn das LPT Parallelport fehlt inzwischen den
meisten PCs.

Und da du externe USB oder Ethernet-Controller nicht
nachrüsten willst, hast du dir den Weg verbaut, es doch
noch zu lösen.

Wenn dir das
> finde ich noch keinen Trigger zur Ausgabe des zweiten Bytes
Probleme macht (kurz mal zu deiner Erinnerung: Dein PC enthält
genau einen Timer und hat keine Schwierigkeit damit, es an
dutzenden Stellen blinken zu lassen), sehe ich schwarz, daß du
eine verschachtelte Lösung programmieren kannst, die wenigstens
das Vorhandene optimal ausnutzt. Über die serielle Schnittstelle
wäre sonst wohl 115kbps, also 10000 Byte poo Sekunde schaffbar.

Du schreibst von PWM und sonstigem, welches du nicht ausreichend
erklärst, aber Daten wandlen und senden braucht weder Interrupts
noch Resourcen ausserhalb der Hauptschleife. Da keine Sau weiß
in welcher Programmiersprache du dein Programm schreibst, hier
im Pseudocode:

ENDLOSSCHLEIFE
  WENN DatenGesendet
    kanal=(kanal+1)%KANAELE
    DatenGesnedet=FALSE
    ADC starten
  WENN ADCfertig UND SendePufferLeer
    Sende ADC Ergebnis
    DatenGesendet=TRUE

von Udo S. (urschmitt)


Lesenswert?

MaWin schrieb:
> In dem du eine ausreichend schnelle Schnittstelle wählst,
> du hast etwa 30000 Bytes pro Sekunde zu übertragen.

Hmm, wo liest du das? Ich habe nirgends eine Aussage wie oft wieviel ADC 
kanäle gelesen werden.
Nur die 1mS für takterzeugung. Wenn er damit 8 Kanäle wandelt dann hat 
er 16000 Byte an Rohdaten und damit allerdings zu viel für die 115200 
Baud.

Ist wie immer: Würmer aus der Nase ziehen.

von Alex (Gast)


Lesenswert?

Wie schnell läuft Dein ADC? Wären es 30kHz, bekämst Du alle 33µs einen 
neuen Wert. Mit Baudrate 115200 dauert die Uebertragung eines Bytes 
87µs. - Da 10 Bit nicht in 1 Byte gehen bräuchtest Du 2 Byte.

Also musst Du die Baudrate erhöhen oder die Wandlungsrate verkleinern. 
Oder Dir etwas tolles einfallen lassen. (Z.B. in einem Nipple die 
Änderung zum vorherigen Wert übertragen, dann kannste mit 8 Bit 2 
"Werte" übertragen, aber dann darf die Änderung auch nicht zu groß sein)

Ähm naja.

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.