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
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
ja schon, aber wie übergebe die sinuskurve an den analog port und wie werden die funktionen berechnet?
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!
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
Hi Philipp,
warst schneller!!
>Und der Tiefpaß macht ein wenig die Ecken rund.
Hört sich süß an - runde Ecken!!
LG
Mike
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.
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ß? (-;
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
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
"Zu 3.: Ja ok. Aber WIE berechne ich die Werte ????????" hast du einen taschenrechner? ;) zur not sollte es sowas bei google auch geben
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
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.
das ist ja mal was. Danke schön. Aber kanns sein dass du den Anhang vergessen hast? Gruß Michi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.