Forum: Mikrocontroller und Digitale Elektronik Sinus in 0-100% umrechnen


von L(S)inus (Gast)


Lesenswert?

Hallo zusammen,

auf Arbeit möchte ich Ein/Ausgangskarten vom Prozessleitsystem testen, 
bevor sie in die laufende Anlage eingebaut werden. Es geht um zwei Typen 
von E/A-Karten, einmal 4 Analogeingänge und 4 Analogaugänge und einmal 8 
Analogeingänge. Zum Testen habe ich jeweils die 4 Ausgänge auf die 
Eingänge zurückgeführt und für die andere Karte die auch die 4 Ausgänge 
auf die Eingänge 1&5, 2&6, 3&7 und 4&8 zurückgeführt. Das klappt auch 
prima.
Nun möchte ich aus den Ausgängen ein Sinus Signal raus geben. Welches 
man dann an den Eingängen wieder sehen kann. Im Leitsystem wollte ich 
folgendes programmieren:

z.B. Ausgang 1 = 100 * sin(2π*(0bis100%=Eingang1/100)

Ausgang wir ausgegeben und gleich wieder als Eingang 1 eingelesen.

Wenn ich die Gleichung in Excel berechnne kommt auch ein Sinus raus aber 
wenn ich mir den Trend vom Aus- oder Eingang ansehe ist das nicht 
wirklich ein Sinus obwohl der Messwert nur Werte zwischen 0 und 100% 
annimmt.

Die allgemeine Form der Funktion ist ja folgende:
f(x)=a*sin(b*(x-c)+d)              (a und b dürfen nicht 0 werden)
wobei man mit:
a die Funktion senkrecht streckt (x-Achse)
b die Funktion waagerecht streckt (y-Achse)
c die Funktion waagerecht verschieben (y-Achse)
d die Funktion senkrecht verschieben (x-Achse)

Was mache ich verkehrt? Normalerweise wird die Berchnung, die Ausgabe 
und Eingabe jeweils mit 1 Sekunde ausgeführt. Wenn ich auf den Eingang 
einen Filter lege wird das Signal gedämpft, wenn er groß (mehrere 
Sekunden größer 10) genug ist bekomme ich eine Linie bei 50% im Trend. 
Es scheint also so als ob die Ausgabe ein Signal ist und es nur nicht 
richtig im Trend angezeigt werden kann. Ein Oszi hatte ich noch nicht 
dran. Der Sinus sollte zwischen 0 und 100% pendeln wenn eine Periode 10 
Sekunden dauert reicht das ja, das müsste im Trend problemlos angezeigt 
werden können.

von foobar (Gast)


Lesenswert?

> f(x)=a*sin(b*(x-c)+d)

Hier ist "d" eine Phasenverschiebung.

Entweder:
  f(x)=a*(sin(b*(x-c))+d)
oder:
  f(x)=a*sin(b*x-c)+d

Bei d=0 wird f natürlich auch negativ - können das deine DACs/ADCs? 
Falls f auch Werte zwischen 0 und 100 liefern soll, muß a=50 und d=1 
resp d=a sein.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

L(S)inus schrieb:

> f(x)=a*sin(b*(x-c)+d)              (a und b dürfen nicht 0 werden)

> d die Funktion senkrecht verschieben (x-Achse)

Sicher? Also zum einen war zu meiner Schulzeit die senkrechte Achse im 
Koordinatensystem die Y-Achse. Und wenn Du mit der Addition von d den 
Funktionswert in der Vertikalen verschieben willst, dann sollte d nicht 
im Argument der Sinus-Funktion stehen...

Grüßle
Volker

von Wolfgang (Gast)


Lesenswert?

L(S)inus schrieb:
> f(x)=asin(b(x-c)+d)

Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von 
Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast 
jeder Unsinn möglich.

von Dirk B. (dirkb2)


Lesenswert?

Wolfgang schrieb:
> L(S)inus schrieb:
>> f(x)=asin(b(x-c)+d)
>
> Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von
> Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast
> jeder Unsinn möglich.

Schau mal, ob bei dir das „sin(b“ kursiv (oder fett) ist.
Dann liegt es am Formatsyntax des Forums.

von Wolfgang (Gast)


Lesenswert?

Dirk B. schrieb:
> Schau mal, ob bei dir das „sin(b“ kursiv (oder fett) ist

Alles normale Schrift.
Um die Formatierungsfunktion des Forums zu umgehen, empfiehlt es sie, 
die pre-Tags zu verwenden.

von StefG (Gast)


Lesenswert?

Kann der Ausgang negative Werte?
Sonst fehlt ein Offset damit das Signal positiv bleibt...

von L(S)inus (Gast)


Lesenswert?

foobar schrieb:
>> f(x)=a*sin(b*(x-c)+d)
>
> Hier ist "d" eine Phasenverschiebung.
>
> Entweder:
>   f(x)=a*(sin(b*(x-c))+d)
> oder:
>   f(x)=a*sin(b*x-c)+d
>
> Bei d=0 wird f natürlich auch negativ - können das deine DACs/ADCs?
> Falls f auch Werte zwischen 0 und 100 liefern soll, muß a=50 und d=1
> resp d=a sein.

Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die 
Richtige mit a=50 und a=b=c=1.

also effektiv rechne ich:
Ausgang = sin(π*1,9*Merker/100-1)+1*50
Dann den Merker + Faktor(z.B.4,5 irgendwas zwische 0,2 und 1,9*π)=Merker
Dann prüfen ob (1.9*π-Merker)*(-1) positv ist, falls Ja dann den Merker 
löschen sonst wieder von voen beginnen.

Bei genau 2π hatte ich immer einen aussetzer alle 2 Perioden, deshalb 
habe ich 1,9*π genommen dann ging es. Das muss ich mir aber am Montag 
nochmal ansehen es kann auch daran liegen das ich für die Prüfung nicht 
2(1.9) sondern 100 genommen hatte, ich hatte den falschen Merker 
genommen.

Zumindest habe ich jetzt das Ergebnis was ich wollte. Das rückführen der 
Ausgänge ist gar nicht notwendig, da reicht ja die Anzeige der 
eingelesenen Werte. Das hochzählen mit dem Faktor hat dann die Lösung 
gebracht.
Schönes Wochenende.

von L(S)inus (Gast)


Lesenswert?

> Volker schrieb
> Sicher?
Nein ich hatte eine Klammer vergessen.

> Wolfgang schrieb:
> L(S)inus schrieb:
>> f(x)=asin(b(x-c)+d)
>
> Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von
> Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast
> jeder Unsinn möglich.

Ich meinte sin also die Sinusfunktion nicht Arkus Sinus a mal sin...
Ich hatte aber die Klammern falsch gesetzt.

StefG schrieb:
> Kann der Ausgang negative Werte?
> Sonst fehlt ein Offset damit das Signal positiv bleibt...

Ja den Ausgang könnte ich auch auf jeden gewünschten Messbereich 
skalieren, aber ich möchte, dass ein Bereich von 0 bis 100% ausgegeben 
wird.
Dann kann man schön sehen ob alle Kanäle den gleichen Wert rausgeben 
bzw. einlesen.

von foobar (Gast)


Lesenswert?

> Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die
> Richtige mit a=50 und a=b=c=1.

Was denn nun?  a=50 oder a=1?

> also effektiv rechne ich:
> Ausgang = sin(π*1,9*Merker/100-1)+1*50

Da fehlen wieder die Klammern.  Du solltest beim Programmieren etwas 
sorgfältiger vorgehen, sonst wird das nix.

Und das mit der 1.9 solltest du dir etwas genauer anschauen und nach der 
Ursache suchen - sonst mogelst du dir deine Daten nur zurecht.

von L(S)inus (Gast)


Lesenswert?

foobar schrieb:
>> Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die
>> Richtige mit a=50 und a=b=c=1.
>
> Was denn nun?  a=50 oder a=1?
a=50 es war kurz vor Feierabend tut mir leid.
>
>> also effektiv rechne ich:
>> Ausgang = sin(π*1,9*Merker/100-1)+1*50
>
> Da fehlen wieder die Klammern.  Du solltest beim Programmieren etwas
> sorgfältiger vorgehen, sonst wird das nix.

Ich musste die Gleichung wieder für das Forum "übersetzten", da in einer 
Anweisungsliste programmiert wird, so eine Art Assembler. Dabei habe ich 
die Klammer wieder übersehen.
Bei Minute 3:16 und 6:25 im folgenden Video kannst Du vielleicht das 
Prinzip wie programmiert wird sehen. In dem Video wird erklärt wie ein 
einfacher Regelkreis aufgebaut wird. Weil er kein realen Prozess hat 
bildet er ihn mit einer Gleichung ab.
https://www.youtube.com/watch?v=0vUrL_7VA6o
>
> Und das mit der 1.9 solltest du dir etwas genauer anschauen und nach der
> Ursache suchen - sonst mogelst du dir deine Daten nur zurecht.
Ja das schaue ich mir am Montag nochmal an.

von L(S)inus (Gast)


Angehängte Dateien:

Lesenswert?

L(S)inus schrieb:
> Ja das schaue ich mir am Montag nochmal an.

Also ich habe es mir nochmal angesehen und vereinfacht ich hatte von 
0-100% in 0-2π umgerechnet und wieder zurück. Das war unnötig. Ich habe 
mal das Ergebnis im Foto festgehalten und hier angehangen. Links ist die 
Umsetzung der Funktionsgleichung und rechts das Ergebnis im Trend.

Danke an foobar, StefG, Volker B., Dirk B. und Wolfgang.

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.