PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Pulsecodemodulation?!


Rebell
06.06.2005, 21:10
Wir müssen in de Schule einen PCM machen.
Dieser soll über ein in C geschriebenes Programm den Com-Port ansprechen,an dem ein Tiefpass aus Kondensator (47µF-Elko) und Lautsprecher hängt.
Entsprechend der Frequenz soll ein Ton ausgegeben werden. Das Programm und die Schaltung haben wir schon,aber irgendwie funktioniert es nicht.
Vielleicht habt ihr eine Idee...

#include <math.h>
#include <windows.h>
#include <stdio.h>
int main ()
{
/* Definitionen*/

DWORD wb;
HANDLE hCom;
DCB dcb;
FILE *handle;
int Data[115200], n, p, nr, frequenz, perioden;
double sinwert;

/* Einstellung f. File & COM */

handle = fopen("sin.txt","w");
hCom = CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);

dcb.BaudRate = CBR_115200; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit


perioden = pow(10,6);
frequenz = 100000;
nr = 115200/frequenz;

/* Berechnung der Sinuswerte */

for (n=0; n < nr; n=n+1)
{
sinwert = sin (2*M_PI * n/(double)nr);
Data[n] = 128 + floor(100 * sinwert + 0.5);
fprintf(handle,"%d\t%g\t%d\n",n,sinwert,Data[n]);
}

/* Ausgabe in File & COM */

for(p=0; p<perioden; p+=1)
{
unsigned char wert;
for (n=0; n < nr; n=n+1)
{
wert = Data[n];
WriteFile(hCom, &wert , sizeof(wert), &wb, 0);
}
}
printf("Ende!");
getchar();
return 0;
}


Eigentlich müsste es gehen,denn unser Lehrer hat uns ein Buch gezeigt da steht ein Visual Basic Code drinnen der funzen müsste...

Private Sub Command1_Click()
Dim Dat(10000)
pi = 3.1415
freq = Val(Text1.Text)
Nr = Int(11520 / freq)
For n = 1 To 10 * Nr
Dat(n) = 128 + Int(100 * Sin(2 * pi * n / Nr))
Next n
out = 128
For n = 1 To 10 * Nr
out = out + 5
Data = Dat(n)
Bit = 1
send = 0
For i = 1 To 8
If Data < out Then
send = send + Bit
out = out - 5
Else
out = out + 5
End If
Bit = Bit * 2
Next i
out = out - 5
Dat(n) = send
Next n
REALTIME
For n = 1 To 100
For i = 1 To 10 * Nr
SENDBYTE 2, Dat(i)
Next i
Next n
NORMALTIME

End Sub

Private Sub Form_Load()
OPENCOM 2, 115200, 0, 8, 1, 100, 100
DTR 2, 1
RTS 2, 1
End Sub

Private Sub Form_Unload(Cancel As Integer)
CLOSECOM 2
End Sub


Also:
es funzt nicht:

Es kommt ein ziemlich konstanter "Ton" (eher ein Rauschen) aus dem Lautsprecher, egal ob der Wert frequenz verändert wird.

Der code ausm buch is net von mir,der andere schon. Zuerst hab ich mit den Leuten aus meiner Gruppe den Visual Basic Code in C versucht umzuschreiben... und jetzt haben wir das Proggi so verändert,wie es sich logisch anhört,aussieht,wie auch immer =)

Es soll einen Ton entsprechend der Frequenz ausgeben.

Unser Lehrer is ein bissi inkompetetnt und kann uns net helfen =/ (ich glaub er hats net mal ausprobiert)

Muss man da maybe irgenwie was mit bitweisem verschieben machen? wenn ja,wie geht das?


Marek Swierzy
07.06.2005, 08:07
Ich werde den Code heute abend mal ausprobieren.
Um was für ein Betriebssystem handelt es sich ?
Bei XP/2000 hast du keinen direkten zugriff auf die Hardware.
Stichwort : HAL (Hardware Application Layer)


greetz

FireBird2002
07.06.2005, 16:24
Irgendwie kann ich mir nicht vorstellen, dass das wie beschrieben funktioniert. Wenn am COM-Port nur ein Elko und der Lautsprecher hängt, wird es dir wegen der Stromaufnahme wohl den COM-Port verbruzeln, außerdem mag der Lautsprecher Gleichstrom nicht besonders.

Des Weiteren kann eine PCM ohne weitere Beschaltung nicht funktionieren, da man ein Symbol ohne Analog/Digitalwandler nicht demodulieren kann. Vielleicht meinst du eine Pulsweitenmodulation (PWM). Damit kann man mit einem Tiefpass eine Analoge Spannung erzeugen.

Rebell
08.06.2005, 16:40
Win 2k