Forum: Mikrocontroller und Digitale Elektronik Sinustabelle


von Ingo L. (grobian)


Lesenswert?

Will über einen D/A Wandler einen Sinuston ausgeben. Gibt es hier 
irgendwo eine Tabelle wo die Werte schon berechnetsind, so dass ich mir 
die Werte direkt in den Code kopieren kann??

von 6789 (Gast)


Lesenswert?

Sowas kloppt man sich schnell in einer PC Programmiersprache zusammen, 
und copy/pastet sie dann in den source code.

von Ingo L. (grobian)


Lesenswert?

hab aber keine PC programmiersprache außer ASS und C :-(

von Christian L. (lorio)


Lesenswert?

Hi!

Hab dir mit EXCEL mal schnell eine erstellt.
Meine Kristallkugel sagte mir aber, dass du als Amplitude 777 wolltest 
und genau 11 Schritte pro Periode wolltest.

0
420
706
769
587
218
-219
-588
-770
-707
-421
0

Gruß
Christian

von Ingo L. (grobian)


Lesenswert?

uii ist ja nett von dir. Wie machst du das in EXCEL ?
Ist jetzt so das Ding mit dem Fisch und der Angel

von 6789 (Gast)


Lesenswert?

Der Aufwand bei der Tabelle ist nicht das Berechnen der werte, sondern 
deren formatierung. die Einen wollen
.DB 00 01 .... mit 16 Werten pro Zeile, die Anderen wollen das Null bei 
128, usw.

Ohne PC Programmiersprache sollte der Poster mal ueber denn Sinn des 
ganzen nachdenken... Meines Erachtens laeuft ohne PC Programmiersprache 
gar nichts.

von Ingo L. (grobian)


Lesenswert?

na an der Formatiering soll es dann nicht scheitern. Wäre ja schon toll, 
wenn ich die Werte Irgendwie hin bekomme. Soll schon  Null bei der 
negativen Spitze sein und 255 für die Positine Spitze.

von Christian L. (lorio)


Lesenswert?

Ingo Laabs wrote:
> uii ist ja nett von dir. Wie machst du das in EXCEL ?
> Ist jetzt so das Ding mit dem Fisch und der Angel

Ha, ganz normale Sin-Berechnungen, also

f(x) = â * sin (2*Pi*x - b) + c

â ist die Amplitude
b ist die Phasenverschiebung
c ist der "Offset"-Wert

In EXCEL dann halt die Formel dafür; ggf. noch mit GANZZAHL(x) auf eine 
ganze Zahl bringen.

Für x setzt du halt n/d ein. (n € N; d ist die Schrittanzahl pro 
Periode)

Gruß
Christian

EDIT:

ZU deinem vorherigen Post:
Wenn du mir jetzt noch sagt, wie viele Schritte du brauchst, dann mach 
ich dir das auch.

von Matthias L. (Gast)


Lesenswert?

Das ist doch ne Scherzfrage. Oder willst du allen ernstens Behaupten, 
eine Programm schreiben zu wollen, was Sinuswerte über einen DA-Wandler 
ausgibt, aber paar popelige Sinuswerte (z.Not mitn TR) kannst du nicht 
errechnen???

von sinusgeek (Gast)


Angehängte Dateien:

Lesenswert?

Für AVR-ASM könnte Dir diese Tabelle nützen.

~

von Ingo L. (grobian)


Lesenswert?

@lippy
es gibt sie und es wird sie immer geben, die Menschen mir ihrer 
Arroganz.
Ich glaube soch Kommentare brauch hier KEINER. Von daher halte dich hier 
bitte mit deinen Kommentaren raus. danke

von Ingo L. (grobian)


Lesenswert?

Qsinusgeek
danke, das ist genau was ich brauche. Kann sich blödkommetarlippy mal 
ein Beispiel dran nehmen

von Ingo L. (grobian)


Lesenswert?

Hallo lorio,

werde mal selber an deinem Beispiel fummeln..danke

von Thilo M. (Gast)


Angehängte Dateien:

Lesenswert?

Hier hast du ein ECXEL-Arbeitsblatt.
Nach deinen Wünschen abändern.

* wer Fehler findet darf sie behalten! ;)

von sinusgeek (Gast)


Lesenswert?

> Qsinusgeek

Aha, Kuh-Sinus... Oder Kuh-sine? Wir sind doch nicht etwa verwandt? ;-)

> danke, das ist genau was ich brauche.

Nix zu danken, hättest Du aber mit ein paar Zeilen QBASIC (lag jedem 
MS-DOOF und fast jedem WINDOOF bei) auch selbst machen können. Oder mit 
fast jeder anderen Programmiersprache für PC, je nachdem, womit Du 
aufgewachsen bist. Alternativ hättest Du mal in die Codesammlung schaun 
können, da ist dieses Include auch zu finden.

> Kann sich blödkommetarlippy

Der Ausdruck gefällt mir nicht, das hat er nicht verdient. Matthias 
Lipinsky gehört zu Denen, die oft und gern helfen und über ein 
fundiertes Grundwissen verfügen.

> mal ein Beispiel dran nehmen

Beweise uns, dass er unrecht hat, zeige uns (hier in diesem Thread) 
Deinen (hoffentlich selbstgeschriebenen) Quelltext. Anderenfalls könnte 
man vermuten, dass er mit seiner Aussage richtig lag.

~

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Warum berechnest du die Sinustabelle nicht eben nach dem Einschalten und 
legst sie im Speicher ab? Oder ist es schon zu eng für die math.h?

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Ums schmerzlos zu machen, hiermit kannst du dir selber deine Tabelle 
basteln oder eine diskrete Wertetabelle Anlegen.

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>
4
5
#define ANZAHL 100
6
#define AMPLITUDE 128
7
#define OFFSET 1
8
9
float sinustabelle[ANZAHL];
10
11
int main(void){
12
 int i;
13
 for (i=0; i<ANZAHL; i++) sinustabelle[i]=AMPLITUDE*(sin(i*2*M_PI/ANZAHL)+OFFSET);
14
 for (i=0; i<ANZAHL; i++) printf("%f\n", sinustabelle[i]);
15
 return 0;
16
}

Steckt natürlich eine kleine Gemeinheit drin wenn der Winkel 90° beträgt 
ist der Wert 256 und läuft in einer 8 Bit Variablen über, darum hier als 
Float...

von 6789 (Gast)


Lesenswert?

Ja. Deshalb sollte man als Amplitude auch nur 127 nehmen....

von Frank S. (Firma: HSCS) (linuxerr)


Lesenswert?

es ist auch nicht notwendig eine ganze sinusperiode als tabelle 
abzuspeichern, die werte von 0..90°, also eine viertel periode reichen 
vollkommen aus, der rest wird durch spiegelung erzeugt.

von Ingo L. (grobian)


Lesenswert?

@sinusgeek
werde ich machen sofern er dann fertig ist.
Ich meinte damit nur, dass einige Leute hier nicht so überheblich sein 
sollen, und andere die noch nicht soweit sind schlichtweg als doof 
hinstellen. Jeder hier hat wohl mal klein angefangen.Mit Sicherheit auch 
lippy. Und wenn er das notwendige Gedankengut besitzt, könnte er es ja 
zur Verfügung stellen auch wenn es aus seiner sicht banale Probleme 
sind. Er wird mit Sicherheit auch einen Schwachpunkt haben...vielleicht 
kann er ja keinen Weihnachtsbraten machen...gell

von holm (Gast)


Lesenswert?

Hauptsache der Fragesteller erklärt NICHT genau was er haben möchte und 
ist grob genug. Alles Obama oder was? Die für Dein Problem notwendige 
Bildung sollte Dir in der Schule beigebracht worden sein, die 
Programmiersprache C
ist auch völlig ausreichend um Dein Problem zu klären.
Dein eigentliches Problem ist das Du zwar die große Klappe, aber nichts 
dahinter hast.

Gruß,

Holm

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Frank Schlaefendorf wrote:
> es ist auch nicht notwendig eine ganze sinusperiode als tabelle
> abzuspeichern, die werte von 0..90°, also eine viertel periode reichen
> vollkommen aus, der rest wird durch spiegelung erzeugt.

Natürlich nicht, nur hab ich den Verdacht das sich der Threadersteller 
damit nur schwerer tun würde.
Abgesehen davon funktioniert das nicht vernünftig wenn, aus welchen 
Gründen auch immer, die Anzahl der Abtastwerte kein Vielfaches von 4 
sein sollen. Aber prinzipiell hast du Recht.

von Ingo L. (grobian)


Lesenswert?

und genau das dahinter möchte ich mir hier erarbeiten..auch wenn es 
einfache Fragen sind..und wenn sich einer hier auf den Schlips getreten 
fühlte, so möchte ich mich dafür entschuldigen. Werde aber nicht darum 
kommen weiterhin einfache Fragen zu stellen.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

holm wrote:
> Hauptsache der Fragesteller erklärt NICHT genau was er haben möchte und
> ist grob genug. Alles Obama oder was? Die für Dein Problem notwendige
> Bildung sollte Dir in der Schule beigebracht worden sein, die
> Programmiersprache C
> ist auch völlig ausreichend um Dein Problem zu klären.
> Dein eigentliches Problem ist das Du zwar die große Klappe, aber nichts
> dahinter hast.
>
> Gruß,
>
> Holm

Beitrag "Re: Fototransistor aus BC547"  und folgender

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Ingo Laabs wrote:
> und genau das dahinter möchte ich mir hier erarbeiten..auch wenn es
> einfache Fragen sind..und wenn sich einer hier auf den Schlips getreten
> fühlte, so möchte ich mich dafür entschuldigen. Werde aber nicht darum
> kommen weiterhin einfache Fragen zu stellen.


Nein, nicht du mußt dich hier entschuldigen, sondern derjenige, der noch 
nicht einmal die Grundregeln zivilisierten miteinanders einzuhalten 
bereit ist und gar nicht zu ahnen scheint was er alles nicht weiß. Und 
zwar er bei dir und nicht umgekehrt.

von Ingo L. (grobian)


Lesenswert?

So, mein Programm sieht nun so aus und es funktioniert(auch wenn es für 
den ein oder anderen Profi hier ein wenig wackelig aussieht)
Die Beschaltung möchte ich hier euch ersparen (R2R mit nem OP hinter)
Kann mich halt über Kleinigkeiten freuen :-)
Für Verbesserungen und Anregungen bin ich immer dankbar

.include"tn26def.inc"

.def zaehler = r17
.def temp = r16

main:
ldi temp,(RAMEND)
out SP,temp

ldi temp,0xff
out DDRA,temp

anfang:

ldi ZL,LOW (sinustabelle*2)
ldi ZH,HIGH (sinustabelle*2)

holen:
lpm
mov temp,r0

sbci zaehler,255
brcc anfang

out PORTA,temp
adiw ZL,1
rjmp holen

sinustabelle:
.db $80,$83,$86,$89,$8C,$8F,$92,$95; 0-7
.db $98,$9B,$9E,$A1,$A4,$A7,$AA,$AD; 8-15
.db $B0,$B3,$B6,$B9,$BB,$BE,$C1,$C3; 16-23
.db $C6,$C9,$CB,$CE,$D0,$D3,$D5,$D7; 24-31
.db $D9,$DC,$DE,$E0,$E2,$E4,$E6,$E7; 32-39
.db $E9,$EB,$ED,$EE,$F0,$F1,$F2,$F4; 40-47
.db $F5,$F6,$F7,$F8,$F9,$FA,$FB,$FC; 48-55
.db $FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF; 56-63
.db $FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD; 64-71
.db $FC,$FC,$FB,$FA,$F9,$F8,$F7,$F6; 72-79
.db $F5,$F4,$F2,$F1,$F0,$EE,$ED,$EB; 80-87
.db $E9,$E7,$E6,$E4,$E2,$E0,$DE,$DC; 88-95
.db $D9,$D7,$D5,$D3,$D0,$CE,$CB,$C9; 96-103
.db $C6,$C3,$C1,$BE,$BB,$B9,$B6,$B3; 104-111
.db $B0,$AD,$AA,$A7,$A4,$A1,$9E,$9B; 112-119
.db $98,$95,$92,$8F,$8C,$89,$86,$83; 120-127
.db $80,$7C,$79,$76,$73,$70,$6D,$6A; 128-135
.db $67,$64,$61,$5E,$5B,$58,$55,$52; 136-143
.db $4F,$4C,$49,$46,$44,$41,$3E,$3C; 144-151
.db $39,$36,$34,$31,$2F,$2C,$2A,$28; 152-159
.db $26,$23,$21,$1F,$1D,$1B,$19,$18; 160-167
.db $16,$14,$12,$11,$0F,$0E,$0D,$0B; 168-175
.db $0A,$09,$08,$07,$06,$05,$04,$03; 176-183
.db $03,$02,$02,$01,$01,$01,$01,$00; 184-191
.db $00,$00,$01,$01,$01,$01,$02,$02; 192-199
.db $03,$03,$04,$05,$06,$07,$08,$09; 200-207
.db $0A,$0B,$0D,$0E,$0F,$11,$12,$14; 208-215
.db $16,$18,$19,$1B,$1D,$1F,$21,$23; 216-223
.db $26,$28,$2A,$2C,$2F,$31,$34,$36; 224-231
.db $39,$3C,$3E,$41,$44,$46,$49,$4C; 232-239
.db $4F,$52,$55,$58,$5B,$5E,$61,$64; 240-247
.db $67,$6A,$6D,$70,$73,$76,$79,$7C; 248-255

von sinusgeek (Gast)


Lesenswert?

> Jeder hier hat wohl mal klein angefangen.Mit Sicherheit auch lippy.

Das ist wohl wahr. Die meisten davon, mit Sicherheit auch Lippy, haben 
sich ihr Wissen aber durch intensives Selbststudium und eigene 
Experimente, also durch eigene Arbeit angeeignet und nicht unüberlegt in 
Foren zusammengefragt. Nein, ich mache Dir keinen Vorwurf, dass Du 
gefragt hast. Ich finde Deine abwertenden Sprüche aber unangemessen.

> Und wenn er das notwendige Gedankengut besitzt, könnte er es ja
> zur Verfügung stellen auch wenn es aus seiner sicht banale Probleme
> sind.

Das macht er ja auch. Allerdings erwartet er dabei, dass der 
Hilfesuchende auch selbst etwas dafür tut. Der Umgang mit 
Winkelfunktionen (bzw. das Erstellen einer Sinustabelle) sollte 
eigentlich als Schulwissen bekannt sein, das relativiert die 
Notwendigkeit Deiner Frage.

~

von holm (Gast)


Lesenswert?

@Winfried: ich werde Dich als Sozial kompetente Person irgendwie 
bookmarken,
kann ja sein, das man so Jemanden mal braucht, wenn auch gerade jetzt 
nicht...

Gruß,

Holm

von Frank S. (Firma: HSCS) (linuxerr)


Lesenswert?

wie ich schon sagte, eine viertel periode abzuspeichern reichts auch 
aus. wenn du dir mal eine volle sinusschwingung aufzeichnest und die 
zeitachse in 4 gleiche teile einteilst (den sogenannten quadranten), 
dann stellst du fest, dass im ersten und zweiten quadranten die selben 
sinuswerte angenommen werden, nur in umgekehrter reihenfolge. in deiner 
tabelle ist das zu sehen, der startwert ist 0x80 und er steigt bis 0xFF 
an, ab dem 64sten byte wiederholen sich alle werte wieder, bis zum 
128sten byte, da bist du wieder bei 0x80H angekommen. ab da geht die 
sinusfunktion in den negativen bereich und wenn du dir deine zeichnung 
anschaust, dann siehst du, das die sinuswelle dort genauso aussieht wie 
im positiven bereich, man nimmt die selben werte und muss nur das 
vorzeichen ändern.
in deinem fall geht es in der tabelle einfach mit den invertierten 
werten weiter (also ein xor mit 0xff). deine ganze tabelle muss also nur 
bis zum 64sten bit reichen, alle anderen werte ergeben sich automatisch. 
du kannst natürlich die größe der tabelle so belassen, dann kannst du 
die sinusfunktion 4mal feiner abstufen, dann ist die qualität des 
ausgangssignals besser.

von spess53 (Gast)


Lesenswert?

Hi

>Für Verbesserungen und Anregungen bin ich immer dankbar

1.  lpm
    mov temp,r0
    lässt sich durch 'lpm temp' ersetzen.

2. Dein Register 'zaehler' wird nie auf Null gesetzt und auch nirgens 
incrementiert.

3.  sbci zaehler,255
    brcc anfang

    kannst du ersetzen:

    inc zaehler
    brcs anfang

    Das Carry-Flag wird bei Überlauf gesetzt un 'zaehler' wird Null.

MfG Spess

von Ingo L. (grobian)


Lesenswert?

2. Dein Register 'zaehler' wird nie auf Null gesetzt und auch nirgens
incrementiert.

3.  sbci zaehler,255
    brcc anfang



wieso funktioniert es dann?

erhöht sbic nicht zaehler und zieht die 255 dann ab
so dass ich mit brcc einen vergleich machen kann?

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

o.t.

holm wrote:
> @Winfried: ich werde Dich als Sozial kompetente Person irgendwie
> bookmarken,
> kann ja sein, das man so Jemanden mal braucht, wenn auch gerade jetzt
> nicht...
>
> Gruß,
>
> Holm

ja tu das ;-)

darfst jederzeit posten, wennn ich es rechtzeitig bemerke, so helfe ich 
auch dir gern und unabhängig davon, ob ich deine Frage oder dein 
Benehmen als angemessen erachte, nach bestem Gewissen.

MfG Winne

von spess53 (Gast)


Lesenswert?

Hi

>erhöht sbic nicht zaehler und zieht die 255 dann ab
>so dass ich mit brcc einen vergleich machen kann?

SBCI - Subtract Immediate with Carry
Operation:
(i)Rd ← Rd - K - C

Dein Konstrukt erhöht zwar den Zähler, ist aber durch das undefinierte 
C-Flag fehlerträchtig. In deinem Programm mag das funktionieren. Ist 
aber irgendwie 'Von hinten durch die Brust ins Auge'.

MfG Spess

von Ingo L. (grobian)


Lesenswert?

@spess53
>  sbci zaehler,255
>  brcc anfang

> kannst du ersetzen:

> inc zaehler
> brcs anfang

> Das Carry-Flag wird bei Überlauf gesetzt un 'zaehler' wird Null.

> lpm
> mov temp,r0
> lässt sich durch 'lpm temp' ersetzen.



Carry wird bei mir nicht gesetzt
und bei lpm temp
meckert das AVR Studio
warum ??

habe es durch

inc zaehler
breq anfang

ersetzt

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ingo Laabs schrob:
> Carry wird bei mir nicht gesetzt
> und bei lpm temp
> meckert das AVR Studio
> warum ??

Weil a) Carry durch INC nicht gesetzt wird. und b) nicht jeder AVR ein 
LPM Rn kennt. Kleine AVR kennen nur LPM mit implitizem R0, das von 
manchen Assemblern erlaubt wird hinzutexten, obwohl es dann redundant 
ist.

> habe es durch
>
> inc zaehler
> breq anfang
>
> ersetzt

Das geht, Z-Flag wird durch INC gesetzt

von Ingo L. (grobian)


Lesenswert?

> inc zaehler
> brcs anfang

war ja nicht meine idee..habe mich nur gewundert warum c nicht gesetzt 
wird

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.