Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Плату Е-502 уже использовали в двух подобных проектах. Прошивка 0.0.14
Все работало замечательно, но в новом проекте столкнулись со следующей проблемой - примерно
через 20-30 минут после включения, плата начинает выдавать ошибку -1004
Ioeaea Cortex-M4: Ia?auaiea e ?aaeno?o IEEN aa?ioei ioaao NACK при любом обращении к ней.
Сперва данная ошибка выдается не часто и запросы данных проходят, но с течением времени выдается
практически на каждый запрос и работа с данными прекращается.
Запросы все асинхронные. Опрос ChangeData 4 раза в секунду.
#region Подготовка запроса данных
private void Prepare()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "crashReport.txt";
lpcie.Errs err = lpcie.Errs.OK;
/* Устанавливаем кол-во логических каналов */
hnd.LChannelCount = 6;
/* Настраниваем таблицу логических каналов */
for (uint i = 0; i < hnd.LChannelCount; i++)
{
err = hnd.SetLChannel(i, i, X502.LchMode.COMM, X502.AdcRange.RANGE_10, 0);
if (err != lpcie.Errs.OK)
{
Flag = false;
ErrorString = X502.GetErrorString(err);
//ErrorString = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO").GetBytes(ErrorString));
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Инициализация таблицы логических каналов " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
hnd = null;
return;
}
}
/* Настраиваем источник частоты синхронизации и запуска сбора */
if (err == lpcie.Errs.OK)
{
hnd.SyncMode = X502.Sync.INTERNAL;
hnd.SyncStartMode = X502.Sync.INTERNAL;
}
double f_acq, f_lch;
/* настраиваем частоту сбора с АЦП */
if (err == lpcie.Errs.OK)
{
f_acq = 2000;
f_lch = 0;
err = hnd.SetAdcFreq(ref f_acq, ref f_lch);
}
else
{
Flag = false;
ErrorString = X502.GetErrorString(err);
//ErrorString = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO").GetBytes(ErrorString));
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Инициализация. Настраиваем источник частоты синхронизации и запуска сбора " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
hnd = null;
return;
}
/* Записываем настройки в модуль */
if (err == lpcie.Errs.OK) err = hnd.Configure(0);
if (err == lpcie.Errs.OK)
{
Flag = true;
}
else
{
Flag = false;
ErrorString = X502.GetErrorString(err);
//ErrorString = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO").GetBytes(ErrorString));
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Инициализация. Записываем настройки в модуль " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
hnd = null;
return;
}
}
#endregion
#region Init
/// <summary>
/// Настройка рабочих параметров модуля
/// </summary>
private void Init()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "crashReport.txt";
/* создаем запись, соответствующую заданному адресу */
X502.DevRec rec = x502api.E502.MakeDevRecordByIpAddr(IPAddress.Parse(Adress), 0, 1000);
if (rec != null)
{
/* создание объекта */
hnd = X502.Create(rec.DevName);
/* станавливаем связь устанавливаем связь по созданной записи */
lpcie.Errs res = hnd.Open(rec);
if (res == lpcie.Errs.OK)
{
Flag = true;
}
else
{
Flag = false;
ErrorString = X502.GetErrorString(res);
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Инициализация " + res.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
hnd = null;
return;
}
}
Prepare();
}
#endregion
#region ChangeData
/// <summary>
/// Асинхронный прием-передача данных
/// </summary>
public void ChangeData()
{
lpcie.Errs err = lpcie.Errs.OK;
string path = AppDomain.CurrentDomain.BaseDirectory + "crashReport.txt";
try
{
Flag = true;
if (hnd == null)
{
Init();
}
/* Аналоговый вывод CH0 */
err = hnd.AsyncOutDac(X502.DacCh.CH1, Ch_OUT[0], X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
ErrorString = X502.GetErrorString(err);
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Аналоговый вывод CH0 " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
Flag = false;
}
/* Аналоговый вывод CH1 */
err = hnd.AsyncOutDac(X502.DacCh.CH2, Ch_OUT[1], X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
ErrorString = X502.GetErrorString(err);
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Аналоговый вывод CH1 " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
Flag = false;
}
Prepare();
/* Аналоговый ввод */
err = hnd.AsyncGetAdcFrame(X502.ProcFlags.VOLT, 2000, Ch_IN);
if (err != lpcie.Errs.OK)
{
ErrorString = X502.GetErrorString(err);
//ErrorString = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO").GetBytes(ErrorString));
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Аналоговый ввод " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
Flag = false;
}
/* Цифровой ввод 17 линий */
UInt32 din;
err = hnd.AsyncInDig(out din);
if (err != lpcie.Errs.OK)
{
ErrorString = X502.GetErrorString(err);
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Цифровой ввод " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
Flag = false;
}
else
{
for (int i = 0; i < Bit_IN.Length; i++)
{
if ((din >> i & 1) == 1) Bit_IN[ i ] = true; else Bit_IN[ i ] = false;
}
}
/* Цифровой вывод 16 линий */
UInt32 val = 0;
for (int i = 0; i < Bit_OUT.Length; i++)
{
if (Bit_OUT [ i ])
{
val = val + (uint)(Math.Pow(2, i));
}
}
err = hnd.AsyncOutDig(val, 0);
if (err != lpcie.Errs.OK)
{
ErrorString = X502.GetErrorString(err);
using (StreamWriter w = File.AppendText(path))
{
w.WriteLine(DateTime.Now.ToString() + " Цифровой вывод " + err.ToString() + " " + ErrorString + Environment.NewLine);
w.Flush();
}
Flag = false;
}
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
#endregion
Спасибо за ответы. Это оказался коммутационный эффект. Уменьшили частоту и данные пришли в норму.
А коммутационный эффект может проявиться при считывании данных асинхронно (AsyncGetAdcFrame)?
Еще такой момент:
подключил осциллограф на входной сигнал - входной сигнал с устойчивой постоянной составляющей и небольшими помехами (объяснимыми).
А на плате получаем необъяснимые "пики" .
сигнал должен вырасти и по экспоненте спадать, а я наблюдаю "фантомные" пики, которые не показывает осциллограф
обработка сигнала с канала обычная - вычитаю смещение нуля и умножаю на множитель. Смещение нуля - это напряжение на канале перед началом процесса.
Создается впечатление, что смещение нуля "гуляет".
Программа самописная. Настраивал каналы на и на дифференциальный и с общей землей - поведение не меняется. Перед каждым входом стоит модуль гальванической развязки 5В на 5В. Попробовал задавать сигналы калибратором сигналов и смотреть входящий сигнал с модулем и без (начал грешить на модули) Вот что получилось:
U задания Напр. на плате с модулем Напряж. на плате напрямую
0 -0.002 -0.002
1 1.042 1
2 2.092 2.02
3 3.145 3.034
4 4.2 4.028
5 5.147 5.024
Видно, что модуль преобразует с погрешностью. Но и без модуля погрешность достаточно высока.
E-502 настроена на +-10В и дифференциальный режим работы. Входы Y, незадействованные Х соединены с AGND и GND32.
Столкнулся с такой проблемой:
На плату подаются два дифференциальных сигнала. Один сигнал искажается. На входе в палату (замерял двумя мультиметрами - расхождение измерений 0.003В) 1.825 В , а плата показывает его как 1.905 В. В чем может быть причина несовпадения значений сигнала?
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск