Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Игорь пишет:Еще, прочитал Вашу статью simple_fir_filter. В ней Вы предлагаете для коррекции АЧХ фильтр первого порядка Y(n) = (X(n) – X(n–1))*K + X(n). Казалось бы, если взять симметричный фильтр второго порядка Y(n) = (X(n–1) – X(n) + X(n–1) – X(n–2))*0.5*K + X(n–1), то фаза будет линейной при том же количестве умножений. Модуль передаточной функции дается простым выражением |H|= 1 + K – K * cos(2*π*f*T), что в первом порядке по K совпадает с АЧХ фильтра из статьи. Скажите, фильтр первого порядка Вы предпочли для предельной экономии вычислительных ресурсов, или есть другие причины? Это не «запрос пользователя», просто любопытно.
Игорь, в упомянутой Вами статье корректирующий фильтр обеспечивает максимум коррекции при f=0,5/T, а в предложенном Вами симметричном фильтре 2-го порядка максимум коррекции достигается при f=0,25/T, поэтому он не может рассматриваться как замена фильтра, предложенного в статье.
Нет, Александр. Максимум коррекции все там же, при f=0,5/T. А заменой K на 2K "мой" фильтр превращается в "Ваш" из новой статьи
Утилиту выложил сюда http://www.lcard.ru/download/ltr22_cbr_restore.zip.
Я прогнал утилиту по трем проблемным модулям. Калибровки восстановились. Спасибо за помощь.
В принципе в конкретно этих экземплярах восстановить калибровочные коэффициенты возможно, т.к. они из той области, где используются одинаковые значения на несколько частот. Могу сделать такую утилиту.
Т.е. заполнить пропуски коэффициентами для другой частоты? Можно и так, в крайнем случае. Если оригинальные калибровки сохранились в Л-Кард, то было бы лучше, чтобы утилита сверяла коэффициенты в модуле с заводскими и при необходимости перешивала. Вдруг там еще и малозаметные битовые ошибки бывают? В идеале для каждого модуля – файлик с коэффициентами и номером модуля в названии. Утилита автоматически проверяет и при необходимости патчит все LTR22 в крейте. Информацию о том, какие модули нормальные, а какие пришлось исправлять, выдает в stdout.
Другой вопрос, что пока остается не понятным, как такая проблема возникла...
Вы посмотрели свой софт для прошивки калибровок? После записи коэффициентов выполняется ли их чтение и сверка с тем, что должно быть?
Да, теоретически могли поверить в каком-нибудь ЦСМ. А этот вопрос как раз относится к калибровочным коэффициентам. Хотя, я вспомнил, что Вы - в Украине, поэтому я зря задал этот вопрос...
Мы поверяем систему управления в целом, ибо перед LTR22 там стоят тензоусилители либо источники тока для ICP датчиков. Поскольку реально используется только 4 частоты дискретизации, отсутствие некоторых коэффициентов могло пройти незамеченным.
Я правильно понимаю, что у Вас только часть модулей с такой проблемой? На скольки модулях из какого количества обнаружена проблема? Если их больше двух, то можете и по остальным выложить файлы. Модули с этой проблемой покупались одновременно и когда?
Еще один модуль с битыми калибровками: 3D985068.
Итого на данный момент модули с пропусками в калибровочных таблицах: 3D985068 3D985077 3D985078
Без пропусков: 3D776532 3D872007 3D872016 3D985069 3D985098 3D985114
Пока неизвестно: 3D549495 3D872002 3D872006 3D872014 3D872051 3D872061 3D872103 3D985082 3D985103 3R751975 (+ 4шт, номеров под рукой нет)
Проблемные модули вероятнее всего покупались в ноябре 2015 или в октябре 2017 через киевский Холит.
...И поверялись ли эти модули когда-нибудь? - по нашим данным не поверялись.
Это мне вопрос???
Добрый день. Не совсем понятно, как именно сформированы эти файлы. Они получаются с помощью какой-то Вашей программы?
#include "ltr\include\ltr22api.h"
#include "ltr\include\ltr34api.h"
#include "ltr\include\ltr43api.h"
#pragma comment (lib, "ltr22api.lib")
#pragma comment (lib, "ltr43api.lib")
#pragma comment (lib, "ltr34api.lib")
#include <math.h>
static void _print_float(float x)
{
if (isfinite(x))
printf(" %14.6e", x);
else if (isnan(x))
printf(" nan/0x%08X", *(UINT32 *)&x);
else
printf(" inf/0x%08X", *(UINT32 *)&x);
}
static void _ltr22_info(int slot)
{
static const int range_mV [LTR22_RANGE_NUMBER] = {1000, 300, 100, 30, 10000, 3000};
int err = 0;
TLTR22 module;
LTR22_Init(&module);
if (err = LTR22_Open(&module, SADDR_DEFAULT, SPORT_DEFAULT, "", slot))
{
printf("Can't open LTR22 @ slot %d: %s\n", slot, LTR22_GetErrorString(err));
return;
}
printf("LTR22 @ slot %d:\n", slot);
printf("\tName: %s\n", module.ModuleInfo.Description.DeviceName);
printf("\tSerial = %s\n", module.ModuleInfo.Description.SerialNumber);
printf("\tRevision = %d\n", module.ModuleInfo.Description.Revision);
printf("\tComment = %s\n", module.ModuleInfo.Description.Comment);
printf("\tCalibration (offset scale):\n");
for(int r=0; r < LTR22_RANGE_NUMBER; ++r)
{
for(int fr=0; fr < LTR22_MAX_DISC_FREQ_NUMBER; ++fr)
{
printf("\t\t%5dmV %5dHz", range_mV[r], LTR22_DISK_FREQ_ARRAY[fr]);
for(int ch=0; ch < LTR22_ADC_NUMBERS; ++ch)
{
ADC_CHANNEL_CALIBRATION &c = module.ADCCalibration[ch][fr];
//printf(" %14.6e %14.6e", c.FactoryCalibOffset[r], c.FactoryCalibScale[r]);
_print_float(c.FactoryCalibOffset[r]);
_print_float(c.FactoryCalibScale[r]);
}
printf("\n");
}
}
LTR22_Close(&module);
}
static void _ltr34_info(int slot)
{
int err = 0;
TLTR34 module;
LTR34_Init(&module);
if (err = LTR34_Open(&module, SADDR_DEFAULT, SPORT_DEFAULT, "", slot))
{
printf("Can't open LTR34 @ slot %d: %s\n", slot, LTR34_GetErrorString(err));
return;
}
printf("LTR34 @ slot %d:\n", slot);
printf("\tName: %s\n", module.ModuleInfo.Name);
printf("\tSerial = %s\n", module.ModuleInfo.Serial);
printf("\tFPGA_Version = %s\n", module.ModuleInfo.FPGA_Version);
printf("\tCalibrVersion = %s\n", module.ModuleInfo.CalibrVersion);
LTR34_Close(&module);
}
static void _ltr43_info(int slot)
{
int err = 0;
TLTR43 module;
LTR43_Init(&module);
if (err = LTR43_Open(&module, SADDR_DEFAULT, SPORT_DEFAULT, "", slot))
{
printf("Can't open LTR43 @ slot %d: %s\n", slot, LTR43_GetErrorString(err));
return;
}
printf("LTR43 @ slot %d:\n", slot);
printf("\tName: %s\n", module.ModuleInfo.Name);
printf("\tFirmwareVersion: %s\n", module.ModuleInfo.FirmwareVersion);
printf("\tFirmwareDate: %s\n", module.ModuleInfo.FirmwareDate);
printf("\tSerial: %s\n\n", module.ModuleInfo.Serial);
LTR43_Close(&module);
}
int main(int argc, char* argv[])
{
_ltr22_info(CC_MODULE6);
_ltr22_info(CC_MODULE7);
_ltr34_info(CC_MODULE8);
return 0;
}
Добрый день! Обнаружил, что в некоторых модулях LTR22 некоторые калибровочные коэффициенты читаются как NAN (содержат 0xFFFFFFFF; см. вложение). Верифицируются ли в Л-Кард калибровочные таблицы после прошивки? Как восстановить?
Здравствуйте, Александр!
Я посмотрел обновленную статью Фильтр антиалайзинговый и обновленное Руководство пользователя LTR (только разделы, связанные с LTR22). Я не эксперт по терминологии, но мне кажется, что изложено нормально. Очень понравилось изложение обсуждавшихся особенностей в стиле errata. Некоторые мелкие шероховатости по тексту: 1) в жирном тексте п.12.3.1.1 ширина полос ±0,54/M, а в таблицах 12-1, 12-2 — ±0,547/M; 2) в жирном тексте п.12.3.1.1 и в таблицах 12-1, 12-2 дробные кратности есть, а в C.2.3 — нет; 3) в таблицах 12-1, 12-2 вместо «Типичное наилучшее подавление» м.б. лучше просто «Типичное подавление», в правом столбце «внутри полос частот при...» лишнее «при»; 4) в п.12.3.1.1 вместо ADS1274 должно быть AD1870.
Кстати, попалась на глаза реклама нового АЦП от TI. Признаки перегрузки реализованы в чипе по тому же принципу, что и у Вас (ADS1261, стр.32)
Еще, прочитал Вашу статью simple_fir_filter. В ней Вы предлагаете для коррекции АЧХ фильтр первого порядка Y(n) = (X(n) – X(n–1))*K + X(n). Казалось бы, если взять симметричный фильтр второго порядка Y(n) = (X(n–1) – X(n) + X(n–1) – X(n–2))*0.5*K + X(n–1), то фаза будет линейной при том же количестве умножений. Модуль передаточной функции дается простым выражением |H|= 1 + K – K * cos(2*π*f*T), что в первом порядке по K совпадает с АЧХ фильтра из статьи. Скажите, фильтр первого порядка Вы предпочли для предельной экономии вычислительных ресурсов, или есть другие причины? Это не «запрос пользователя», просто любопытно.
Да, универсальный рецепт не дашь... Для каждого случая надо рассчитывать отдельно. Поэтому я и предпочитаю LTR22
Наверное, слишком уменьшать R нехорошо - появится зависимость АЧХ от сопротивления источника сигнала...
Игорь пишет:..У Вас же и LTR11 есть. Наверное, стоит сказать об аналоговых фильтрах. Та же банальная RC-цепочка для многих задач вполне адекватное решение. ...
В одноканальном режиме - адекватное. В многоканальном - очень небанально, поскольку конденсатор антиалайзинговой RC-цепи будет копить инжекционный заряд от входных коммутаторов...
Вот Вы пишете «RC цепи с большой постоянной времени (R*C значительно больше периода опроса каналов) не решают проблему, поскольку они накопят ошибку, вызванную впрыском заряда». Но ведь, если при заданной постоянной времени уменьшать R и пропорционально увеличивать C, то ошибка от впрыска заряда должна уменьшаться. Разве нет? Еще, наверное, уменьшить взаимовлияние можно чередуя коммутацию сигналов с землей: сигнал1—земля—сигнал2—земля—... Или не получится?
Спасибо за развернутый ответ, Александр!
Во внутренней архитектуре канала АЦП LTR22 присутствует цифровой antialiasing фильтр, который подавляет частотные составляющие входного сигнала в диапазоне 0,54*FADC ...63,46*FADC и, в сочетании с АЧХ аналогового тракта с подавлением частот выше 63,46*FADC, обеспечивает высокую спектральную верность преобразования, необходимую для подобного класса АЦП.
Примерно на такой формулировке я собираюсь остановиться.
Такая формулировка возражений не вызывает.
3. Случай наименьшей частоты преобразования 3472 Гц соответствует наименьшей частоте модулятора, и до доработки LTR22 (о которой я упомянул выше) на частоте самой существенной низкочастотной "аномальной зоны" 444464 Гц действительно было прохождение, а после доработки ожидается подавление (около 6 дБ). Соответственно, с увеличением частоты преобразования подавление в "аномальных зонах" значительно увеличиваются. Итого, антиалайзинговая АЧХ тракта LTR22 при любой частоте преобразования после доработки будет обеспечена.
Ну да, я постарался подобрать наглядный пример Чем подробнее Вы расскажете о свойствах тракта, тем более осмысленно пользователи смогут применять Ваше оборудование, и тем меньше глупых вопросов будут задавать техподдержке. Например, у нас в одной и той же лаборатории испытываются как лопатки на частотах под 15кГц, так и всякие корпуса на частотах в десятки герц. Если подавление 6 дБ меня устраивает, низкочастотные испытания я могу обрабатывать на 3472 Гц. Если нет – могу поднять частоту опроса и добиться большего подавления за счет усложнения обработки.
Что касается статьи терминологии, наверное, она все же должна быть более универсальной по содержанию. У Вас же и LTR11 есть. Наверное, стоит сказать об аналоговых фильтрах. Та же банальная RC цепочка для многих задач вполне адекватное решение. И с хорошим конденсатором подавление до сотен мегагерц обеспечивается, в отличие от цифровых... Как пример цифровых фильтров, можно дать что-то вроде LTC1569 — для пользователей LTR11 будет намек, как бороться с алайзингом в их приложениях...
Например, имеются частоты когерентных помех в LTR - это 250 кГц (и её гармоники) от системы импульсного питания гальваноизолированных модулей LTR.
Лично я каких-либо артефактов от импульсного питания не замечал. Наверное, хорошо фильтруете Но предупредить пользователей, конечно, стоит.
Игорь пишет:Теоретически дробные аномальные зоны должны иметь меньшую ширину: ((64*N/M)±0.54/M)*Fs.
Эта формула без наложения каких-то дополнительных условий не дает однозначного описания границ: например, при отношении N/M, равном 2/3 или 4/6, имеем одну и ту же центральную частоту, но разную ширину зон.
N=2 M=3 — смотрим на третью гармонику через второе «окно» АЦП, N=4 M=6 — смотрим на шестую гармонику через четвертое «окно». Непосредственно возле центральной частоты будем видеть алайзинг от обеих гармоник. Если плавно увеличивать частоту, то сначала пропадет алайзинг от шестой (на частоте ≈(64*2/3+0.5/6)*Fs), останется от третьей. При частоте ≈(64*2/3+0.5/3)*Fs пропадет и от третьей. Т.е. надо рассматривать объединение интервалов.
Другое дело, что большие N не должны проявляться, так как пропускание аналогового тракта даже без специальных мер все-таки спадает с частотой. Аналогично для M — слабая нелинейность тракта обычно проявляется небольшим числом нижних гармоник.
Теоретически дробные аномальные зоны должны иметь меньшую ширину: ((64*N/M)±0.54/M)*Fs. Будет время - поисследуете. Вряд ли пользователи часто сталкиваются с этими эффектами на практике...
АЦП не различает частоты f и f+64*N*Fs. Если не гарантируется подавление в диапазоне ±0.54*Fs, то априори не гарантируется подавление и в диапазонах, смещенных на 64*N*Fs. Логично все их выделить и не учитывать при определении типичного значения. Вот здесь (стр.6), например, тоже раздельно нормируют "Stopband Rejection" и "Rejection at alias hole". Можно уточнить у метрологов, как это принято делать по нашим стандартам.
Что-то неправдоподобно малые дБ получились. Типично 60-70дБ должно легко измеряться, даже если RMS вместе с шумом считать... М.б. считали как 10lg вместо 20lg? Там, где Fs сравниваете с 1562кГц, Вы подразумеваете частоту модулятора? Для аномальных полос вместо "типично в окрестности" лучше (64*N±0.54)*Fs.
Поскольку, так или иначе, "запрос пользователя поступил", то я собираюсь измерить до 10 МГц типичное внеполосное подавление в LTR22, LTR24-1, LTR24-2, LTR25 (в тех наших изделиях, где где имеется антиалайзинговый фильтр) и включить эти данные в Руководство пользователя как типичные, определённые дизайном (не контролируемые при производстве и при поверке изделий). Мы, безусловно, заинтересованы в максимальной полноте техданных о наших изделиях.
Поддерживаю! Желательно также сказать об «окнах» в полосе подавления в окрестности 64*fs*n. В наших изделиях я находил аномальные полосы также и на дробных кратностях (64*fs*n/m для небольших целых n, m). По-видимому, это связано с тем, что в паразитные полосы пропускания АЦП попадали гармоники из-за искажений в усилителе. Как дифференциальные так и синфазные внеполосные сигналы приводили к смещению постоянной составляющей. Эффект оказался квадратичным по амплитуде и, как и обещано здесь, ослаблялся с увеличением постоянной времени фильтра. У нас использовалась связка из INA141@G=100 + ADS1178, в Ваших модулях такие эффекты могут и не проявляться, или проявляться по-другому. Но, думаю, Вам будет любопытно поисследовать
Кстати, я посмотрел историю нашего форума, Вы давно интересовались модулем ЦАП LTR35. Этот застрявший на много лет проект, наконец, проходит у нас метрологию и в следующем году этот модуль ожидаем выдать. Обновлённые данные о нём скоро появятся в Руководстве пользователя.
Да, интересовался. На базе LTR мы разработали прибор для автоматизации некоторых видов виброиспытаний. Обратная связь замыкается через Blackfin, подключение компьютера не обязательно. Если бы на тот момент LTR35 был доступен, я бы предпочел его: интерполирующий ЦАП + возможность вынести генерирование сигнала в модуль... Но с LTR34@400kS/s тоже неплохо получилось. До 20кГц качество сигнала для наших задач приемлемое. Быстродействия Blackfin хватает: загрузку FIFO я поддерживаю на уровне 10 блоков, ниже 6 никогда не падает, даже при потоковой передаче на компьютер осциллограмм с 8 каналов LTR22 на максимальной частоте дискретизации. Задержка в контуре управления есть, но терпимая. Так что пока для перехода на новый модуль ЦАП у меня оснований не достаточно. Да и в свете продолжающихся глупостей между Россией и Украиной дальнейшее сотрудничество вообще под вопросом, к сожалению. Насколько я понимаю, приобрести оборудование LCard или Мера сейчас нереально... Технически, наверное, можно было бы организовать производство и в Украине, но при наших объемах это вряд ли имеет коммерческую перспективу.
ОК.
Насчет тестирования LTR22 на РЧ сигналах я ошибся, экспериментировали с другими платами.
Игорь, Ваше применение LTR22 соответствует ли прямому назначению устройства, указанному в руководстве?:
Полностью.
Какие именно параметры LTR22 не соответствуют, по Вашему мнению, прямому назначению этого АЦП?
Это Вы к тому, что подавление внеполосных нормировать не надо? Ну и не нормируйте, ведь покупают же? И я в том числе.
"На производстве и в лаборатории" невозможно полностью исключить попадание в тракт внеполосных помех от окружающего электрооборудования. И пользователю желательно знать, как измерительная система на них реагирует, чтобы осознанно интерпретировать возможные артефакты. На тех же полмегагерцах вполне может работать какой-нибудь DC/DC преобразователь. Выпрямление радиочастотных помех на входных каскадах тоже забавные артефакты дает (конкретно LTR22 на РЧ тестировали)...
Итого, на Ваши вопросы о поведении признаков перегрузки я ответил? - Старался ведь не на шутку в выходные дни
Да. Спасибо.
"3472Гц" выше - частота дискретизации
а) отсутствие признака перегрузки;
б) пиковые значения сигнала в вольтах после применения штатной функции калибровки находятся в пределах границ поддиапазона.
в) Y = AGND.
г) Режим АС+DC
- одновременное выполнение этих условий могут претендовать на "достаточность" для контроля линейности (кроме диапазонов ±1В и ±10В, если без доработки LTR22), если диапазон частот входных сигналов, шумов и помех вмещается с хорошим запасом в полосу частот пропускания входного аналогового тракта LTR22. При этих условиях прохождение контроля пиковых значений компараторами на входе узлов AЦП1 и АЦП2 будет условно соответствовать ситуации ненарушения условий линейности на входе LTR22. Эти условия "достаточности" могут быть достигнуты, например, если физика самого вибродатчика, подключенного ко входу LTR22, определяет соответствующую полосу частот сигнала, и если сигнальная цепь датчика надежно защищена от помех, не попадающих полосу частот пропускания входного аналогового тракта. Но, прошу меня понять правильно, всё это - не метрологический, а оценочный подход в нахождении "достаточного" критерия линейности преобразования.
Я рад, что Вы, все-таки прочли мое сообщение правильно. А то приписываете мне какие-то дурацкие «представления»...
С тем, что подход оценочный, спорить не буду – детектировать все возможные искажения невозможно. А вот для диагностики перегрузки входа неинформативными НЧ составляющими сигнала подход выглядит вполне рабочим.
Раз уж Вы заговорили о полосах пропускания, то стоит с сожалением констатировать, что для LTR22 внеполосные характеристики не нормированы. Вообще. Более того, Вы вводите пользователя в заблуждение, утверждая, например, на странице 222 ltr.pdf, что «Во внутренней архитектуре канала АЦП присутствует цифровой antialiasing фильтр, который не пропускает частотные составляющие входного сигнала выше половины частоты дискретизации АЦП...». Это ложь: как в AD1870, так и в ADS1274 оцифровка выполняется на частоте модулятора без каких-либо антиалайзинговых фильтров, о чем прямо сказано в даташитах здесь и здесь. Настройте LTR22 на частотный диапазон 3472Гц, амплитудный поддиапазон ±10В, подайте сигнал частотой 444464 Гц и наблюдайте красивую 20-герцовую синусоиду с амплитудой, сопоставимой с амплитудой ВЧ сигнала. Это чистой воды алайзинг. В разделе сайта «Терминология» Вы также неудачно приводите сигма-дельта АЦП как пример антиалайзингового фильтра. И, кстати, ADS1274 выпускается фирмой Texas Instruments, а не Analog Devices.
а) Признаки перегрузки в LTR22 не являются метрологическими признаками для этого Средства измерения: погрешности порогов срабатывания не нормируются и при поверке не контролируются.
А если бы нормировали, хотя бы грубо, то при поверке недочеты бы заметили
Отсутствие признака перегрузки (исходя из физики получения этого признака) является необходимым признаком линейности преобразования LTR22, но не достаточным...
Хорошо, можно ли считать, что необходимым и достаточным признаком линейности преобразования LTR22 в режиме AC+DC на всех поддиапазонах, кроме ±1В и ±10В, при Y=AGND и |X–Y|<20В является одновременное выполнение двух условий: а) отсутствие признака перегрузки; б) пиковые значения сигнала в вольтах после применения штатной функции калибровки находятся в пределах границ поддиапазона?
Практически, пороги срабатывания “признаков перегрузки разрядной сетки АЦП” следует проверять по DC или на малых частотах АС (условно до 1 кГц), когда сильное влияние динамических явлений не ожидается.
Забавно, на поддиапазоне ±1В признак перегрузки все-таки срабатывает на порогах ±1.15В по постоянке. Но при увеличении напряжения на входе до +11.0В, сбрасывается. При отрицательной перегрузке сброса не происходит.
Коды без коррекции.
Да, в АС+DC.
Здравствуйте Александр!
Что-то странное происходит и на поддиапазоне ±1В.
На одном из каналов инвертирующий вход подключил напрямую к AGND. Неинвертирующий вход притянул к +15В резистором 1МОм, вольтметр относительно AGND показывает +12.3В. На поддиапазонах ±0.03, ±0.1, ±0.3 и ±3 все правильно: есть индикация перегрузки, с АЦП стабильно +32767. На поддиапазонах ±1, ±10 индикации перегрузки нет, коды АЦП около +24000 на поддиапазоне ±1 и около +28000 на поддиапазоне ±10.
Если на тот же вход подавать переменный сигнал, то на поддиапазоне ±1 признак перегрузки срабатывает. На симметричном относительно AGND синусоидальном сигнале 8кГц-25кГц порог срабатывания признака 811–815мВ СКЗ по вольтметру (пиковые коды АЦП –27900...–27700, +28300...+28500).
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск