Forum: Mikrocontroller und Digitale Elektronik Benötigte Rechenleistung bestimmen/abschätzen


von Timo (Gast)


Lesenswert?

Hallo zusammen,
ich entwickele gerade eine SChaltung mit der ich Analogwerte zwischen 0 
und 5V mit einer Maximalen Frequenz von 10Khz abtasten und über USB an 
den Computer senden möchte.
Dazu verwende ich als ADC einen AD9071, als µC einen ATmega88 und als 
Pegelwandeler fürs USB eine FT232R.
Soweit so gut und einfach. Nun würde ich mir alternativ zur 
Datenübertragung an den PC, die maximale Amplitude gemittelt über einige 
Perioden, auf einem LCD display ausgeben. Dazu wären neben der 
Bestimmung der Amplitude auch noch eine Rechnung a la y=x^2+bx+c 
notwendig.
Die Abtastrate müsste laut Abtasttheorem ja mindestens 20kHz betragen.

Nun stellt sich mir die Frage ob der µC mit den ganzen Aufgaben nicht 
leicht überfordert ist. Allein die Bestimmung der Amplitude dürfte ja 
einiges an Aufwand kosten und eh nach Umsetzung auch mehr oder weniger 
viel Speicher beanspruchen! Mir fällt schwer die benötigte 
Rechenleistung zu abzuschätzen. Kann mir da vllt jemand zur Seite 
springen und mir zumindest eine größenordnung nennen?

von blablub (Gast)


Lesenswert?

25kHz Abtastfrequenz, 20MHz Takt --> 800 Takte zwischen zwei Samples. 
Wenn man es klug anstellt (2**n Samples --> Division=Bitshift usw) 
sollte das imho klappen. Ein Versuch ist es auf jeden Fall wert.

von blablub (Gast)


Lesenswert?

Achso, mit wie vielen Bits pro Wert soll gerechnet werden? Wenn man 
float nimmt wird das garantiert nichts...

von Ingo (Gast)


Lesenswert?

Das wird eng, du musst ja die Messwerte auch noch holen, du hast ja kein 
DMA. Also ich würde auf n STM32F4 gehen.

von i-Troll (Gast)


Lesenswert?

>Bestimung der Amplitude ....

Was soll'das denn ? Die kommt ja gleich so aus'm ADC raus.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Timo schrieb:
> Die Abtastrate müsste laut Abtasttheorem ja mindestens 20kHz betragen.
Aber nicht die Anzeigerate! Und deshalb kannst du ja schnell wandeln, 
aber schön langsam rechnen und anzeigen...

> Allein die Bestimmung der Amplitude dürfte ja einiges an Aufwand kosten
Du meinst das Umrechnen des AD-Werts auf eine Spannung? Das tut man 
auch gar nicht. Sondern man rechnet solange wie möglich in Ganzzahlen 
mit dem AD-Wert und skaliert erst zur Anzeige auf Volt um.

> Analogwerte zwischen 0 und 5V
> Dazu verwende ich als ADC einen AD9071, als µC einen ATmega88 und als
> Pegelwandeler fürs USB eine FT232R.
Wozu ein externer Wandler, wenn der ATmega schon viele davon hat, die 
den angegebenen Bereich super können?

von Carsten R. (kaffeetante)


Lesenswert?

Das sollte kein Problem für einen AVR darstellen.

Aber was willst Du eigentlich?

Zuerst schreibst Du, Du willst mit maximal 10 KHz abtasten und dann 
wiederum laut Abtasttheorem mit 20 KHz arbeiten.

Oder willst du ein 10 KHz Signal mit 20 Kilosamples/Sekunde abtasten?

10 Kilosamples/Sekunde würde der Atmega selber schaffen, ohne externen 
ADC.

Dann kommt die Art des Signals. Wie willst Du da die Amplituden mitteln? 
Wenn es etwas wie ein Sinus oder Sägezahn oder ähnlich ist, dann ist es 
leicht. Dann brauchst Du immer nur mit dem Vorgänger zu vergleichen 
(wenig Rechenleistung und wenig Speicherbedarf). Wenn das Signal aber so 
vor sich hinzittert, gilt dann jeder Richtungswechsel als 
Minimum/Maximum? Oder läuft das Signal zitternd zwischen den eigentlich 
gemeinten Minima und Maxima auf und ab. Das wäre dann etwas mehr 
Rechnerei, je nachdem was genau du suchst. Ein "Sinus" welcher nahe des 
Maximums zittert würde dort mit dem primitiven Vergleich haufenweise 
Minima und Maxima produzieren und somit deine Amplitudenmittelung völlig 
schrotten.


Was soll das mit der Gleichung?
y=x^2+bx+c

Das sieht für mich nach einer Formel für Temperaturfühler aus. Willst Du 
die Amplitude der Messwerte Mitteln oder willst Du die Amplitude der 
Ergebnisse der Formel, angewand auf die Messwerte, ermitteln?

Geht es nur um die genannte Amplitudenmittelung wäre im ersteren Fall 
die Berechnung nach Formel nicht nötig, allenfalls am Ende zur 
Übersetzung und Darstellung des Ergebnisses. Auch im zweiten Fall würde 
es reichen erst die Maxima und Minima zu bestimmen und dann die Formel 
nur auf die Maxima und Minima anzwenden und nicht auf alle Messwerte. 
Dann hinge der Aufwand von der Anzahl der Minima und Maxima ab, also der 
"Frequenz" des abzutastenden Signals, womit wir wieder bei Frage eins 
sind.

Selbst wenn es am Ende Float werden soll, da der Wandler "nur" ein 
10-Bit-Signal liefert, so reicht es zunächst nur mit Integer zu rechnen 
und dann erst am ende nach Float zu casten, es sei den Du hast noch 
anderes mit den Daten vor was eine sofortige Wandlung nach float 
erforderlich machen würde. Ein bisschen Nachdenken bei der Sortierung 
der Berechnungsreihenfolge im Code bewirkt oft Wunder und oftmals sogar 
wesentlich mehr als beispielsweise der Unterschied zwischen 
verschiedenen Sprachen oder der Sprung zum nächstgrößeren 
Mikrocontroller ausmachen würde. Umgekehrt bedeutet das aber auch:

Solange Dein Algorithmus noch nicht steht, und erst recht nicht so lange 
noch nicht bekannt ist was Du eigentlich alles berechnen willst, läßt 
sich der Rechenaufwand für den Prozessor kaum bis gar nicht 
progostizieren. Echte Aufwandabschätzungen erfolgen erst anhand eines 
konkreten Algorithmus. Alles andere ist wirklich nur eine Schätzung.

Gruß

Carsten

von Fallobst (Gast)


Lesenswert?

Ingo schrieb:
> du hast ja kein DMA. Also ich würde auf n STM32F4 gehen.

Wieder mal die STM32F4 Fanboys...

DMA würde bei diesem Projekt kaum Rechenzeitersparnis bringen.

von Arc N. (arc)


Lesenswert?

Timo schrieb:
> Hallo zusammen,
> ich entwickele gerade eine SChaltung mit der ich Analogwerte zwischen 0
> und 5V mit einer Maximalen Frequenz von 10Khz abtasten und über USB an
> den Computer senden möchte.
> Dazu verwende ich als ADC einen AD9071, als µC einen ATmega88 und als
> Pegelwandeler fürs USB eine FT232R.

Wozu da einen 100000000 Samples/s ADC (100 MSps) einsetzen, der bei 
Vollast gut 3 Watt benötigt etc.?

von Axel S. (a-za-z0-9)


Lesenswert?

Meine Güte, sind denn nur Lestighaniker hier zugange? Signalfrequenzen 
bis 10kHz, heißt abtasten mit mindestens 20kHz. Nehmen wir mal 25kHz an 
und einen 16-Bit-ADC, dann geht es letztendlich darum, 50KB/s vom ADC 
zum USB zu schaufeln. Gerechnet wird da gar nix, vielleicht noch ein 
bisschen Padding oder Timestamps in den Datenstrom streuen. Da grinst 
selbst ein 8-Bit AVR nur müde. Der USB sowieso.

OK, ich hab jetzt weder den ADC gecheckt, ob der in Punkto Abtastrate 
und Auflösung paßt. Noch bin ich mir sicher, ob der FT232R einen 
geeigneten Übertragungsmodus beherrscht. Das sind Hausaufgaben, die der 
TE doch bitte selber machen soll.

Aber wenn es einen virtuellen COM Port Modus mit 460,8 kBit/s geben 
sollte, dann reicht das schon. Sonst halt irgendein isochroner 
Transfermodus. Die Hälfte des Problems liegt ja ohnehin PC-seitig.


XL

von i-Troll (c) (Gast)


Lesenswert?

Der groessere Teil des Problems liegt im PC. Was macht man mit diesen 
Daten? Auch wenn man sie auf die Disk schreiben kann ... was dann?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Timo schrieb:
> und 5V mit einer Maximalen Frequenz von 10Khz abtasten ...
> die maximale Amplitude ...
> Die Abtastrate müsste laut Abtasttheorem ja mindestens 20kHz betragen.
Noch was: du kannst mit den theoretischen 20kHz nicht sicher die 
Amplitude eines 10kH Signals abtasten. Auf jeden Fall garantiert nicht 
in jeder Halbwelle. Hier einfach mal mit einem Dreiecksignal:
1
Signal 10kHz:
2
7       /\              /\              /\              /\       
3
       /  \            /  \            /  \            /  \      
4
      /    \          /    \          /    \          /    \     
5
     /      \        /      \        /      \        /      \     
6
    /        \      /        \      /        \      /        \   
7
   /          \    /          \    /          \    /          \  
8
  /            \  /            \  /            \  /            \ 
9
0/              \/              \/              \/              \
10
11
    |      |      |      |      |      |      |      |      |             
12
    |      |      |      |      |      |      |      |      |             
13
    2      5      1      7      0      6      2      3      3 
14
15
Abtastung >20kHz
Fazit: in 4 Zyklen gerade 1x die Amplitude erwischt...

von Timo (Gast)


Lesenswert?

Erst mal danke für die vielen Antworten!
War gestern nach 10 Stunden am PC scheinbar etwas übermüdet und 
unaufmerksam! Daher erstmal einige klarstellungen:
>Arc Net schrieb:
>Wozu da einen 100000000 Samples/s ADC (100 MSps) einsetzen, der bei
>Vollast gut 3 Watt benötigt etc.?
Da hast du vollkommen recht, daher benutze ich auch den AD7091R! 
Zahlendreher;)
Die hohe Abtastrate (Ich benötige nicht wirklich 1MSps, wäre sicher auch 
sehr schwer zu händelt, denke ich;)) um das Signal für die 
PC-Verarbeitung möglichst genau aufzunehmen, daher auch 12bit!

>Axel Schwenke schrieb:
>Meine Güte, sind denn nur Lestighaniker hier zugange? Signalfrequenzen
>bis 10kHz, heißt abtasten mit mindestens 20kHz. Nehmen wir mal 25kHz an
>und einen 16-Bit-ADC, dann geht es letztendlich darum, 50KB/s vom ADC
>zum USB zu schaufeln. Gerechnet wird da gar nix, vielleicht noch ein
>bisschen Padding oder Timestamps in den Datenstrom streuen. Da grinst
>selbst ein 8-Bit AVR nur müde. Der USB sowieso.
Da sehe ich auch gar kein Problem! Habe 12bit und würde eig. auch gern 
mit 50-100kHz abtasten und weiterleiten an USB! Das sollte laufen!! Ist 
aber auch nicht meine Frage gewesen, die Anzeige auf einem LCD ist hier 
die frage, dann muss ich auch nicht unbedingt was an den PC senden.


>Lothar Miller schrieb:
>Aber nicht die Anzeigerate! Und deshalb kannst du ja schnell wandeln,
>aber schön langsam rechnen und anzeigen...
Exakt!

>Carsten R. schrieb:
>Aber was willst Du eigentlich?

>Zuerst schreibst Du, Du willst mit maximal 10 KHz abtasten und dann
>wiederum laut Abtasttheorem mit 20 KHz arbeiten.
Mein Fehler!
Signalform: Sinus
Frequenz max.: 10kHz
Abtastrate: allermindesten 20kHz (wegen Amplitudenbestimmung eher 
deutlich mehr)

Hatte das so geplant:
Amplitude bestimmen nach Schema:
Wenn nachfolgender Wert größer, diesen Speicher und mit dem nächsten 
vergleichen! Das solange durchführen bis der Wert fällt! Wenn meine 
Messung bzw. der Sinus leicht zittert müsste man das noch mal 
überdenken!

Das 10-50 mal und Wert mittel! Um das ganze etwas genauer zu bekommen 
und Messfehlereinflüsse zu verringern.

Dann muss der Wert vor der Ausgabe noch umgewandelt werden, ich benötige 
hier allerdings nicht die Spannung sondern einen Sensorwert! Dazu muss 
die Spannung umgerechent werden, die Formel steht noch nicht ganz wird 
aber wohl a la y=x^2+bx+c aussehen.

Was würdet Ihr sagen, langt die Rechenleistung des µCs? Die Ausgabe an 
das Display kann auch nur alle 100-200ms erfolgen, das würde reichen! 
Trotzdem muss natürlich konstant gewandelt werden und die Amplitude 
bestimmt werden;)

von Stefanie B. (sbs)


Lesenswert?

Lothar Miller schrieb:
>
1
> Signal 10kHz:
2
> 7       /\              /\              /\              /\
3
>        /  \            /  \            /  \            /  \
4
>       /    \          /    \          /    \          /    \
5
>      /      \        /      \        /      \        /      \
6
>     /        \      /        \      /        \      /        \
7
>    /          \    /          \    /          \    /          \
8
>   /            \  /            \  /            \  /            \
9
> 0/              \/              \/              \/              \
10
> 
11
>     |      |      |      |      |      |      |      |      |
12
>     |      |      |      |      |      |      |      |      |
13
>     2      5      1      7      0      6      2      3      3
14
> 
15
> Abtastung >20kHz
16
>

Hehe, Ein Dreieckssignal hat starke Oberwellen im Spektrum.
Wenn also schon die Grundschwingung (das Dreieck) mit 10kHz schwingt, 
sind die Oberwellen weit drüber. ;)

von Kai S. (kai1986)


Lesenswert?

Hallo,

die 800 Taktzyklen pro Datenpunkt, die dir bei 25kSps und 20MHz Takt zur 
Verfügung stehen könnten ausreichen, allerdings muss das Programm dafür 
meiner Einschätzung nach gut durchdacht sein. Ich bin mir auch nicht 
sicher, ob C mit Optimierung ausreicht, oder ob es in ASM geschrieben 
werden muss.

Da das Signal eine bekannte Form und eine feste Frequenz hat und 
scheinbar wirklich nur der Spitzenwert interessant ist könnte man das 
Signal auch analog aufbereiten und dann nur für die Anzeigewerte den 
fertigen Analogwert mit dem ADC erfassen (vergleichbar einer 
Wechselspannungsmessung mit einem Multimeter).

Gruß Kai

von Arc N. (arc)


Lesenswert?

100 kHz * 12 Bit = 1200 kBit/s, da das SPI-Modul keine "krummen" 
Transfers kennt, laufen 100 kHz * 16 Bit = 1600 kBit/s = 200 kByte/s 
über SPI.
20 MHz / 200 kByte/s = 100 Taktzyklen
Wenn die Daten über USB rausgehen sollen, kann es durchaus sein, dass 
u.U. ein Teil der Daten zwischengespeichert werden muss bis sie gesendet 
werden dürfen. Soll mit Interrupt gearbeitet werden, muss auch dort der 
Overhead miteinberechnet werden...

von spess53 (Gast)


Lesenswert?

Hi

>100 kHz * 12 Bit = 1200 kBit/s, da das SPI-Modul keine "krummen"
>Transfers kennt, ... .

Das SPI-Modul nicht. Aber die USART im SPI-Mode. Da sollte der TO evtl. 
mal über einen ATMega164P mit 2 USARTs nachdenken.

MfG Spess

von Timo (Gast)


Lesenswert?

>spess53 schrieb:
>Das SPI-Modul nicht. Aber die USART im SPI-Mode. Da sollte der TO evtl.
>mal über einen ATMega164P mit 2 USARTs nachdenken.

In meiner Leichtsinnigkeit bin ich davon ausgegangen das ich mir meine 
Daten von ADC einfach per SPI hole und dann per Uart an den FT232R 
weitergebe. Auf die Gefahr das, dass jetzt peinlich wird: dachte die 
Module würden unabhängig voneinander laufen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefanie B. schrieb:
> Ein Dreieckssignal hat starke Oberwellen im Spektrum.
Naja, sooo stark sind die auch nicht. Siehe mal die Spektren dort:
http://public.beuth-hochschule.de/~s33688/ue4.php
Nur ein Sinus hat weniger Oberwellen... ;-)

Und ich wollte damit eigentlich nur zeigen, dass die doppelte 
Abtastfrequenz zu Amplitudenbestimmung nicht ausreicht. Und es ist 
einfacher zu zeichnen, deshalb schrieb ich auch:
>>> Hier einfach mal mit einem Dreiecksignal

von spess53 (Gast)


Lesenswert?

Hi

> Auf die Gefahr das, dass jetzt peinlich wird: dachte die
>Module würden unabhängig voneinander laufen...

Wenn du SPI und USART meinst hast du Recht. Aber die USART des ATMega88 
(und anderer neueren ATMegas) können auch als SPI konfiguriert werden 
(SPI-Mode).

Allerdings habe ich das 'krumme' im Beitrag von Arc Net (arc) 
fälschlicher weise auf den SPI-Takt bezogen. Er meint aber die Anzahl 
der Datenbits. Eine USART im SPI-Mode würde durch die Pufferung der Ein- 
und Ausgangsregister aber geringfügig schneller als das SPI-Modul sein.

MfG Spess

von Timo (Gast)


Lesenswert?

>Lothar Miller schrieb:
>Und ich wollte damit eigentlich nur zeigen, dass die doppelte
>Abtastfrequenz zu Amplitudenbestimmung nicht ausreicht. Und es ist
>einfacher zu zeichnen, deshalb schrieb ich auch:
>>>> Hier einfach mal mit einem Dreiecksignal
Da hast du vollkommen Recht! Deswegen sprach ich auch von einer 
MINDESTENS Abtastfrequenz von 20kHz. Um das sauber zu gestalten müsste 
ich wohl doch deutlich höherfrequent abtasten.

>spess53 schrieb:
>Allerdings habe ich das 'krumme' im Beitrag von Arc Net (arc)
>fälschlicher weise auf den SPI-Takt bezogen. Er meint aber die Anzahl
>der Datenbits. Eine USART im SPI-Mode würde durch die Pufferung der Ein-
>und Ausgangsregister aber geringfügig schneller als das SPI-Modul sein.
Müsste doch mit dem standart SPI-Modul die ADC-Daten "locker" 
rüberschaufeln können? Wozu also zwei Usart? Das erschließt sich mir 
noch nicht!

von Arc N. (arc)


Lesenswert?

spess53 schrieb:
> Hi
>
>>100 kHz * 12 Bit = 1200 kBit/s, da das SPI-Modul keine "krummen"
>>Transfers kennt, ... .
>
> Das SPI-Modul nicht. Aber die USART im SPI-Mode. Da sollte der TO evtl.
> mal über einen ATMega164P mit 2 USARTs nachdenken.

Mit krumm meinte ich 12-Bit bzw. 13-Bit wie vom AD-Wandler minimal 
benötigt. Die USARTs können bei den AVRs afaik auch nur 8-Bit oder 
16-Bit-Transfers...
Praktisch wäre das RSPI der RX200, das könnte zum einen auch 9, 10, 
11-Bit etc., zum anderen könnte über den Puls-Generator das Startsignal 
generiert werden und über den Data Transfer Controller / Event Link 
Controller der Rest der Datenübertragung automatisiert werden (bräuchte 
man da nicht, da der passende 12-Bit, 1 MSPS AD-Wandler schon eingebaut 
ist...).
Ähnliches sollte auch mit den AVR XMega gehen.

Edit:
> Wozu also zwei Usart? Das erschließt sich mir noch nicht!
USARTs deshalb, da diese direkt 16-Bit-Werte übertragen können, würde 
einen Interrupt/einen Test einsparen.

von spess53 (Gast)


Lesenswert?

Hi

>Müsste doch mit dem standart SPI-Modul die ADC-Daten "locker"
>rüberschaufeln können? Wozu also zwei Usart? Das erschließt sich mir
>noch nicht!

Ich will dich doch nicht zu zwei USARTs zwingen. Aber ich hatte oben 
schon geschrieben, das in deinem Fall eine USART im SPI-Mode 
komfortabler zu bedienen ist wie das SPI-Modul.

Um deine 12 Bit abzuholen must du per SPI zwei Byte 'senden' um den Takt 
zu erzeugen. Bei der USART im SPI-Mode kannst du die beiden Byte 
faktisch unmittelbar hintereinander in den Transmitpuffer schaufeln. 
Beim SPI-Modul mußt du warten bis das erste gesendet wurde und das 
Empfangsregister auslesen bevor du das zweite Byte losschicken kannst. 
Eine USART im SPI-Mode kann zwei empfangene Bytes puffern. Damit kannst 
du du den Zeitpunkt des Auslesens selbst festlegen.

MfG Spess

von J.-u. G. (juwe)


Lesenswert?

spess53 schrieb:
> Eine USART im SPI-Mode kann zwei empfangene Bytes puffern.

Echt? Ich dachte bisher, die Doppelpufferung gibt es nur in 
Senderichtung und beim Empfang muß das erste Byte aus dem Empfangspuffer 
geholt werden, bevor das zweite vollständig "reingetaktet" wurde.

von Timo (Gast)


Lesenswert?

Danke für die vielen Antworten!
Ich werd mir das mit dem USART im SPI-Mode noch mal durch den Kopf gehen 
lassen.

mfg
Timo

von Hubtau (Gast)


Lesenswert?

ATMega88A: The USART in MSPIM mode includes (double) buffering of the 
transmitter. The SPI has no buffer.

von J.-u. G. (juwe)


Lesenswert?

Hubtau schrieb:
> ATMega88A: The USART in MSPIM mode includes (double) buffering of the
> transmitter.

Das weiß ich. Es ist aber nichts davon zu lesen, dass das bei dem 
Receiver auch so ist.

von Spess53 (Gast)


Lesenswert?

Hi

>Das weiß ich. Es ist aber nichts davon zu lesen, dass das bei dem
>Receiver auch so ist.

Datenblatt ATMega88:

19. USART0

19.2 Overview

...The Receiver is the most complex part of the USART module due to its 
clock and data recovery
units. The recovery units are used for asynchronous data reception. In 
addition to the recovery
units, the Receiver includes a Parity Checker, Control logic, a Shift 
Register and a two level receive buffer (UDRn).
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

20. USART in SPI Mode

20.2 Overview

...the USART in Master SPI Mode (MSPIM) logic. In this mode of operation 
the SPI master control
logic takes direct control over the USART resources. These resources 
include the transmitter and receiver shift register and buffers, and the
baud rate generator.        ^^^^^^^^                    ^^^^^^^^

Noch Fragen?

MfG Spess

von J.-u. G. (juwe)


Lesenswert?

Spess53 schrieb:
> Noch Fragen?

Nein.
Vielen Dank für Deine Mühe. Werde ich bei Gelegenheit mal ausprobieren.

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.