Forum: Mikrocontroller und Digitale Elektronik Integrator, zeitdiskret


von Peter (Gast)


Lesenswert?

Hallo zusammen,

ich möchte gerne ein Eingangssignal auf einem uC oder auch normalen 
Linux integrieren.

Geht dies wenn ich keine "Zeitinformation" habe, die mir die Zeit nach 
letztem Aufruf gibt?

Oder gibt es hier möglichkeiten dies herauszubekommen?

Beispiel wäre Eingangssignal = dezimal 5 ergibt nach einer Sekunde dann 
5, nach zwei 10 usw... Summieren kann ich, aber wie bekomme ich den Wert 
pro Zeiteinheit?


Vielen Dank, Peter

von Benjamin S. (recycler)


Lesenswert?

In jedem System gibt es eine "Uhr"
Bei Linux kannst sie mit time() aufrufen.

Bei einem µC rufst du den Timer periodisch auf und speicherst die 
"Ticks" ab.
Dann kannst du den wert durch die Zeit teilen.

von Peter (Gast)


Lesenswert?

Hallo,

danke für die rasche Antwort,

aber time() unter Linux gibt ja die zeit in Sekunden an, soweit ich 
weiss= damit dürfte ich keine chance haben, die Zeit zwischen zwei 
Aufrufen des Integrators zu ermitteln, oder?

Gruss, Peter

von Benjamin S. (recycler)


Lesenswert?

Es gibt noch sowas wie microtime().
Da musst du nachsehen. Da sollte aber ein Highprecitiontimer laufen oder 
richtiges Realzeitbetriebsystem bzw. eine entsprechende Erweiterung. 
Weil sonst kannst du dir nicht sicher sein, dass auch zu jeder Sekunde 
der IRQ kommt sondern z.B. jede 1.1Sekunden und dann wieder 0.9. Das nur 
als Beispiel.

von Benjamin S. (recycler)


Lesenswert?

http://www.digipedia.pl/man/microtime.9.html

aus <sys/time.h>
1
void getmicrotime(struct timeval *tv);
2
void getnanotime(struct timespec *tsp);

von Peter (Gast)


Lesenswert?

Super, Danke!

bin dann auch auf dieses gestossen:

struct timespec time1, time2;
clock_gettime( CLOCK_REALTIME, &time1 );
//Com_Init();
usleep(1000);
clock_gettime( CLOCK_REALTIME, &time2 );
printf( " A: time1: %d time2: %d, diff_sec: %d\n", time1.tv_sec, 
time2.tv_sec, time2.tv_sec-time1.tv_sec  );
printf( " A: time1: %d time2: %d, diff_nsec: %d\n", time1.tv_nsec, 
time2.tv_nsec, time2.tv_nsec-time1.tv_nsec  );

von ... (Gast)


Lesenswert?

Zuviel Rechenzeit ? Was spricht dagegen in einem Timertask (interrupt) 
zu addieren ?

IntegratorWert:=IntegratorWert + ADCWert;

von Peter (Gast)


Lesenswert?

Das dürfte aber nur auf einem uC ordentlich und nicht unter Linux 
funktionieren, oder?

von ... (Gast)


Lesenswert?

Linux hat sicher auch einen Tick.

von Benjamin S. (recycler)


Lesenswert?

Linux hat eine höhere Abstraktionsebene und genaue Ticks bekommst du 
durch Overhead des Schedulers nicht gescheit, ausser mit einer 
Realzeiterweiterung, und das nur annähernd.

von ... (Gast)


Lesenswert?

Naja. Indem man irregulaer distant gesampelte Werte integriert macht 
man's besser als gar nicht. Falls man zur Ermittlung des Intervalls 
allerdings
 Zeiten subtrahiert, verplempert man viel Rechenzeit. Ein Murks. Jeder 
ATTiny macht das besser.

von Benjamin S. (recycler)


Lesenswert?

Das stimmt mit dem µC, besonders wenns um Genauigkeit geht.
Aber Peter wollte wissen, wie man unter Linux die Zeit abfrägt :)

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.