Форум ZETLAB

Архив обсуждений, технических вопросов и ответов по оборудованию, программному обеспечению и внедрению измерительных систем.

Страницы: Пред. 1 2
RSS
Вопросы по 230-му модулю
 
Здравствуйте, Виталий! Очередной раз проверил пример Test_DAC для ZET230 при подключении его и по USB и по Ethernet - все работает так, как и заложено. Ваши проблемы могут быть связаны со следующими факторами: 1) При работе с устройством самостоятельно через драйвер не рекомендуется использовать программы из пакета ZETLab, поскольку при этом запускается сервер данных ZETLab, который самостоятельно конфигурирует устройства, а следовательно, может остановить ЦАП или АЦП, настроить другие параметры и т.д., что приведет к сбою в работе Test_DAC. 2) Если же вы все-таки решите использовать устройство в режиме работы с драйвером и при этом пользоваться программами из пакета ZETLab, то в программе, работающей через драйвер необходимо предусмотреть дополнительные возможности для отслеживания останова ЦАП, АЦП и других изменений в устройстве, поскольку сервер данных ZETLab может их изменять. 3) Нужно проверить то, с какого контакты вы смотрите сигнал генератора (это на всякий случай). Удачи!
 
Спасибо за ответ! По ходу работы возник еще вопрос: заметили что показания напряжения на входе 230-го модуля, рассчитанное нашей программой, работающей через zadc.dll отличается от показаний программ комплекса ЗетЛаб примерно на 6-7% (меряем величины порядка 450 мВ). Наша программа показывает больше на 30мВ. Перепроверено неоднократно. Рассчитываем по формуле,заимствованной из примеров: volt0 = resolutionADC * (pBuffer32ADC[pointerADC/numWordsADC]) / amplifyADC0 Скажите, в чем может быть проблема? Есть ли еще какие-нибудь параметры, влияющие на рассчет напряжения? Заранее спасибо за ответ.
 
Здравствуйте, Виталий! На расчет напряжения могут влиять параметры чувствительности и смещения, настроенные через "Диспетчер устройств" Удачи!
 
Скажите пожалуйста, могу ли я получить эти параметры (чувствительность и смещение) через zadc.dll, как например получаю вес младшего разряда с помощью функции ZGetDigitalResolChanADC и рассчитать значение напряжения используя только функции предоставляемые zadc.dll. Заранее спасибо за ответ!
 
Здравствуйте, Виталий! Эти параметры в zadc.dll не имеют места быть, поэтому вы их оттуда никак не возьмете. Эти параметры есть только в ZETServer. В zadc.dll предоставлена возможность работать только с исходными данными. Все их преобразование в измеряемую величину осуществляется в ZETServer. Удачи!
 
В очередной раз перепроверили: показания Зетлаба = 432 мВ. Снимаем данные: младший разряд АЦП=0.00000000488944351673 код АЦП = 95070036 коэфф. усиления = 1 Пожалуйста объясните как из этих данных получается 432 мВ? Заранее спасибо за ответ.
 
Здравствуйте, Виталий! Из тех данных, что вы предоставили, никак не получается 432 мВ. Для большей информативности прошу вас прислать на почту настройки вашего измерительного канала в ZETLab и желательно запись сигнала, который вы измеряете. Удачи!
 
Здравствуйте! Я знаю что не получается, но тем не менее вольтметр Зетлаб показывает именно это значение. Вы не могли бы уточнить алгоритм перевода кода АЦП в напряжение? Сообщите на какой е-мэйл выслать скриншоты и запись сигнала. Заранее спасибо за ответ!
 
Здравствуйте, Виталий! Формула перевода приведена в примере, и она ничем не отличаетя от той, что в ZETLAB. Почта info@zetlab.com или zetlab@zetlab.com. Удачи!
 
Здравствуйте, Антон! Файлы отправил.
 
Здравствуйте! Модули мы не путаем, просто Зетлаб показывает одно - правильное значение, а при обращении к библиотеке получаем код АЦП, вес младшего разряда и коэффициент усиления - при их перемножении получается другое значение, погрешность относительная, не абсолютная.
 
Здравствуйте, Виталий! Скажите, данный эффект проявляется только на одном канале конкретного модуля или это проявляется на всех каналах всех модулей? Удачи!
 
Здравствуйте! Сдалали тестовую программку для измерения напряжения на канале, ее код (ничего лишнего, только опрос): //==========================================================­================================ #include "stdafx.h" #include <Windows.h> #include "Zadc_int.h" #include <stdio.h> #include <conio.h> class Z230Device { public: long err; long typeDevice; long numberDSP; long numChannelsADC; // Кол-во включенных каналов АЦП long numWordsADC; // Кол-во слов (по два байта) в одном отсчете АЦП void *pBuffer; // Указатель на начало буфера драйвера типа void short *pBuffer16ADC; // Указатель на начало буфера драйвера для АЦП с разрядностью не более 16 бит long *pBuffer32ADC; // Указатель на начало буфера драйвера для АЦП с разрядностью более 16 бит long sizeBufferADC; // Размер буфера драйвера в словах long pointerADC; // Указатель на текущий элемент заполнения буфера драйвера (кратен 2) long pointerADC_old; // Предыдущее значение указателя на буфер драйвера double amplifyADC[4];// Коэф. усиления по каналам double resolutionADC; // Вес младшего разряда АЦП double volt[4]; // Мгновенное текущее значение АЦП (в Вольтах) double freq; //частота задатчика синхронизации }; //==========================================================­==================== HINSTANCE dllHandle=NULL; Z230Device devs[1]; //------------------------------------------------------------------- int numDev=0; //==========================================================­========= long Init230(long numDev,long typeDev, long number_DSP, long err) { devs[numDev].typeDevice=typeDev; devs[numDev].numberDSP=number_DSP; dllHandle = LoadLibrary(L"zadc.dll" ;) ; // подключиться к драйверу (обязательно) err = ZOpen(devs[numDev].typeDevice, devs[numDev].numberDSP); // опросить коэф. усиления по каналу АЦП err = ZGetAmplifyADC(devs[numDev].typeDevice, devs[numDev].numberDSP, 0, &devs[numDev].amplifyADC[0] ;) ; err = ZGetAmplifyADC(devs[numDev].typeDevice, devs[numDev].numberDSP, 0, &devs[numDev].amplifyADC[1] ;) ; err = ZGetAmplifyADC(devs[numDev].typeDevice, devs[numDev].numberDSP, 0, &devs[numDev].amplifyADC[2] ;) ; err = ZGetAmplifyADC(devs[numDev].typeDevice, devs[numDev].numberDSP, 0, &devs[numDev].amplifyADC[3] ;) ; // опросить вес младшего разряда АЦП err = ZGetDigitalResolutionADC(devs[numDev].typeDevice, devs[numDev].numberDSP, &devs[numDev].resolutionADC); // опросить кол-во слов в одном отсчете АЦП err = ZGetWordsADC(devs[numDev].typeDevice, devs[numDev].numberDSP, &devs[numDev].numWordsADC); // запросить буфер АЦП err = ZGetBufferADC(devs[numDev].typeDevice, devs[numDev].numberDSP, &devs[numDev].pBuffer, &devs[numDev].sizeBufferADC); // Проинициализировать локальные указатели для конкретных типов данных devs[numDev].pBuffer16ADC = (short*) devs[numDev].pBuffer; devs[numDev].pBuffer32ADC = (long*) devs[numDev].pBuffer; return 0; } //==========================================================­=============== double getValueCh(long numDev,long numCh, long err, long *CodeADC, double *ResolADC,double *AmplifADC, long *pointer) { // запросить указатель на текущий элемент буфера err = ZGetPointerADC(devs[numDev].typeDevice, devs[numDev].numberDSP, &devs[numDev].pointerADC); if(err != 0) return -1; *pointer=devs[numDev].pointerADC; // перейти на отсчет первого включенного канала последнего кадра АЦП if(devs[numDev].pointerADC - devs[numDev].numWordsADC * devs[numDev].numChannelsADC < 0) devs[numDev].pointerADC = devs[numDev].sizeBufferADC + devs[numDev].pointerADC - devs[numDev].numWordsADC * devs[numDev].numChannelsADC; else devs[numDev].pointerADC = devs[numDev].pointerADC - devs[numDev].numWordsADC * devs[numDev].numChannelsADC; *CodeADC=devs[numDev].pBuffer32ADC[devs[numDev].pointerADC/devs[numDev].numWordsADC + numCh]; *ResolADC=devs[numDev].resolutionADC; *AmplifADC=devs[numDev].amplifyADC[numCh]; // вычислить из целого значения отсчета АЦП вещественное значение отсчета (в Вольтах) if(devs[numDev].numWordsADC == 1) devs[numDev].volt[numCh] = devs[numDev].resolutionADC * (devs[numDev].pBuffer16ADC[devs[numDev].pointerADC + numCh] ;) / devs[numDev].amplifyADC[numCh]; else devs[numDev].volt[numCh] = devs[numDev].resolutionADC * (devs[numDev].pBuffer32ADC[devs[numDev].pointerADC/devs[numDev].numWordsADC + numCh] ;) / devs[numDev].amplifyADC[numCh]; return devs[numDev].volt[numCh]; } //------------------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[] ;) { long CodeADC; long pointer; double ResolADC; double AmplifADC; long err; err=Init230(0,17,67,0); err=ZStartADC(devs[0].typeDevice,devs[0].numberDSP); while(!kbhit()) { Sl eep(1000); double val=getValueCh(0,0,0,&CodeADC,&ResolADC,&AmplifADC,&pointer); printf("%i %i %.14f %.5f %.8f\n",pointer,CodeADC,ResolADC,AmplifADC,val); } ZRemBufferADC(devs[0].typeDevice, devs[0].numberDSP,&(devs[0].pBuffer)); ZClose(devs[0].typeDevice, devs[0].numberDSP); FreeLibrary(dllHandle); dllHandle = NULL; return 0; } //==========================================================­================================= Запускаем ее, и потом Вольтметр постоянного тока Зетлаб, их скрины: формат вывода программы: указатель на элемент буфера, код АЦП, вес мл. разряда. коэфф. усиления, значение в Вольтах Запускали много раз, ошибка воспроизводима и постоянна. По другим каналам этого модуля то же самое. Объясните пожалуйста как из кода АЦП=90358324 и веса мл.разряда 0,00000000488944 получить то что показывает вольтметр Зетлаба. Очень рассчитываю на помощь.
 
Здравствуйте, Виталий! Функция ZGetDigitalResolutionADC предназначена для запроса веса младшего разряда АЦП. Однако при настройке устройств данный параметр проходит калибровку и становится для каждого канала свой, поэтому запрашивать нужно откалиброванный вес младшего разряда АЦП фукнцией ZGetDigitalResolChanADC, которая уже привязана к конкретному каналу. Удачи!
 
Спасибо за ответ, будем пробовать.
Страницы: Пред. 1 2
Читают тему