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


получение данных с АЦП(е14-140 builder)

Вы не вошли.

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

ЬЩЕ
23.03.2011 16:34:53
#1

Гость

получение данных с АЦП(е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 канале у меня ничего нет. В поверграфе смотрю - тупо линия. У себя в проге смотрю он синусоиду выводит... Не понятно.

ЬЩЕ
23.03.2011 16:54:07
#2

Гость

Re: получение данных с АЦП(е14-140 builder)

Может я что то перепутал? на АЦП 16 каналов же? 1 8 10 и 12 заняты. Может я чето напутал с ControlTable

24.03.2011 11:31:28
#3

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

Re: получение данных с АЦП(е14-140 builder)

А сможете показать, что в control table?
Вообще было бы логичнее заполнить там только используемые каналы (создать 4 логических канала, соответствующих заданным физическим). И получать кадр данных в [i+0]..[i+3]

ЬЩЕ
24.03.2011 11:50:48
#4

Гость

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;

}

ЬЩЕ
24.03.2011 15:59:16
#5

Гость

Re: получение данных с АЦП(е14-140 builder)

ну вот
// формируем управляющую таблицу логических каналов
for(i = 0x0; i < ap.ChannelsQuantity; i++) ap.ControlTable[i] = (WORD)(i| (IsCommonGnd << 0x5)| (0x0));

или я чего то неверно понимаю?

24.03.2011 16:14:44
#6

Сотрудник "Л Кард"
Здесь с 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].

ЬЩЕ
24.03.2011 21:57:02
#7

Гость

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));

так правильно?

ЬЩЕ
25.03.2011 11:07:29
#8

Гость

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

ЬЩЕ
25.03.2011 11:08:27
#9

Гость

Re: получение данных с АЦП(е14-140 builder)

0x0 усиление 1 для 10 вольт. В таблице так написано(руководстве)

ЬЩЕ
25.03.2011 11:35:41
#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? Дык я это в примере взял...

25.03.2011 12:05:26
#11

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

Re: получение данных с АЦП(е14-140 builder)

Ой.

Сдвигать влево на 32 бита (<<0x20) в 16-битном слове ничего не надо smile Правильно <<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].
Они зависят от коэффициента усиления.

25.03.2011 12:28:00
#12

Сотрудник "Л Кард"
Здесь с 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

Таким образом, Вы можете составить кадр данных, перечислив нужные физические каналы в любом порядке, с разными коэффициентами усиления и т.д.

ЬЩЕ
25.03.2011 13:10:32
#13

Гость

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++;
        }

25.03.2011 13:21:45
#14

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 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.

ЬЩЕ
25.03.2011 13:42:27
#15

Гость

Re: получение данных с АЦП(е14-140 builder)

чет не так все равно я делаю. на все каналах одно и тоже снимаю. То есть Um1xDamp,Ur1xDamp,Um2xDamp,Ur2xDamp одинаковые почти.

бррр... в PowerGrpah 1 канал  ваще линия(ризестр стоит), у меня синус 10-ти вольтный... где то накасячил понять не могу где.

ЬЩЕ
25.03.2011 13:59:12
#16

Гость

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 чето не то пишу... Чет даже идей нет из-за чего такая штука.

ЬЩЕ
25.03.2011 14:01:07
#17

Гость

Re: получение данных с АЦП(е14-140 builder)

8 канал в воздухе висит. Может  из за этого такая хрень?

25.03.2011 14:03:04
#18

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

Re: получение данных с АЦП(е14-140 builder)

Ну что переменные используются выше, чем определяются - я так понимаю, это Вы просто не по порядку скопировали в сообщение?

Коэффициенты A и B исправили, чтобы брались для правильного диапазона?

Зачем делите отсчеты на количество точек (ChannelPoint)? Впрочем, это неважно.

Какие типы переменных A, B, C, ReadBuffer, выходных массивов?
Сделайте диагностический вывод сырых значений ReadBuffer[i+n] - для начала надо убедиться, что Вы собрали нужный сигнал.
Наконец, проверьте правильность подключения и номера каналов.

25.03.2011 14:11:37
#19

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

Re: получение данных с АЦП(е14-140 builder)

> 8 канал в воздухе висит. Может из за этого такая хрень?

Запросто.
http://www.lcard.ru/articles/11
http://www.lcard.ru/articles/12

Вход модуля высокоомный, поэтому с висящего входа намеряется страшный шум, который к тому же может исказить измерения следующего опрашиваемого канала.
Источники должны быть по возможности низкоомными. Не надо опрашивать канал, если он не задействован. Но если очень хочется (по условиям задачи), то надо не вешать в его в воздухе, а замкнуть короткой перемычкой, которая будет выполнять роль низкоомного источника нуля.

25.03.2011 14:48:35
#20

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: получение данных с АЦП(е14-140 builder)

И вообще, обсуждать, правильно ли написана ControlTable, не имеет смысла без точного(!) описания к какому контакту какая цепь подключена, и какие величины напряжений поданы...

ЬЩЕ
21.04.2011 16:36:44
#21

Гость

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;            // будем отображать  активных канала

Так правильно?

ЬЩЕ
21.04.2011 16:38:38
#22

Гость

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++;
        }

Это правильно?

ЬЩЕ
21.04.2011 16:39:59
#23

Гость

Re: получение данных с АЦП(е14-140 builder)

ap.ControlTable[2] = (WORD)(9|  (IsCommonGnd << 0x5)| (0x0));
Конечно же...

Блин сделайте  редактирование на форуме)

21.04.2011 17:11:17
#24

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

Re: получение данных с АЦП(е14-140 builder)

В смысле порядка сэмплов в кадре - пожалуй, да.
Но если на выходе вольты, то при постоянных A,B,C это будет корректно только при одинаковых коэффициентах усиления во всех каналах.