Moin, ich habe hier Jespers poor man DDS auf einen ATMEGA32 laufen. Die Daten gehen vom port A über ein R2R-netzwerk und eine Treiberstufe (TDA7267) an einen Lautsprecher. Ich habe die Originalroutine verändert, so dass ich ca. 60 Zyklen "Platz" für andereren Code vorrätig habe. Diese sind nun mit NOPs gefüllt. Ich generiere einen 600Hz Sinuston. Der Sound ist für mich OK und auf dem Oszi ist auch alles i.O. Ist halt kein HiFi. Ich möchte aber nun alle 100ms eine Pause von 100ms haben. Also an aus an aus an aus .... ;-) 1. Versuch: Mittels Timer1 Interrupt habe ich jetzt mal versucht, alle 100ms den Port A als Ausgang abzuschalten. Dabei habe ich folgenden Effekt. Ein unregelmäßiges hartes Knacken beim Einsetzen des Tones. Das dürfte wohl an der Plötzlich hohen Spannung beim einschalten liegen, je nach dem welcher Wert gerade aus der Tabelle ansteht. Allerdings höre ich auch noch einen fortlaufenden (ziemlich leisen) Ton im Hintergrund. 2. Versuch Mein Timer verändert nur noch ein Register als "Merker". Dieses wird vor der Ausgabe innerhalb der DDS-Routine ausgewerte. Wenn der Merker0 ist, dann wird der Sinus ausgegeben, sonst nicht. In der Pause werden dann auch alle Register, die für die Sinus-Generierung nötig sind, initialisiert. So startet der DDS nach den 100ms Sekunden Pause beim ersten tabellenwert. Nun sind die unter 1. beschriebenen Effekte weg. Allerdings höre ich jetzt bei jedem Ton so ein gleichförmiges Ticken. Dieses ist unabhängig von der Lautsärke vorhanden. Frage: Wie bekomme ich jetzt diese "Ticken" weg. Gruß Cheffe
Jepsers DDS ist dann gut, wenn du tatsächlich nur einen
Frequenzgenerator benötigst und sonst nichts.
In dem Moment, in dem du auf die Kurve Einfluss nehmen willst, möglichst
noch während die Schwingung ausgegeben wird, wird das zum Problem.
Daher: Überleg dir was du machen willst. Willst du nur Töne ausgeben,
dann brauchst du keine hohen Frequenzen. Dann muss man mal rechnen, wie
weit man mit einem Timerinterrupt bei der gewählten Quarzfrequenz kommt
und die Soundgenerierung in den Timerinterrupt verlagern.
> Allerdings höre ich jetzt bei jedem Ton so ein gleichförmiges Ticken.
Ich würde mal schätzen, dass das Ticken von den ISR Unterbrechungen des
Timers kommt.
> Ich generiere einen 600Hz Sinuston.
Vorschlag für eien 600 Hz Sinuston. Pro Sinus 32 o. s. Punkte. Alle
1/19200 s unterbricht der Timer das Hauptprogramm und gibt einen Wertt
aus der 32 o. s. Bytes großen Sinustabelle aus.
Moin, also ich habe es mal skopiert ;-) Der Sinus schwingt sauber ein und zwar uber x-Perioden. Die letzte Schwingung endet aber der Kondensator zwischen R2R und TDA7267 entlädt sich langsam, so dass die Spannung am Lautsprecher stetig zur Nulllinie absinkt/ansteigt. Nach 100ms Pause schwingt der Sinus wieder Sauber von der Nulllinie ein. Im Skopebild ist nichts auffälliges zu sehen. Gruß Cheffe
2 Widerstände, die die Spannung auf Ub/2 halten könnten das Problem lösen.
Moin, wohin mit den beiden? ich benutze die Standardschaltung des NF-Verstärkers. Vor oder hinter dem Kondensator zwischen R2R und Verstärker? Gruß Cheffe
So habe ich es mir gedacht. o Ub | || R 100 K R2R -----||---o || R 100 K C | - GND
Trotzdem bleibt es bei der Ursache für die Klicks: abgeschaltet wird nicht im Nulldurchgang des Signals sondern an beliebiger Stelle. Wenn dann im oberen/unteren Bereich der Sinuskurve abgeschaltet wird, entsteht ein Spannungssprung, der als Klick zu hören ist. Dem könnte eine Steuerung durch den Timer abhelfen: Nach einer Pause wird sowohl der Timer gestartet als auch die Sinuskurve, indem r28 bis r30 auf Null (oder 128?)gesetzt wird, der Sinus also mit der Nullphase beginnt. beim Timer muss dann die Laufzeit bis zum Überlauf so eingestellt sein, dass der Timer-Int gerade im Nulldurchgang der Sinuskurve abschaltet. ähnlich muss auch der Vorgang am Beginn einer Pause gesteuert werden: Auch das Wiedereinschalten der DDS Schleife sollte im "Nulldurchgang" geschehen.
@Peter Du hast natürlich recht: der Sinus muss bei 0 Grad einsetzen und aufhören.
Heinz schrieb: > Du hast natürlich recht: der Sinus muss bei 0 Grad einsetzen und > aufhören. Das ist relativ egal. Du modulierst den Sinus mit einer rechteckigen Hüllkurve. Du bekommst also entsprechend den Knack am Ausgang. Fourier erklärt das. Wenn Du den Knackser nicht haben möchtest, mußt Du den Ton 'langsam' einblenden. Evtl. mit einer halben Cosinuswelle selber Frequenz der Ausgangsfrequenz. Gruß Jobst
Moin, vielen Dank für die Antworten. Die Spannungssprünge scheinen das Problem zu sein. Die Klicks kommen gefühlt doppelt so häufig wie die 600Hz Töne. Der Sinus setzt immer bei 0 Grad ein. Da hätten wir schon den ersten Spannungssprung. Und eben auch beim Ausschalten. Komme erst Montag dazu. Dann werde ich mal folgendes machen: 1. Vor dem Start der Tonausgabe wird der Ausgangsport auf den Wert ersten Sinustabellenwert "vorgespannt". 2. Bei Ausschalten läuft Spannungswert je nach Halbwelle von oben bzw. unten Richtung 0 Grad Spannungswert. Ich werde berichten. Gruß Cheffe
Du brauchst einen Nulldurchgangsschalter, d.h. dein Sinus wird nur im Nulldurchgang ein- bzw. ausgeschaltet. In der Pause muß das Signal sauber auf der Nulllinie gehalten werden, auch der Verstärker hinterm C.
Mal etwas umfangreicher formuliert: Du möchtest 600Hz Sinus mit 5Hz Rechteck schalten bzw. modulieren. Ein Rechteck besteht aus einem Sinus mit Oberwellen. Grundwelle + 1/3 Grundwelle*3 + 1/5 Grundwelle*5 + ... usw. Die 600Hz sind Dein Träger, die 5Hz Rechteck Deine Modulation. Bei einer Amplitudenmodulation (hier mit Träger, 100% Modulation) entstehen Seitenbänder der modulierten Frequenz in Abhängigkeit vom modulierenden Signal. Es entstehen die Frequenzen: - Träger - Träger + Modulation - Träger - Modulation Bei -30dB sind gehen die Oberwellen des Rechtecks bis 5kHz. (Ich setze hier einfach mal eine Grenze) Es entstehen also Frequenzen bis 5.6kHz im 10Hz Abstand, bis 600Hz zunehmend, ab 600Hz abnehmend. Das tolle daran: Es ist total egal, an welcher Stelle der Sinus ein-/ausgeschaltet wird! Die einzige Möglichkeit, das Knacken weg zu bekommen ist, die Modulation in der Bandbreite zu begrenzen. z.B. auf 25Hz. D.h. der Sinus wird mit einer Cosinuswelle innerhalb von 20ms eingeschaltet und ebenso wieder ausgeschaltet. Es entstehen dann nur noch die Frequenzen [Hz]: 575(13%), 585(21%), 595(63%), 600(100%), 605(63%), 615(21%), 625(13%) Wer es plotten möchte:
1 | plot [0:3] cos(595*x)/1.6-cos(605*x)/1.6+cos(585*x)/4.8-cos(615*x)/4.8+cos(575*x)/8-cos(625*x)/8+sin(600*x) |
Gruß Jobst
Diesen (Modulations-)Anteil kann man tatsächlich nicht über die Software unterdrücken. Was sich über die SW. unterdrücken lässt, ist aber die Rechteckspannung, die durch das willkürliche Abbrechen des Sinus entsteht. Sie macht sich auf dem Scope durch unterschiedliche Höhe der Spannung am D/A-Ausgang während der Pausen bemerkbar.
Jobst hats auf den Punkt gebracht. Im Prinzip wie http://en.wikipedia.org/wiki/Pulse_shaping nur, dass dein Symbol die Amplitude des Sinus ist. Du musst also ein Signal y = A(Zeit nach einschalten bzw. vor Abschalten) * sin(t) erzeugen. Die Dauer des sin^2-förmigen Einrampens bzw. Ausrampens bestimmt die Bandbreite der AMplitudenmodulation und damit das Knacken.
Da Du sowieso schon einen DDS-Generator im Spiel hast, würde ich Dir raten, daß Du 200ms mit 2048 Samples im ROM als Tabelle ablegst und diese mit 10240Hz abspielst. Die Daten müssen wie folgt aussehen:
1 | ROM 0 512 1536 2048 |
2 | Zeit 0ms 50ms 150ms 200ms |
3 | | | | | |
4 | 0xFF | | _______________ | | |
5 | | |,- -,| | |
6 | / \ |
7 | 0x80 ________-' 600Hz '-_______ |
8 | -, ,- |
9 | \ / |
10 | 0x00 | '-_______________-' \ |
11 | | | \ |
12 | 40ms 60ms Cosinushalbwelle |
Dann hast Du schon alles was Du möchtest. Nur noch ein 12dB/Okt Tiefpassfilter (oder besser) ab 630Hz hinter den DAC und fertig ist Dein Signal. Gruß Jobst
Moin. ich möchte kein AM. Ich möchte 100ms sauberen knackfreien Sinus und danach 100ms nichts hören. Gruß Cheffe
Lueber Jobst, ... 600Hz Sinus 100ms an und aus ist nur der Einstieg. sozusagen zum probieren. Später soll die Frequenz in Telefon-NF-Bereich mit einer 10Hz Auflösung einstellbar sein. Die Ausgabedauer des Tones soll auch variabel sein, wobei 20ms das Minimum und 240ms das Maximum darstellt. Gruß Cheffe
Lueber Cheffe, davon war bis jetz nie die Rede. Was du trotzdem brauchst ist das Jobst-sche Rad! Ohne das sin^2-Shaping knackts immer, und das recht breitbandig. Entgegen deiner Beratungsresisitenz hat dein Controller wohl noch 60 Takte frei, also bau da eine sin^2-AM für den Anfang und das Ende eines Pulses rein. Gruß Karl
Lieber Karl, warum wirfst Du mir Beratungsresistenz vor? Ich schrieb, dass ich vor Montag nicht wieder an das Projekt komme. Ich konnte also keine der ganzen gut gemeinten Ratschlägen umsetzen. Gruß Cheffe
Und warum schreibst du dann: Cheffe schrieb: > Moin. ich möchte kein AM. Ich möchte 100ms sauberen knackfreien Sinus > und danach 100ms nichts hören. Wasch' mir den Pelz, aber mach' mich nicht naß
Moin, weil ich wohl etwas schnell über die Nachricht von >>Autor: Jobst M. (jobstens-de) >>Datum: 28.01.2012 03:59 gehuscht bin. Gruß Cheffe
Moin, ich möchte noch mal bei Karls und Jobsts Punkten ansetzen. Wie ich ja schrieb, ist die kürzeste Ausgabedauer 20ms. Die kürzeste Pause zwischen zwei Tönen wäre dann auch 20ms. Wie lang müsste denn dann Eurer Einschätzung nach die Einschwing- der ersten Welle und die Abschwingzeit der letzten Welle sein. Da ja je nach Frequenz und Ausgabedauer die Anzahl der Perioden nicht ganzzahlig ist, müsste man dann die Ausgabezeit um eine Periode verkürzen oder verlängern. Das wird man wohl nicht heraus hören können. Gruß Cheffe
Je schneller du Ein- bzw. Ausschaltest (Flankenform), um so knacks. Da darf also kein scharfer Knick in deinem Signal sein
Wie wärs mit einer Hullkurvenmodulation um die Amplitude langsam ansteiegen zu lassen. Wenn der uP einen Multiplizierer hat, geht das doch ganz fix.
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.