Forum: Mikrocontroller und Digitale Elektronik Jespers DDS 100ms an 100ms aus


von Cheffe (Gast)


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

von Karl H. (kbuchegg)


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.

von Heinz (Gast)


Lesenswert?

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

von Cheffe (Gast)


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

von Heinz (Gast)


Lesenswert?

2 Widerstände, die die Spannung auf Ub/2 halten könnten das Problem 
lösen.

von Cheffe (Gast)


Lesenswert?

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

von Heinz (Gast)


Lesenswert?

So habe ich es mir gedacht.

              o Ub
              |
         ||   R 100 K
R2R -----||---o
         ||   R 100 K
        C     |
              - GND

von Peter R. (pnu)


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.

von Heinz (Gast)


Lesenswert?

@Peter

Du hast natürlich recht: der Sinus muss bei 0 Grad einsetzen und 
aufhören.

von Jobst M. (jobstens-de)


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

von Cheffe (Gast)


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

von Werner (Gast)


Lesenswert?

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.

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Werner schrieb:
> Du brauchst einen Nulldurchgangsschalter

Nö. Siehe Bild.


Gruß

Jobst

von Jobst M. (jobstens-de)


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

von Peter R. (pnu)


Lesenswert?

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.

von Karl (Gast)


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.

von Jobst M. (jobstens-de)


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

von Cheffe (Gast)


Lesenswert?

Moin. ich möchte kein AM. Ich möchte 100ms sauberen knackfreien Sinus 
und danach 100ms nichts hören.

Gruß Cheffe

von Jobst M. (jobstens-de)


Lesenswert?

Ich möchte ein Rad. Aber es darf nicht rund sein.


Gruß

Jobst

von Cheffe (Gast)


Lesenswert?

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

von Karl (Gast)


Lesenswert?

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

von Cheffe (Gast)


Lesenswert?

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

von Werner (Gast)


Lesenswert?

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ß

von Cheffe (Gast)


Lesenswert?

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

von Cheffe (Gast)


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

von ... (Gast)


Lesenswert?

Je schneller du Ein- bzw. Ausschaltest (Flankenform), um so knacks.

Da darf also kein scharfer Knick in deinem Signal sein

von Helmut S. (helmuts)


Lesenswert?

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
Noch kein Account? Hier anmelden.