Forum: Mikrocontroller und Digitale Elektronik Sinus Erzeugung mit BASCOM


von Avrler (Gast)


Lesenswert?

Hallo zusammen,

ist es eigentlich auch möglich mit BASCOM Sinustöne zu erzeugen?
Wenn ja wie?

Da ich hiervon ziemlich wenig Ahnung habe wäre eine Seite oder Link mit
Infos zur Berechnung der Sinustabellen Wewrte sehr hilfreich.

Vielen Dank
Michi

von Jens123 (Gast)


Lesenswert?

sicher ist es moeglich...

du musst nur die Sinuskurve an den Analog ausgang uebergeben fertig

und die Sinuskurve solltest du mittels Mathematische Funktionen
erstellen koennen

von Avrler (Gast)


Lesenswert?

ja schon,
aber wie übergebe die sinuskurve an den analog port und wie werden die
funktionen berechnet?

von Philipp Sªsse (Gast)


Lesenswert?

Wie genau brauchst Du die Sinus-Kurve (wieviel Bit)? Welcher
Frequenzbereich? Wieviel Rechenleistung kannst Du draufwerfen?

Man bekommt z.B. schon erstaunlich brauchbare Resultate, wenn man an
einen extern auf U/2 gezogenen Pin einen Integrator mit anschließender
TP-Filterung hängt. Dann gibt man mit der gewünschten Frequenz
1, high-Z, 0, high-Z usw. drauf, also
  __             __
_|   |___     ___|   | usw.
         |___|

Der Integrator macht daraus:
     _
    /   \       /
   /     \     /   usw.
_ /       \___/

Und der Tiefpaß macht ein wenig die Ecken rund.

Klar, das "klirrt" noch, daß es Hifi-Freaks graus, aber für ein
besseres Ergebnis per sin-LookupTable bräuchte man ja noch einen guten
DA-Wandler oder jede Menge Rechenpower für 1-Bit-Wandlung.

Also: Dein Anspruch bestimmt die Realisierung!

von Mike (Gast)


Lesenswert?

Hi Avrler,


die Frage ist,
1. wie hat der Sinus auszusehen ( wo ist z.B. die Nulllage )?
2. was hast Du denn für einen Analogausgang (PWM)!?

LG
Mike

von Mike (Gast)


Lesenswert?

Hi Philipp,

warst schneller!!

>Und der Tiefpaß macht ein wenig die Ecken rund.

Hört sich süß an - runde Ecken!!

LG
Mike

von Avrler (Gast)


Lesenswert?

Danke schonmal.
Möchte das auf einem 90S8515 realisieren mit 4MHz.
Man könnte das ganze aber doch auch einem 8bit breitem port ausgeben
und die Ausgänge mit einem 1R/2R zusammenfassen.

Es müssen 13 Feste Frequenzen im Bereich von 1 kHz bis ca. 2800 kHz
ausgegeben werden.

Vielleicht ein kleines Codebeispiel?
Übergabe der Werte an den Port usw...

Und villeicht eine Formel oder so. wie man sowas für die o.g.
Konstellation berechnet.

Vielen vielen Dank.

Hab da wirklich null plan.

von Philipp Sªsse (Gast)


Lesenswert?

1. Wenn Du über Widerstände DA-Wandlung machst, hast Du eine sowas von
kaputte Kennlinie durch die Widerstandstoleranzen, da ist mein oben
beschriebenes Verfahren High-End dagegen (-; -- bei viel geringerem
Aufwand.

2. 2800 kHz mit einem 4 MHz µC? Ich nehme einmal zu Deinen Gunsten an,
daß das nicht ernst gemeint ist, sondern ein Schreibfehler. Also 1000
bis 2800 Hz?

3. Wenn 8 Bit Dir reichen (und 2800 Hz stimmt), nimmst Du auf dem 8515
PWM für die DA-Wandlung. Dann schreibst Du eine Tabelle, in der Du die
Sinuswerte nachschlagen kannst.

4. Bist Du sicher, daß Du dafür nicht etwas externes von der Stange
nehmen willst? Oder hat der µC ansonsten zu wenig zu tun, daß er mit
sowas belästigt werden muß? (-;

von Avrler (Gast)


Lesenswert?

Hi,

also,
zu 1.: Hab ich ja nur schon oft gesehen und dachte deshalb vielleicht.
aber na gut wenns so schlecht is, dann nehemen wir eben den PWM.
Zu 2.: Ja klar, sollte eigentlich 1000..2800 Hz heißen.
Zu 3.: Ja ok. Aber WIE berechne ich die Werte ????????
Zu 4.: der µC hat wirklich wenig zu tun (eigentlich nur das).

Gruß und danke
Michi

von Arno (Gast)


Lesenswert?

Sinus erzeugen macht der AVR spielend..ja sogar DTMF,das sind zwei
überlagerte Sinuswellen zugleich.Einen Timer auf PWM einstellen,und in
einer interruptgesteuerten Routine den Output compare register
mit den Sinuswerten aus einer Tabelle laden .An den richtigen PWM Pin
einen Tiefpass(RC Glied) anschliessen.Auf der Atmel Homepage gibt es
eine interessante AN(Appl.Note)die die Erzeugung von Sinussignalen
beschreibt (allerdings nur in C,aber man kann doch einiges abschauen).
Grüße Arno

von Tobi (Gast)


Lesenswert?

"Zu 3.: Ja ok. Aber WIE berechne ich die Werte ????????"

hast du einen taschenrechner? ;)
zur not sollte es sowas bei google auch geben

von avrler (Gast)


Lesenswert?

So,
also ich berechne jetzt die Werte für die Sinustabelle so:

z.B. f(erzeugte Frequenz) soll sein 1750 Hz
     Samples = 256
     fck (clock freq) soll sein 8 MHz

x=8*256*1750Hz*510/fck

kommt raus: 228

Jetzt hab ich den wert, aber wie könnte nun ein prog aussehen mit dem
ich die daten auf den pwm port lege?
Oder einfacher was mache ich mit dem Wert.

Ihr seht ja selbst dass ich keinen plan davon habe - vielleicht könnte
mal jemand ein Stück Quellcode posten oder mir mal die grundlage
erklären damit ich net ganz so doof fragen muss.

Gruß
Michi

von Philipp Sªsse (Gast)


Lesenswert?

Jetzt müssen wir doch nochmal nachrechnen ...

Wenn wir eine Schwingungsperiode in n Teile teilen, dann ändert sich
beim Nulldurchgang, wo die Steigung 1 ist, der Sinuswert um 2*Pi/n.
Dieser Wert sollte ungefähr so groß sein wie die Auflösung, also 1/m
mit m als Anzahl der Takte pro PWM-Periode.

Bei perfekter Ausnutzung der Takte haben wir genau einen Abtastwert pro
PWM-Zyklus, es ist also m  n  2800 Hz = 8 MHz.

Damit komme ich auf n = ca. 134. Die Auflösung sind also 21 PWM-Takte
bei 2800 Hz -- nicht einmal 5 Bit, da habe ich mich wohl verschätzt.
Aber mit ein bißchen Filterei sollte es zumutbar werden. (Auch wenn ich
immernoch den ersten Ansatz mit dem externen Integrator besser finde,
aber auf mich hört ja keiner.)

Im Anhang ist eine Tabelle, wie Du an die Sinus-Werte kommst. Ist
schneller gemacht als erklärt.

Ich habe 64 Werte genommen, die einen Viertel-Sinusbogen beschreiben
(die restlichen Viertel kann man ja daraus ausrechnen).

Jetzt müßtest Du alle 21 Takte einen Wert für Deinen PWM errechnen. Das
mag in Assembler knapp zu schaffen sein, in Bascom hast Du aber keine
Kontrolle, wie lange das geht -- mit Interrupt kannst Du es vergessen.

Das Prinzip ist wie folgt:
alle m Takte erhöhst Du einen Zähler um einen Wert entsprechend der
Frequenz. Das sollte ein 16-Bit-Wert sein, damit die Frequenz auch
stimmt. Das HighByte liefert den Index für die Tabelle:

0-63: PWM-Wert = Mittelwert + Tabellenwert(Index)
64-127: PWM-Wert = Mittelwert + Tabellenwert(127 - Index)
128-191: PWM-Wert = Mittelwert - Tabellenwert(Index)
192-255: PWM-Wert = Mittelwert - Tabellenwert(127 - Index)

Ich habe in der Tabelle mal einen Mittelwert von 20 genommen, also 40
Takte für den PWM; hoffentlich schafft Bascom das. Rechenbeispiel für
1750 Hz:

8 MHz und 40 Takte heißt: 200 kHz "Abtast"frequenz.
Um wieviel muß ich meinen 16-Bit-Zähler 200.000 mal pro Sekunde
erhöhen, damit der 1750 mal pro Sekunde überläuft? Um 65536*1750/200000
= 573.
Beim ersten Interrupt erhöhe ich also von 0 auf 573. Im HighByte
bekomme ich eine 2. Bei 2 steht in der Tabelle eine 1, dazu addiere ich
den Mittelwert 20, also wird der PWM mit 21 gefüttert.

In der Tabelle habe ich in den Spalten D-F nochmal ein Rechenbeispiel
zum nachvollziehen.

von Avrler (Gast)


Lesenswert?

das ist ja mal was.
Danke schön.

Aber kanns sein dass du den Anhang vergessen hast?

Gruß
Michi

von Philipp Sªsse (Gast)


Angehängte Dateien:

Lesenswert?

Ich? Ich vergesse doch nichts! zerstreut am Kopf kratz

(-;

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.