Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


синхронный ввод/вывод АЦП/ЦАП на E14-140M

Вы не вошли.

 Поиск | Регистрация | Вход 

kopot
04.09.2011 19:17:53
#1

Гость

синхронный ввод/вывод АЦП/ЦАП на E14-140M

Задача - синхронный вывод на ЦАП +5В и оцифровка этих данных на АЦП, канал 0.
Текст программы:
       // установка:
       // DacPars.SyncWithADC=1;
       // DacPars.SetZeroOnStop=0;
       // DacPars.DacRate=25;
       // AdcPars.ChannelsQuantity=1;
       // AdcPars.ControlTable[0]=0;
       // AdcPars.AdcRate=25;
       // AdcPars.InterKadrDelay=0;
       // AdcPars.KadrRate=25;
    i=OpenLCardDevice();

    pModule->Vtbl->STOP_ADC(pModule);
    pModule->Vtbl->STOP_DAC(pModule);
    pModule->Vtbl->START_ADC(pModule);
    pModule->Vtbl->START_DAC(pModule);

   ovread.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ovwrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    irqread.Overlapped=&ovread;
    irqread.Buffer=adcbuf;
    irqwrite.Overlapped=&ovwrite;
    irqwrite.Buffer=dacbuf;
    irqwrite.NumberOfWordsToPass=50000;
    irqread.NumberOfWordsToPass=25000;
    for(i=j=0;i<25000;i++) { dacbuf[j++]=32767; dacbuf[j++]=0; };
    i=pModule->Vtbl->WriteData(pModule,&irqwrite);
    t=clock();
    if(i==0) printf("WriteData error %d//n");
    i=pModule->Vtbl->ReadData(pModule,&irqread);
    if(i==0) printf("ReadData error %d//n");
    WaitForSingleObject(ovread.hEvent,10000);
    GetOverlappedResult(hModule,irqread.Overlapped,&j,FALSE);
    printf("time=%.3f nbytes %d adc=%d %d %d %d//n",(float)(clock()-t)/CLK_TCK,j,adcbuf[0],adcbuf[1],adcbuf[2],adcbuf[3]);
    printf("wait 5sec...");
    Sleep(5000);   // подождем 5 сек и посмотрим что будет на ЦАП
    printf("OK!//n");

    pModule->Vtbl->STOP_ADC(pModule);
    pModule->Vtbl->STOP_DAC(pModule);

    CloseLCardDevice();


На выходе имеем:
    Данные АЦП: -18 -19 -17 -18 Время 1.000 сек nbytes=49984
Показания тестера: одну секунду - 5В, затем - 0
Что я ожидал:
    Данные АЦП: 4095 4095 4095 4095 nbytes=50000
Показания тестера: 5В в течение 6 сек точно, да и дальше 5В, раз стоит SetZeroOnStop=0
Библиотека lusbapi версии 3.4

Что не так в моих умозаключениях?

kopot
06.09.2011 17:33:37
#2

Гость

Re: синхронный ввод/вывод АЦП/ЦАП на E14-140M

Мои ошибки:
1) Длина передаваемого блока должна быть кратна 256, а я передавал 50000.
2) И оцифровка, и выдача на ЦАП начинаются с START_ADC, но к этому времени данные ЦАП еще не отправлены.
3) Лучше не посылать данные на ЦАП блоками больше 8192 слов (сколько помещается в буфере платы)

В итоге сработала следующая схема отправки на ЦАП длинных профилей:
1) посылаем на ЦАП 8192 слова
2) ждем окончания операции
3) START_ADC
4) запускаем чтение 4096 слов данных - это достаточно длинная операция
5) пока идет чтение, готовим и посылаем на ЦАП следующие 8192 слова
6) ждем окончания этой операции и выдаем запрос на чтение очередных 4096 слов
7) дожидаемся окончания первого чтения и разбираем полученные данные. Тем временем плата занимается вторым чтением - тоже длинная операция. После разбора данных формируем третью посылку на ЦАП и т.д.

12.09.2011 11:25:33
#3

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: синхронный ввод/вывод АЦП/ЦАП на E14-140M

Или можно сделать несколько потоков. Вообще про программирование ЦАП E140-140-MD советую прочитать http://www.lcard.ru/download/e14_140m_addendum_dac.pdf
Текст довольно громоздкий, но он содержит исчерпывающее описание всех режимов ЦАП и советы по их использованию.