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
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
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.
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:
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
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, 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