|
|
получение данных с АЦП(е14-140 builder)
//-- -------------------------------------------------------------------------
// Получения данных с АЦП
//-- -------------------------------------------------------------------------
void __fastcall TMainForm::GetDataFromADC()
{
NumbersOfPointsInArrays=0;
DWORD i;
// Обработка данных с одного канала
for(i = 0x0; i < PointsToRead; i+=0xC) {
// значение поступаемое с АЦП и скорректированное
Um1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+7])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+9])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+11])*B*C)/ChannelPoint;
if (prSignalSource) fprintf(fil, "%f %f %f %f //n",Um1xDamp[NumbersOfPointsInArrays],Ur1xDamp[NumbersOfPointsInArrays],Um2xDamp[NumbersOfPointsInArrays],Ur2xDamp[NumbersOfPointsInArrays]);
NumbersOfPointsInArrays++;
}
}
хочу получить с 1 8 10 и 12 каналов.
Правильно такое? Просто на 12 канале у меня ничего нет. В поверграфе смотрю - тупо линия. У себя в проге смотрю он синусоиду выводит... Не понятно.
|
|
|
Re: получение данных с АЦП(е14-140 builder)
Может я что то перепутал? на АЦП 16 каналов же? 1 8 10 и 12 заняты. Может я чето напутал с ControlTable
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
А сможете показать, что в control table?
Вообще было бы логичнее заполнить там только используемые каналы (создать 4 логических канала, соответствующих заданным физическим). И получать кадр данных в [i+0]..[i+3]
|
|
|
Re: получение данных с АЦП(е14-140 builder)
МММ думаю тут в конце. Посмотрите...
void __fastcall TMainForm::FormShow(TObject *Sender)
{
char ModuleName[7];
WORD i;
if(!Buffer) {
Application->MessageBox(L"Не могу выделить память под буфер данных!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
Application->ProcessMessages();
// проверим версию используемой DLL библиотеки
if(GetDllVersion() != CURRENT_VERSION_LUSBAPI)
{
AnsiString ErrorMessage = "Неправильная версия библиотеки Lusbapi.dll!//n";
ErrorMessage += "Текущая: " + IntToStr((int)(GetDllVersion() >> 0x10)) + "." + IntToStr((int)(GetDllVersion() & 0xFFFF)) + " ";
ErrorMessage += "Требуется: " + IntToStr(CURRENT_VERSION_LUSBAPI >> 0x10) + "." + IntToStr(CURRENT_VERSION_LUSBAPI & 0xFFFF);
Application->MessageBox((wchar_t *)ErrorMessage.c_str(), L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
Close();
prSignalSource=false;
return;
}
// попытаемся получить указатель на интерфейс для модуля E14-140
pModule = static_cast<ILE140 *>(CreateLInstance("e140"));
if(!pModule) {
Application->MessageBox(L"Не могу получить интерфейс на модуль E14-140!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// попробуем обнаружить модуль E14-140 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
for(i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++) if(pModule->OpenLDevice(i)) break;
if(i == MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI) {
Application->MessageBox(L"Не могу обнаружить модуль //'E14-140//' в первых 127 виртуальных слотах!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
fil=fopen("date18_3_2010.txt","r");
prSignalSource=false;
timer->Enabled=true;
return;
}
// попробуем прочитать дескриптор устройства
ModuleHandle = pModule->GetModuleHandle();
if(ModuleHandle == INVALID_HANDLE_VALUE) {
Application->MessageBox(L"Не могу получить дескриптор устройства!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// прочитаем название модуля в нулевом виртуальном слоте
else if(!pModule->GetModuleName(ModuleName)) {
Application->MessageBox(L"Не могу прочитать название модуля в нулевом виртуальном слоте!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// проверим, что это //'E14-140//'
else if(StrComp(ModuleName, "E140")) {
Application->MessageBox(L"В нулевом виртуальном слоте не модуль //'E14-140//'!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// прочитаем ППЗУ модуля
else if(!pModule->GET_MODULE_DESCRIPTION(&ModuleDescription)) {
Application->MessageBox(L"Не могу прочитать ППЗУ в модуле E14-140!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// в ППЗУ прописано название модуля?
else if(strcmp(ModuleDescription.Module.DeviceName, "E14-140")) {
Application->MessageBox(L"В ППЗУ не прописано название модуля!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// проверим прошивку MCU модуля
else if((ModuleDescription.Module.Revision == REVISIONS_E140[REVISION_B_E140]) &&
(strtod((char *)ModuleDescription.Mcu.Version.Version, NULL) < 3.05)) {
Application->MessageBox(L"Для модуля E14-140(Rev.//'B//') версия прошивки ARM должна быть 3.05 или выше!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
A=ModuleDescription.Adc.OffsetCalibration[1]; //ADC_INPUT_RANGE_10000mV_E140
B=ModuleDescription.Adc.ScaleCalibration[1];
// прочитаем текущие параметры работы АЦП
if(!pModule->GET_ADC_PARS(&ap)) {
Application->MessageBox(L"Не могу выполнить функцию GET_ADC_PARS()!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION);
prSignalSource=false;
return;
}
// установим желаемые параметры АЦП
ap.ClkSource = INT_ADC_CLOCK_E140; // внутренний запуск АЦП
ap.EnableClkOutput = ADC_CLOCK_TRANS_DISABLED_E140; // без трансляции тактовых импульсо АЦП
ap.InputMode = InputMode; // режим ввода даных с АЦП
ap.SynchroAdType = SynchroAdType; // тип аналоговой синхронизации
ap.SynchroAdMode = SynchroAdMode; // режим аналоговой сихронизации
ap.SynchroAdChannel = SynchroAdChannel; // канал АЦП при аналоговой синхронизации
ap.SynchroAdPorog = SynchroAdPorog; // порог срабатывания АЦП при аналоговой синхронизации
ap.ChannelsQuantity = ChannelsQuantity; // четыре активных канала
// какое используем подключение входных каналов: диф. или с общей землей?
IsCommonGnd = false;
// формируем управляющую таблицу логических каналов
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i| (IsCommonGnd << 0x5)| (0x0));
ap.AdcRate = 100.0; // частота работы АЦП в кГц
ap.InterKadrDelay = 0.0; // межкадровая задержка в млс
// передача в модуль параметров работы АЦП
if(!pModule->SET_ADC_PARS(&ap)) { Application->MessageBox(L"Не могу выполнить функцию SET_ADC_PARS()!", L"ОШИБКА!!!", MB_OK + MB_ICONINFORMATION); return; }
// теперь можно запустить поток сбора и отображения данных
IsStartSynchroThreadDone = true;
MainForm->InitThread();
fil= fopen("date.txt","w");
// запуск потока сбора данных
timer->Enabled=true;
btnConnect->ImageIndex=0;
}
|
|
|
Re: получение данных с АЦП(е14-140 builder)
ну вот
// формируем управляющую таблицу логических каналов
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i| (IsCommonGnd << 0x5)| (0x0));
или я чего то неверно понимаю?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
Конечно, неправильно: в такой конфигурации, если ChannelsQuantity == 4, будут опрашиваться каналы 0,1,2,3 (это i в правой части присваивания)
ControlTable[] надо сформировать в соответствии с форматом управляющего слова (см. документацию). Например, для дифференциальных каналов 1, 8, 10, 12 в диапазоне 10В это будет
ap.ControlTable[0] = 0;
ap.ControlTable[1] = 7;
ap.ControlTable[2] = 9;
ap.ControlTable[3] = 11;
Режим с общей землей - добавить | 0x20
Выбор диапазона - добавить | (ADC_INPUT_RANGE_xxxmV_E140 << 6)
И еще у Вас не те калибровочные коэффициенты A, B: их надо брать по индексу диапазона, [1] в тексте соответствует второму диапазону (2500mV), для 10000 надо взять [0].
|
|
|
Re: получение данных с АЦП(е14-140 builder)
я извиняюсь за комментарий
ap.ChannelsQuantity = ChannelsQuantity; // четыре активных канала
так то у меня ChannelsQuantity=12 Просто я комментарий не исправил.
То есть вместо
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i| (IsCommonGnd << 0x5)| (0x0));
Записать
ap.ControlTable[0] = (WORD)(0| (IsCommonGnd << 0x20)| (0x6));
ap.ControlTable[1] = (WORD)(7| (IsCommonGnd << 0x20)| (0x6));
ap.ControlTable[2] = (WORD)(9| (IsCommonGnd << 0x20)| (0x6));
ap.ControlTable[3] = (WORD)(11| (IsCommonGnd << 0x20)| (0x6));
так правильно?
|
|
|
Re: получение данных с АЦП(е14-140 builder)
(IsCommonGnd << 0x5)
чему равно будет равно?
IsCommonGnd =false; же по сути.
Все правильно же
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i| (IsCommonGnd << 0x5)| (0x0));
0x0 это же коэффициент усиления.
(IsCommonGnd << 0x5) это что значит? Я читаю руководство но не понял немного. МА4 и МА5 (IsCommonGnd << 0x5) что ли.
Если у нас 8 канал например,то
i = 1000
(IsCommonGnd << 0x5) наверно будет 0100(хотя отладчик ноль показывает, если bool IsCommonGnd =false;)
i| (IsCommonGnd << 0x5| 0 = 1000|0100|0 = 1100
|
|
|
Re: получение данных с АЦП(е14-140 builder)
0x0 усиление 1 для 10 вольт. В таблице так написано(руководстве)
|
|
|
Re: получение данных с АЦП(е14-140 builder)
управляющее слово состоит из 0000 0000 0000 0000 16 бит.
i=1 поэтому 0000 0000 0000 0001
если (IsCommonGnd << 0x5) равно 10000,то сумма была бы
0000 0000 0001 0001
ну и все так как коэффициент усиления 00 для 10 вольт то такой результат и будет же. Может касяк в IsCommonGnd=false? Дык я это в примере взял...
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
Ой.
Сдвигать влево на 32 бита (<<0x20) в 16-битном слове ничего не надо Правильно <<5.
Но можно написать
#define COMMON_GND 0x20
...
ControlTable[i] = ... | ((IsCommonGnd) ? COMMON_GND : 0);
или как угодно - лишь бы результат был правильным.
В Вашем примере bool << 5 вычислится как 0 или 0x20 (исходя из true = 1, false = 0). Вообще более строго ((IsCommonGnd) ? 0x20 : 0), чтобы не привязываться к численному значению true.
Вот могу еще так предложить:
/* n = номер физического канала, начиная с 1 */
/* g = коэффициент усиления (1, 4, 16, 64)
#define E140_CHCTL_GAIN(g) ((64 == (g)) ? 0xC0 : (16 == (g)) ? 0x80 : (4 == (g)) ? 0x40 : 0)
#define E140_CHCTL_DIFFERENTIAL(g, n) (E140_CHCTL_GAIN(g) | (((n) - 1) & 0x0F))
#define E140_CHCTL_COMMONGND(g, n) (E140_CHCTL_GAIN(g) | 0x20 | (((n) - 1) & 0x1F))
#define E140_CHCTL_ZEROCALIB(g) (E140_CHCTL_GAIN(g) | 0x10)
Усиление для диапазона 10 вольт - селектор 00, все правильно. Я говорил, что калибровочные коэффициенты
A=ModuleDescription.Adc.OffsetCalibration[1]; B=ModuleDescription.Adc.ScaleCalibration[1];
надо тогда брать из [0], а не из [1].
Они зависят от коэффициента усиления.
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
И зачем Вам 12 каналов, если используется четыре?
Это даже вредно, если лишние входы висят в воздухе.
Весь смысл ControlTable в том, чтобы задать модулю опрос каналов, составляющих кадр данных, в любом порядке (можно даже с повторами).
Значит, так, по порядку.
В модуле E14-140 один АЦП. У него на входе аналоговый коммутатор и усилитель. Коммутатор выбирает пару контактов, с которых берется сигнал: для дифференциального режима (Xn, Yn), для режима с общей землей - (Xn, AGND) или (Yn, AGND), плюс есть специальный режим измерения собственного нуля (вход усилителя закорачивается на землю). Усилитель преобразует напряжение так, чтобы полному входному диапазону АЦП соответствовало 10/gain вольт на входе, где gain = 1, 4, 16 или 64.
Как нетрудно догадаться, элемент ControlTable - это и есть управляющее слово для усилителя и коммутатора.
Сбор данных устроен примерно так:
1) Взять очередное слово из ControlTable, установить усилитель и коммутатор в соответствующее состояние;
2) Оцифровать один отсчет АЦП;
3) Повторять пп 1-2, пока не кончится кадр (т.е. ChannelsQuantity раз)
4) Выдержать межкадровую задержку, если имеется
5) Начать с начала ControlTable, п.1
Таким образом, Вы можете составить кадр данных, перечислив нужные физические каналы в любом порядке, с разными коэффициентами усиления и т.д.
|
|
|
Re: получение данных с АЦП(е14-140 builder)
Так что ли?
ap.ControlTable[0] = (WORD)(0| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[1] = (WORD)(7| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[2] = (WORD)(9| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[3] = (WORD)(11| (IsCommonGnd << 0x5)| (0x0));
PointsToRead = ChannelPoint * ChannelsQuantity;
DWORD ChannelPoint = 2048;
ChannelsQuantity = 0x4;
for(i = 0x0; i < PointsToRead; i+=0x4) {
// значение поступаемое с АЦП и скорректированное
Um1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+1])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+2])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+3])*B*C)/ChannelPoint;
if (prSignalSource) fprintf(fil, "%f %f %f %f //n",Um1xDamp[NumbersOfPointsInArrays],Ur1xDamp[NumbersOfPointsInArrays],Um2xDamp[NumbersOfPointsInArrays],Ur2xDamp[NumbersOfPointsInArrays]);
NumbersOfPointsInArrays++;
}
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: получение данных с АЦП(е14-140 builder)
Немного уточню с электрической точки зрения:
- Коммутатор выбирает пару контактов, с которых берется сигнал: для дифференциального режима (Xn, Yn), для режима с общей землей - (Xn, GND32) или (Yn, GND32). Входной полезный сигнал усилителя - это разность потенциалов между указанными парами контактов. Входной НЕ полезный - это общая (синфазная) составляющая на этих парах контактов относительно AGND, эту составляющую усилитель сильно подавляет, но синфазная составляющая не должна превышать +-10 В. Важно, что для любого из этих режимов требуется подключение, как минимум, 3-х контактов:
- Для дифференциального Xn, Yn, AGND,
- Для режима с общей землёй Xn, GND32, AGND или Yn, GND32, AGND.
|
|
|
Re: получение данных с АЦП(е14-140 builder)
чет не так все равно я делаю. на все каналах одно и тоже снимаю. То есть Um1xDamp,Ur1xDamp,Um2xDamp,Ur2xDamp одинаковые почти.
бррр... в PowerGrpah 1 канал ваще линия(ризестр стоит), у меня синус 10-ти вольтный... где то накасячил понять не могу где.
|
|
|
Re: получение данных с АЦП(е14-140 builder)
Ради эксперимента оставил только
ap.ControlTable[0] = (WORD)(0| (IsCommonGnd << 0x5)| (0x0));
все нормально, линию вывел, но стоит например
ap.ControlTable[0] = (WORD)(0| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[1] = (WORD)(7| (IsCommonGnd << 0x5)| (0x0));
подключить ещё канал. А выводить данные как прежде, то уже какая-то каша .... -3000 до 3000 скачет туда сюда. Хотя же тупо линия должна быть. Такое чувство что в ControlTable чето не то пишу... Чет даже идей нет из-за чего такая штука.
|
|
|
Re: получение данных с АЦП(е14-140 builder)
8 канал в воздухе висит. Может из за этого такая хрень?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
Ну что переменные используются выше, чем определяются - я так понимаю, это Вы просто не по порядку скопировали в сообщение?
Коэффициенты A и B исправили, чтобы брались для правильного диапазона?
Зачем делите отсчеты на количество точек (ChannelPoint)? Впрочем, это неважно.
Какие типы переменных A, B, C, ReadBuffer, выходных массивов?
Сделайте диагностический вывод сырых значений ReadBuffer[i+n] - для начала надо убедиться, что Вы собрали нужный сигнал.
Наконец, проверьте правильность подключения и номера каналов.
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
> 8 канал в воздухе висит. Может из за этого такая хрень?
Запросто.
http://www.lcard.ru/articles/11
http://www.lcard.ru/articles/12
Вход модуля высокоомный, поэтому с висящего входа намеряется страшный шум, который к тому же может исказить измерения следующего опрашиваемого канала.
Источники должны быть по возможности низкоомными. Не надо опрашивать канал, если он не задействован. Но если очень хочется (по условиям задачи), то надо не вешать в его в воздухе, а замкнуть короткой перемычкой, которая будет выполнять роль низкоомного источника нуля.
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: получение данных с АЦП(е14-140 builder)
И вообще, обсуждать, правильно ли написана ControlTable, не имеет смысла без точного(!) описания к какому контакту какая цепь подключена, и какие величины напряжений поданы...
|
|
|
Re: получение данных с АЦП(е14-140 builder)
Вот такой вопрос. Если я хочу принимать данные с 1,8,10,12,3,11 канала
То так правильно?
ap.ControlTable[0] = (WORD)(0| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[1] = (WORD)(7| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[0] = (WORD)(9| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[3] = (WORD)(11| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[4] = (WORD)(2| (IsCommonGnd << 0x5)| (0x0));
ap.ControlTable[5] = (WORD)(10| (IsCommonGnd << 0x5)| (0x0));
Потом принятие
// Обработка данных с одного канала
for(i = 0x0; i < PointsToRead; i++) {
// значение поступаемое с АЦП и скорректированное
Um1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+1])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+2])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+3])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um3xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+4])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur3xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+5])*B*C)/ChannelPoint;
}
Где
ChannelPoint = 2048; // кол-во точек на канал
ChannelsQuantity = 0x6; // будем отображать активных канала
Так правильно?
|
|
|
Re: получение данных с АЦП(е14-140 builder)
упс в цикл не то написал. Так
for(i = 0x0; i < PointsToRead; i+=6) {
// значение поступаемое с АЦП и скорректированное
Um1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur1xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+1])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+2])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur2xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+3])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Um3xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+4])*B*C)/ChannelPoint;
// значение поступаемое с АЦП и скорректированное
Ur3xDamp[NumbersOfPointsInArrays]=((A+ReadBuffer[i+5])*B*C)/ChannelPoint;
NumbersOfPointsInArrays++;
}
Это правильно?
|
|
|
Re: получение данных с АЦП(е14-140 builder)
ap.ControlTable[2] = (WORD)(9| (IsCommonGnd << 0x5)| (0x0));
Конечно же...
Блин сделайте редактирование на форуме)
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: получение данных с АЦП(е14-140 builder)
В смысле порядка сэмплов в кадре - пожалуй, да.
Но если на выходе вольты, то при постоянных A,B,C это будет корректно только при одинаковых коэффициентах усиления во всех каналах.
|