Hallo, ich habe ein kleines Problem. Und zwar errechne ich mir Werte im DSP und gebe diese dann über den DAC aus. Z.B. Sinusschwingung. Soweit funktioniert alles, nur ist meine Frequenz niedriger als ich sie erwarte. Hier der Pseudocode: i=0; updateRate=93000; // 0.093 MSPS f=50; // 50 Hz while(i<93000){ Wert= 1024 * sin(2*PI*f*i/updateRate)+1024; Ausgabe über DAC mittels SPI; i++; } Vielen DANK schonmal für eure Hilfe. Gruß Frank
Wie stellst du denn sicher, dass die Schleife in genau einer Sekunde durchlaufen wird? Wie hoch/niedrig ist denn deine Ausgangsfrequenz? Ein paar mehr Infos wären hilfreich. Grüße
Exakte Frequenzen erhältst du nur mit ordentlichen Timing. Schon die Angabe updateRate=93000; // 0.093 MSPS ist nicht korrekt, da du nicht genau weißt wie viele CPU-Takte für den kompletten Schleifendurchlauf benötigt werden. Generell wird so etwas über Timer-Interrupts gelöst. Allgemein würde das so aussehen:
1 | frequenz = 50; //Frequenz fs des Ausgangssignals in Hertz |
2 | samples = 1000; //Anzahl der Samples pro Periode |
3 | CPU = 50MHz; //CPU Frequenz |
4 | |
5 | sample_ctr = 0; //globaler sample counter = 0 |
6 | |
7 | int(main) |
8 | {
|
9 | SetTimer = CPU/(frequenz*samples); //Setze Teilerverhältnis des Timers |
10 | // zu CPU Takt
|
11 | |
12 | while(1;) //Endlosschleif |
13 | }
|
14 | |
15 | //Timer Interruptroutine
|
16 | ISR(TIMER) |
17 | {
|
18 | //Sinus mit 1000 Samples berechnen
|
19 | value = 1024*sin(2*pi*sample_ctr/samples); |
20 | Write_DAC(value); //aktuellen Samplewert an DAC schreiben |
21 | |
22 | //Sample-Counter bei maximalen Wert wieder auf Null setzen
|
23 | if(sample_ctr = samples) |
24 | {sample_ctr = 0;} |
25 | |
26 | }
|
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.