Traag?

Postby zom-b » Tue Mar 02, 2010 12:00 am

Ik heb de TAD kaart werkend gekregen en de C++ software van de auteur omgebouwd tot console applickatie zodat ik de communicatiesnelheid kan meten. En juist daat loop ik tegen grote vraagtekens.

Het maakt niet uit hie ik communiceer, ik schijn niet boven de ca 500 commando's per seconde uit te komen (250 write/read commando's)

Dit is wat ik doe: (de rest van het programma is hetzelfde als in TAD_v1_win.c van auteur)
int main(array < System::String ^ > ^args)
{
AbrirTAD();
SalidasDigitalesByteTAD(0);
SalidasAnalogicasTAD(0,511);
SalidasAnalogicasTAD(1,511);

clock_t time = clock();

for(int i=0;i < 1024;i++)
{
int j=EntradasAnalogicasTAD();
//printf("Analog0: %i\n",j);
}

time = clock() - time;
printf("time: %ims, smp/s: %f (precision: 1/%i s, 1024 samples)\n", time, (CLOCKS_PER_SEC * 1024) / (float)(time), CLOCKS_PER_SEC);

return 0;
}


Hier de testresultaten:
Analoog:

time: 4062ms, smp/s: 252.092565 (precision: 1/1000 s, 1024 samples)
time: 4078ms, smp/s: 251.103482 (precision: 1/1000 s, 1024 samples)
time: 4094ms, smp/s: 250.122130 (precision: 1/1000 s, 1024 samples)
time: 4109ms, smp/s: 249.209053 (precision: 1/1000 s, 1024 samples)
time: 4078ms, smp/s: 251.103482 (precision: 1/1000 s, 1024 samples)

Digitaal:

time: 4094ms, b/s: 250.122130 (precision: 1/1000 s, 1024 bytes)
time: 4093ms, b/s: 250.183240 (precision: 1/1000 s, 1024 bytes)
time: 4094ms, b/s: 250.122130 (precision: 1/1000 s, 1024 bytes)
time: 4093ms, b/s: 250.183240 (precision: 1/1000 s, 1024 bytes)
time: 4078ms, b/s: 251.103482 (precision: 1/1000 s, 1024 bytes)


Nou heb ik met de oscilloscoop gekeken wat er daadwerkelijk over de USB lijnen word gecommuniceerd, en het blijkt dat als de driver is geactiveert door mijn software dat er 1000 pakketjes per seconde langskomen. De pakketjes hebben zo'n grote tussentijd dat ik alleen maar een trein van naalden zie op het beeld.

Dat het er 1000 per seconden zijn vind ik ook raadselachtig, want hoe kan je dan sneller data uitwisselen met de kaart dan dat? pjongen vertelde mij gisteren nog dat de kaart snel genoeg zou zijn om audio op te nemen van een of twee van de DAC lijnen.


Edit: Waarom interpreteert de [ code ] tag de tekens < en > als HTML?? wat een onzin!
zom-b
 
Posts: 14
Joined: Thu Jan 02, 2014 3:34 pm

Postby pjongen » Tue Mar 02, 2010 12:00 am

250 samples per seconde met deze soft- en firmware over USB is eigenlijk heel goed. Dat is geen beperking van de PIC maar van het gekozen protocol en Windoos.

Bij de DA host software moet voor ieder sample een commando sturen. Daarop antwoordt de Firmware met de gevraagde waarde. Dat gaat met buffers van 64 bytes. (terwijl de payload maar 4 bytes is). Dat is niet zo erg handig als je snel wil samplen. Dat is ook niet handig als je wil dat de samples met een vaste timing worden genomen. Dat kun je nooit op deze manier realiseren.

Btw: Ik heb met mijn HID experimenten >500 gehaald, maar met deze setup hoef ik géén commando te sturen omdat de PIC dan zelfstandig kan besluiten een buffer te sturen. (Event driven).

Als je meer samples wil hebben van de analoge poort zullen we de microcode moeten aanpassen. Dat zou als volgt kunnen:

Een vaste interupt sampled periodiek een analoge poort en zet de resultaten in een buffer. Dat buffer (64 bytes) kan dat 30 samples bevatten van 10 bits (2 bytes) of 60 samples van 8 bits. Per read request haal je zo dus 250 * 30 (of 60)samples binnen. Door gebruik te maken van dubbel buffering in de PIC hoeft geen byte verloren te gaan.
Bij gebruik van de event driven HID software verdubbelt dat dus.

Het zou misschien nog wel sneller kunnen, maar dat moeten experimenten uitwijzen.

Ik wil de interupt sampling wel voor je programmeren in de FW. Ik ben zelf ook wel benieuwd hoe snel ik zou kunnen samplen en naar de PC sturen.

Wat jij eerst moet beslissen is met welke host software je gaat werken en ook of je Driver of HID gestuurd wil werken.

Ik heb overigens een commando gemaakt waarbij je met één request in één keer alle 8 de analoge poorten leest. Maar dat lost jouw probleem niet op.
pjongen
 
Posts: 64
Joined: Thu Jan 02, 2014 3:37 pm

Postby zom-b » Tue Mar 02, 2010 12:00 am

De pic aanpassen om volle buffers te sturen zal ook niet helpen. Voor analoog haal je dan toch maar 7500 samples per seconde, en voor digitaal I/O is het onmogelijk.

Bijvoorbeeld, stel ik wil een OneWire chip gebruiken, dan moet ik met een resolutie van 10 microseconde (100kHz) twee bits ontvangen, waarna ik afhankelijk van de gelezen bits weer een bit stuur, en dat 64 keer snel achter elkaar. (Op hardwareniveau komt een 0 overeen met 90us laag, 10us hoog, en een 1 vice versa)

Dan kan je zeggen, maar je kan daarvoor gewoon een gespecialiseerde routine in de PIC zetten, maar dat wil ik dus niet. Ik wil gewoon een general-purpose I/O kaart hebben zodat ik straks niet alleen OneWire aan kan maar ieder denkbaar protocol, zonder al die protocollen in te bouwen in de PIC.
zom-b
 
Posts: 14
Joined: Thu Jan 02, 2014 3:34 pm


Return to 2007-11 USB data-acquisitiekaart

Who is online

Users browsing this forum: No registered users and 1 guest