|
|
Генерация сигнала с помощью LTR34
Почему при задании параметра conf.AcknowledgeType=true частота генерации сэмплов уменьшается? Так должно быть?
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,293
|
Re: Генерация сигнала с помощью LTR34
Речь идет о каком-то примере или Вашей программе? Каким образом наблюдаете уменьшение "частоты генерации сэмплов"? Вообще этот параметр не должен влиять на частоту генерации (она определяется кол-вом каналов и делителем частоты в настройках), а только обозначает, что модуль высылает подтверждение на каждое слово. При этом (в отличие от режима AcknowledgeType=false) ltrd/LtrServer ну управляют автоматически загрузкой очереди модуля, а Вы сами должны в программе следить, что послали нужное кол-во данный вовремя и не переполнили очередь модуля.
|
|
|
Re: Генерация сигнала с помощью LTR34
Разрабатываю на QtCreator под Ubuntu. Приложение должно генерировать синусоидальный сигнал частотой 50 Гц с возможностью интерактивного изменения амплитуды сигнала. Сейчас программа с периодом 20 мс функцией LTR34_Send отправляет массив данных. Напряжение на выходе LTR34 фиксирую LTR11 с выводом кривой на экран. Когда значение conf.AcknowledgeType=false, за время 100 мс чётко укладывается 5 периодов. Как только задаю conf.AcknowledgeType=true (ни каких других изменений в программу не вношу) за время 100 мс укладывается 3,5 периода.
|
|
|
Re: Генерация сигнала с помощью LTR34
В первом случае амплитуда изменяется одновременно с движения ползунка, во втором с существенной задержкой.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,293
|
Re: Генерация сигнала с помощью LTR34
При постоянной подкачке данных для генерации сигнала (пробовал синуса) не обнаружил никаких изменений частоты генерируемого сигнала AcknowledgeType. Видимо нужен какой-то минимальный пример, на котором описанное выше проявляется, либо более подробное описание, что делаете (все настройки LTR34, сколько точек и какой сигнал генерируете за раз, каким образом вычисляете этот период 20 мс и т.п.)
|
|
|
Re: Генерация сигнала с помощью LTR34
Пробовал запускать под Windows10. Результат тот же. Высылаю текст программы: Содержание файла mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QThread>
#include <QLCDNumber>
#include <QSlider>
#include <QListWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void onSliderChanged(int _value);
void onLoad();
private:
bool checkError(int _err);
void showMessage(QString _str);
private:
QLCDNumber* number;
QSlider* slider;
QListWidget* list;
};
#endif // MAINWINDOW_H
Содержание файла mainwindow.cpp
#include "mainwindow.h"
#include "/usr/include/ltr/include/ltr34api.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTimer>
#include <math.h>
TLTR34 conf;
INT SlotNum = 1; // Номер посадочного места
INT err;
LPCSTR ErrorString; // Строка для записи сообщений об ошибках
double value;
const double f = 50.0; //частота сигнала
const double T = 1/f; //период сигнала
const double w = 2.0*M_PI*f; //угловая частота
double sf;
int dsize; // размер массива
double dt; //период дискретизации
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout* vl = new QVBoxLayout();
QHBoxLayout* hl = new QHBoxLayout();
number = new QLCDNumber();
slider = new QSlider();
hl->addWidget(number, 1);
hl->addWidget(slider, 1);
vl->addLayout(hl);
list = new QListWidget();
vl->addWidget(list);
setLayout(vl);
setFixedSize(400, 400);
QObject::connect(slider, SIGNAL(valueChanged(int)),
this, SLOT(onSliderChanged(int)));
err = LTR34_Init(&conf);
if(err){
ErrorString = LTR34_GetErrorString(err);
list->addItem(QString::fromLocal8Bit(ErrorString));
return;
}
else{
list->addItem("LTR34_Init()->OK");
}
err = LTR34_Open(&conf, SADDR_DEFAULT, SPORT_DEFAULT,"3T212062",SlotNum);
if(err){
ErrorString = LTR34_GetErrorString(err);
list->addItem(QString::fromLocal8Bit(ErrorString));
return;
}
else{
list->addItem("LTR34_Open()->OK");
}
if(!LTR34_IsOpened(&conf)){
conf.FrequencyDivisor = 54; // делитель частоты дискретизации //54
conf.UseClb=true; // Используем заводские калибровочные коэффициенты
conf.AcknowledgeType=true; // тип подтверждения - периодические
conf.ExternalStart=false; // внешний старт отключен
conf.RingMode=false; // включен режим автогенерации
conf.ChannelQnt = 1;
err = LTR34_Reset(&conf);
if(err){
ErrorString = LTR34_GetErrorString(err);
list->addItem(QString::fromLocal8Bit(ErrorString));
return;
}
else{
list->addItem("LTR34_Reset()->OK");
}
err = LTR34_Config(&conf);
if(err){
ErrorString = LTR34_GetErrorString(err);
list->addItem(QString::fromLocal8Bit(ErrorString));
return;
}
else{
list->addItem("LTR34_Config()->OK");
}
sf = conf.FrequencyDAC;
dsize = conf.ChannelQnt * ((int)sf) / ((int)f); // размер массива
dt = 1.0 / sf / conf.ChannelQnt; //период дискретизации
// Запускаем генерацию
err = LTR34_DACStart(&conf);
if(err){
ErrorString = LTR34_GetErrorString(err);
list->addItem(QString::fromLocal8Bit(ErrorString));
return;
}
else{
list->addItem("LTR34_DACStart()->OK");
}
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(onLoad()));
double dtime = dt * dsize;
timer->start(20);
}
}
MainWindow::~MainWindow()
{
LTR34_Close(&conf);
}
void MainWindow::onSliderChanged(int _value)
{
number->display(_value);
value = (qreal)_value/100.0;
}
void MainWindow::onLoad()
{
DWORD* ArrayToSend = new DWORD[dsize];
for (int i = 0; i < dsize; i++)
{
short v = 32767 * (value * sin(w * i * dt));
DWORD code = DWORD(v) << 16;
ArrayToSend[i] = code;
}
LTR34_Send(&conf, ArrayToSend, dsize, 5000);
}
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,293
|
Re: Генерация сигнала с помощью LTR34
Не знаю, странно, но у меня в вашей программе от изменения AcknowledgeType сигнал не изменяется. У Вас просто синус становится меньшей частоты, а не появляются промежутки между синусами? Подключен крейт по какому интерфейсу? Другой вопрос, что при используемом подходе любая задержка ПК приводит к задержкам между периодами синуса, но это должно проявляться в появлении постоянного значения между периодами.
|
|
|
Re: Генерация сигнала с помощью LTR34
Подключение по USB. Форма кривой синусоидальная, без промежутков. Измерял частоту тестером 36 Гц вместо 50 Гц. Могу скинуть фото или файлы регистрации LGraph2, укажите только адрес куда сбрасывать. Тип крейта LTR-U-1 покупали в этом году. Плата LTR34-8 покупали в 2013 или 2012. Может быть связано с версиями прошивок?
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,293
|
Re: Генерация сигнала с помощью LTR34
Понятно, дело скорее всего в LTR-U-1. У него в принципе максимальная скорость передачи 200 КСлов/с и Вы выводе на этой частоте, т.е. с обычным подтверждением статусом уже используете его пропускную способность по максимому. Когда включаете подтверждение каждого слова, то у Вас получается такой же поток в обратную строну, и LTR-U-1 уже не справляется с этим потоком и сам он замедляет вывод. У остальных крейтов (включая новый одноместный LTR-CEU-1), таких ограничений по скорости нет. Соответственно, если хотите подтверждение каждого слова, то нужно либо понижать частоту дискретизации LTR34, либо менять крейт.
|
|
|
Re: Генерация сигнала с помощью LTR34
Проблема решилась снижением conf.FrequencyDivisor с 54 до 44. Спасибо за поддержку
|