Hallo miteinander, Ich verwende das STM32F4 discovery, middleware 7.0.0 und CMSIS 4.5.0. Über einen externen ADC will ich Daten mit 192kHz (24bit) samplen und über I2S an den uC senden. Dann will ich die Daten über einen TCP Socket an der PC schicken und mit Matlab weiterverarbeiten. Um das zu 'simulieren' verwende ich gerade den DAC+Timer7+DMA+lookup table um einen 2kHz Sinus zu erzeugen und verbinde das Signal direkt mit dem ADC des uC (A0). Dort sample ich die Daten mit ca. 20kHz und schicke sie über DMA in ADCbuffer (32bit). Die Daten in ADCbuffer sehen dann so aus: 0x00000xxx. ADCbuffer hat 500 32bit Werte. Ich benutze dann die callbacks void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) { osSignalSet(tid_Thread_TCP, 2U); } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { osSignalSet(tid_Thread_TCP, 3U); } Um erst die ersten 1000 bytes zu versenden und dann die zweiten 1000 bytes. Dafür läuft der thread TCP_thread. #define TCP_LENGTH 1000 uint8_t *sendbuf1; uint8_t *sendbuf2; int Init_Thread_TCP (void) { tid_Thread_TCP = osThreadCreate(osThread(Thread_TCP), NULL); if (!tid_Thread_TCP) return(-1); return(0); } void Thread_TCP (void const *argument) { while (1) { osSignalWait(2U, osWaitForever); // Wait for signal while (!netTCP_SendReady (tcp_sock)) {} sendbuf1 = netTCP_GetBuffer (TCP_LENGTH); memcpy (sendbuf1, &ADCBuffer[0], TCP_LENGTH); netTCP_Send(tcp_sock,sendbuf1,TCP_LENGTH*sizeof(uint8_t)); osSignalWait(3U, osWaitForever); // Wait for signal while (!netTCP_SendReady (tcp_sock)) {} sendbuf2 = netTCP_GetBuffer (TCP_LENGTH); memcpy (sendbuf2, &ADCBuffer[TCP_LENGTH/4], TCP_LENGTH); netTCP_Send (tcp_sock, sendbuf2, TCP_LENGTH*sizeof(uint8_t)); } In Matlab überspringe ich dann die Nullen und setze die bytes wieder zusammen. Ich erhalte einen Sinus, allerdings weist dieser an verschiedenen Stellen Phasensprünge auf (Anhang). Ich denke dass das daran liegt, das der TCP socken zu lange braucht um wieder bereit zu sein und der buffer ADCbuffer dann überläuft. Meinen Fragen daher: Kann es sein dass die TCP Verbindung zu langsam ist? Ich sample ja nur mit 20kHz. Später will ich mit mindestens 200kHz samplen. Ist dies theoretisch möglich? Brauche ich einen Zwischenbuffer? Wenn ich einen Zwischenbuffer hätte, würde dieser dann bei höheren Samplefrequenzen nicht überlaufen? Könnten Sie mir bitte weiterhelfen. Vllt sogar ein Beispiel schicken. Leider finde ich nämlich nichts vergleichbares online. Vielen, vielen Dank schon mal
Anderle K. schrieb: > void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) > { > osSignalSet(tid_Thread_TCP, 2U); > } > void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) > { > osSignalSet(tid_Thread_TCP, 3U); > } Bitte denk dran, dass du hier nicht die Bitnummer übergibst, sondern eine Bitmaske! Also hier besser 0x1, 0x2, 0x4, 0x8, etc. verwenden. Das Discovery Board hat ja zunächst mal kein Ethernet. Welchen Adapter verwendest du, und wie hast du ihn angeschlossen?
Anderle K. schrieb: > Kann es sein dass die TCP Verbindung zu langsam ist? Ich sample ja nur > mit 20kHz. Später will ich mit mindestens 200kHz samplen. Ist dies > theoretisch möglich? Brauche ich einen Zwischenbuffer? Wenn ich einen > Zwischenbuffer hätte, würde dieser dann bei höheren Samplefrequenzen > nicht überlaufen? Ein Standard TCP nimmt die Daten aus deinem ADC-Buffer und speichert diese in einen eigenen Output Buffer. Einen Zwischenpuffer solltest du also nicht benötigen, wenn das TCP vernünftig große Buffer hat. 192kHz * 32bit etwas über 3Mbit (3072kBit). dazu noch grob geschätzte 20% TCP Overhead macht das dann rund 3,7Mbit. Das sollte sogar mit einem ENC28J60 funktionieren. Nimmt man den Onboard Ethernet, schafft man mit einem perfekt eingestellten lwIP etwa 50Mbit. Ich schaffe mit meinem selsbtgeschriebenen TcpIpStack bis zu 90Mbit.
Danke für die Antwort. Ok also theoretisch ist es schon mal möglich. Das ist gut. Ich weis leider sehr wenig über die Funktionen die ich verwende. Ich kann sie mir nicht anschaun und in der Dokumentation steht für meinen Geschmack zu wenig. Einstellen kann ich nicht mehr als die thread stack sizes und und die Größe des Memory Pools (<64000bytes). Was mit den Daten passiert nachdem ich sie an TCP_send übergeben habe weis ich leider nicht. Naja. Mit der Keil middleware hat keiner Erfahrungen gemacht?
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.