Forum: Projekte & Code Sinusgenerator mit PSoC 4


von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Dieses Projekt wurde für den PSoC 4 Prozessor CY8C4225AXI-483 
erarbeitet, der zum CY8CKIT - 049-42xx gehört.

Zielstellung: Sinussignal im NF- Bereich erzeugen (8 Bit DDS)

Darüber hinaus kann ein Doppelton erzeugt werden, 1100 Hz + 700 Hz

Mittels Drehencoder kann eine Einzelfrequenz eingestellt werden.

Auch die Ausgabe eines Sweeps (50 Hz .. 1800 Hz) ist möglich. Dabei 
ist ein exponentieller Frequenzverlauf programmiert.

Die einzelnen Funktionen werden über den eingebauten Button angewählt.
Eine LED blinkt proportional zur eingestellten Frequenz.

Für PSoC 5 /5LP wurde ein gleichartiges Projekt erstellt, welches 
allerdings beim Doppelton mit 2- mal 8 Bit DDS arbeitet. PSoC 4 hat nur 
einen 8- Bit IDAC, der zweite kann nur 7 Bit.

Das Projekt enthält außerdem einen Bootloader.

: Bearbeitet durch User
von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mir sind folgende Verbesserungen eingefallen:

1. Verdopplung der maximalen Frequenz auf Kosten der Stützstellenzahl
2. Kalibrierungsmöglichkeit über ein extra Menü
3. Synchronisation mit einem externen Quarztakt

Punkt 1 ist in der neuen main.c realisert.

Hat jemand noch andere Wünsche/ Vorschläge?

von Reiner W. (reiner_w)


Lesenswert?

DH1AKF K. schrieb:
> Hat jemand noch andere Wünsche/ Vorschläge?

Hallo Wolfgang,

mir sind noch einige Dinge aufgefallen, die dir vlt. nützen können.

1. auf Printchar() und PrintInteger() kannst du verzichten, wenn du 
sprintf() einsetzt. Das sollte dann auch etwas flexibler sein.
Da CYPRESS die stdio.h ausdrücklich nicht empfiehlt, hab ich den 
Prototype in der main
1
/---------prototypes 
2
int sprintf(char *str, const char *format, ...);

Nur floats kannst du damit nicht verwenden. Geht zwar auch (per Linker 
Flag), aber da bricht dir der Speicher zusammen. Für ints aber klasse.

Beispiel für int Ausgabe mit 2 Nachkommastellen
1
#define VALUE_LEN 7
2
uint32 value = 1234567;
3
char outstring [VALUE_LEN+1];
4
sprintf(outString, "%3ld,%02d",  //3 Vorkomma ohne führende 0, 2 Nachkomma  
5
                    value/100,    // pre-decimal place
6
                    value%100);   // post-decimal place
7
8
// outstring dann per LCD_PrintString()

2. Einsatz Drehgeber
1
  QuadDec_1_Start();
2
  QuadDec_1_WriteCounter(50); 
3
  QuadDec_1_TriggerCommand(QuadDec_1_MASK, QuadDec_1_CMD_RELOAD);

Der WriteCounter() muss nach dem TriggerCommand() stehen, sonst hat er 
keine Wirkung. Die Zeile kannst du streichen, weils auch so geht.
Ich bin noch nicht komplett dahintergestiegen, was du mit dem 
decoderCounter machst;-)
Jedenfalls kann er bei dir nur die Werte bis max. 50 annehmen. Wenn du 
das so willst, sollte auch ein
1
#define MAXCOUNT 50
2
#define COUNT_CORRECTION  0x8000%MAXCOUNT //0x8000 is standard counter on start
3
4
uint8 myCouunt = 0
5
...
6
7
myCouunt = (QuadDec_1_ReadCounter() - COUNT_CORRECTION) % MAXCOUNT;
8
9
freq1+= myCount;

reichen, da bauchst du weder WriteCounter() noch getencoder().

Ich muss gestehen, ich hab das jetzt mal so geschrieben ohne es getestet 
zu haben. Also siehs als Anregung.

Gruß und frohes Schaffen
Reiner

Habs grad noch mal geändert. Jetzt steht myCount beim Einschalten auch 
immer auf 0;-)

: Bearbeitet durch User
von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo Reiner,
vielen Dank für Deine Anregungen! Nr. 1 (sprintf) konnte ich gut 
verwenden, aber mit Nr. 2 hatte ich keinen Erfolg.

Es gibt nun ein paar Neuerungen:

1. Anschluss eines Quarzoszillators an P0[6] (48 MHz), LCD an Port 
2[6:0]

2. Doppelton nun mit 1200 Hz und 750 Hz, weil sich diese Frequenzen sehr 
gut mit 48000000 Hz und Teiler 128 bzw. 100 vertragen. Sie sind 
disharmonisch, um Intermodulation am SSB- Sender feststellen zu können.

3. Sweep von 50 bis 1800 Hz (128 Stützstellen)

4. Sweep von 100 bis 3600 Hz (64 Stützstellen)

5. Frequenz 1000 Hz mit Einstellmöglichkeit (ca. 1 Hz - Schritte) und 
Anzeige auf 3 Kommastellen genau

6. Frequenz 440 Hz exakt (glücklicherweise lässt sich die benötigte
   Clockfrequenz 14080 kHz genau einstellen) 14080 = 128 x 250 x 440

Was noch fehlt, ist eine Kalibriermöglichkeit. Der Quarzoszillator hat 
nur garantierte 100 ppm.

: Bearbeitet durch User
von Reiner W. (reiner_w)


Lesenswert?

DH1AKF K. schrieb:
> aber mit Nr. 2 hatte ich keinen Erfolg

Na immerhin 505 ;-) Wenn du das Thema weiter verfolgen willst, schreib 
einfach, wo es hakt.

Muss mir erst mal ein paar 48MHz Quarze besorgen, dann kann das Projekt 
weiterverfolgen.

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Reiner W. schrieb:
> Muss mir erst mal ein paar 48MHz Quarze besorgen

Es kann nur ein Quarzoszillator angeschlossen werden!! Siehe Foto.

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Messergebnisse:
gemessen mit Soundkarte ASUS Xonar D2 und dem Programm Audiometer von 
DG8SAQ

1. 440 Hz Einzelton 8 Bit D/A, 128 Stützstellen, ohne weitere Filter

2. Doppelton 750 Hz / 1200 Hz, die 1200 werden mit 7 Bit und 100 
Stützstellen erzeugt.

von DH1AKF W. (wolfgang_kiefer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Fehler behoben. Das 1000 Hz- Signal war unsauber.

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.