Jespers DDS 100ms an 100ms aus

Gast #2521487
Lesenswert?

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
#2521496
Lesenswert?

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.
Gast #2521524
Lesenswert?

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
#2521632
Lesenswert?

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.
#2521838
Lesenswert?

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
Gast #2521879
Lesenswert?

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
#2522357
Lesenswert?

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
Gast #2522644
Lesenswert?

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.
#2523014
Lesenswert?

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
Gast #2524069
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren