Qt+TiePieHS3开发笔记(二):HS3发送器发出内置波形、直连示波器,示波器检测内置波形Demo

若该文为原创文章,转载请注明原文出处

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/167589503

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

Qt开发专栏:三方库开发技术

上一篇:《Qt+TieQPieHS3开发笔记(一):TiePie HS3介绍、下载sdk和基础开发环境Demo》

下一篇:敬请期待...

前言

  波形数据是算法模型数据,通过设备环能将其当作信号换发射出去。

Demo

  

TiePie Handyscope HS3的基本开发流程

概述

  使用 libtiepie-hw 库控制仪器、执行测量,需要遵循以下步骤:

  • 步骤一:Initialize the library --- 初始化库
  • 步骤二:Update the device list --- 更新设备列表
  • 步骤三:Open the required device(s) --- 打开所需设备
  • 步骤四 :Setup the Oscilloscope --- 配置示波器
    -- Setup the oscilloscope channels --- 配置示波器通道
    -- Setup the oscilloscope timebase --- 配置示波器时基
    -- Setup the trigger (channels and device) --- 配置触发(通道与设备)
  • 步骤五:Setup the Generator --- 配置信号发生器
  • 步骤六:Start a measurement --- 启动一次测量
  • 步骤七:Wait for the measurement to be ready --- 等待测量就绪
  • 步骤八:Retrieve the measured data --- 获取测量数据
  • 步骤九:Close the device(s) --- 关闭设备
  • 步骤十:Exit the library --- 退出库

Demo实现步骤

步骤一:初始化库

  用于初始化和退出库以及从库本身检索信息的函数。

  加载库后,必须先对其进行初始化,然后才能使用库中的函数。在关闭库之前,当使用库的应用程序不再需要它时,必须调用tiepie_hw_fini()来清除和释放库使用的资源。

  

步骤二:更新设备列表

  

步骤三:打开所需设备

  

  

步骤四:配置示波器

  

步骤五·:配置信号发生器

  

步骤六:启动信号发生器,再启动测量

  

步骤七:循环检测测量,获取测量数据

  

步骤八:先停止使能输出

  

步骤九:发生器关闭输出驱动

  

步骤十:关闭设备

  

步骤十一:退出库

  

Demo运行结果

  

相关函数原型

  在每个库函数调用时,都会设置一个状态标志,指示函数是如何执行的。当函数调用的行为与预期不同时,请检查状态以查找可能的原因。

  • TiePie::Hardware::DeviceListItem::canOpen():以某功能打开
  • TiePie::Hardware::DeviceListItem::openOscilloscope():打开示波器
  • TiePie::Hardware::Oscilloscope::setMeasureMode():设置测量模式
  • TiePie::Hardware::Oscilloscope::setSampleRate():设置采样率
  • TiePie::Hardware::Oscilloscope::setRecordLength():设置记录长度
  • TiePie::Hardware::OscilloscopeChannel::setEnabled():通道使能
  • TiePie::Hardware::OscilloscopeChannel::setRange():通道测量范围
  • TiePie::Hardware::OscilloscopeChannel::setCoupling():测量类型
  • TiePie::Hardware::OscilloscopeChannel::start():开始测量
  • TiePie::Hardware::OscilloscopeChannel::recordLength():数据长度
  • TiePie::Hardware::OscilloscopeChannel::getData():获取数据
  • TiePie::Hardware::DeviceListItem::openGenerator():打开发生器
  • TiePie::Hardware::Generator::setSignalType():设置信号类型
  • TiePie::Hardware::Generator::setFrequency():设置频率
  • TiePie::Hardware::Generator::setAmplitude():设置幅值
  • TiePie::Hardware::Generator::setOffset():设置偏移
  • TiePie::Hardware::Generator::setOutputEnable():设置输出使能
  • TiePie::Hardware::Generator::start():开始输出

Demo源码

cpp 复制代码
void Hs3Manager::testGeneratorAndMeasurement()
{
    // sdk版本
    LOG << QSTRING("Library version: %1.%2.%3")
           .arg(TIEPIE_HW_VERSION_MAJOR)
           .arg(TIEPIE_HW_VERSION_MINOR)
           .arg(TIEPIE_HW_VERSION_PATCH);
    // 步骤一: 初始化sdk
    TiePie::Hardware::Library::init();
    // 步骤二: 允许探测开启,刷新列表
    TiePie::Hardware::Network::setAutoDetectEnabled(true);
    // 步骤三: 刷新设备列表(探测刷新)
    TiePie::Hardware::DeviceList::update();
    // 步骤四: 打开第一个设备
    if(TiePie::Hardware::DeviceList::count() == 0)
    {
        LOG << "if(TiePie::Hardware::DeviceList::count() == 0)";
        TiePie::Hardware::Library::fini();
        return;
    }
    // 步骤五:获取项目智能指针(默认返回就是智能指针)
    std::unique_ptr<TiePie::Hardware::DeviceListItem> pItemPtr = TiePie::Hardware::DeviceList::getItemByIndex(0);
    if(!pItemPtr)
    {
        LOG << "if(!pItemPtr)";
        TiePie::Hardware::Library::fini();
        return;
    }
    // 步骤六:打印设备基础信息
    TiePie::Hardware::DeviceListItem *pItem = pItemPtr.get();
    LOG << QString("===== 设备信息 =====");
    LOG << QString("设备名称:%1").arg(QString::fromStdString(pItem->name()));
    LOG << QString("序列号:%1").arg(pItem->serialNumber());
    QStringList strList;
    {
        if(pItem->types() & TIEPIE_HW_DEVICETYPE_OSCILLOSCOPE)
        {
           strList << QSTRING("Oscilloscope(示波器)");
        }
        if(pItem->types() & TIEPIE_HW_DEVICETYPE_GENERATOR)
        {
           strList << QSTRING("Generator(信号源)");
        }
        if(strList.size() == 0)
        {
            strList << QSTRING("Unknow");
        }
    }
    LOG << QString("有效类型:%1").arg(strList.join(","));

/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 示波器 配置部分 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
    // 步骤七: 打开信号发生器
    std::unique_ptr<TiePie::Hardware::Oscilloscope> oscPtr;

    if(!pItem->canOpen(TIEPIE_HW_DEVICETYPE_OSCILLOSCOPE))
    {
        LOG << "if(!pItem->canOpen(TIEPIE_HW_DEVICETYPE_OSCILLOSCOPE))";
        TiePie::Hardware::Library::fini();
        return;
    }
    oscPtr = pItem->openOscilloscope();
    if(!oscPtr)
    {
        LOG << "Failed to openOscilloscope()";
        TiePie::Hardware::Library::fini();
        return;
    }
    // 步骤八: 设置 示波器 参数
    TiePie::Hardware::Oscilloscope * pOsc = oscPtr.get();
    {
        LOG << pOsc;
        // 设置采集模型: 块采集模式 示波器在块采集时,会持续循环往片上缓存写采样点;当触发条件满足,就停止采集
        pOsc->setMeasureMode(TIEPIE_HW_MM_STREAM);
        // 设置采样率 1MHz
        pOsc->setSampleRate(100);
        // 设置记录长度
        pOsc->setRecordLength(100);
        // 设置预触发采样比例(仅TIEPIE_HW_MMB_BLOCK块采集摸生效, 0: 触发到来那一刻,才开始采集, 50: 触发到来那一刻,总记录一半是出发前的,一半是触发后的)
//        pOsc->setPreSampleRatio(0);
        // 设置通道1
        const TiePie::Hardware::Oscilloscope::Channels & channels = pOsc->channels;
        TiePie::Hardware::OscilloscopeChannel * pChannel1 = channels[0].get();
        {
            pChannel1->setEnabled(true);
            pChannel1->setRange(4.0);
            pChannel1->setCoupling(TIEPIE_HW_CK_DCV);
        }
    }

/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 示波器 配置部分 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/


/*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 信号发生器 配置部分 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/
    // 步骤七: 打开信号发生器
    std::unique_ptr<TiePie::Hardware::Generator> genPtr;

    if(!pItem->canOpen(TIEPIE_HW_DEVICETYPE_GENERATOR))
    {
        LOG << "if(!pItem->canOpen(TIEPIE_HW_DEVICETYPE_GENERATOR))";
        TiePie::Hardware::Library::fini();
        return;
    }
    genPtr = pItem->openGenerator();
    if(!genPtr)
    {
        LOG << "Failed to openGenerator()";
        TiePie::Hardware::Library::fini();
        return;
    }
    // 步骤八: 设置 发生器 参数
    TiePie::Hardware::Generator *pGen = genPtr.get();
    {
        // 设置信号类型
        pGen->setSignalType(TIEPIE_HW_ST_TRIANGLE);
        // 设置信号频率
        pGen->setFrequency(100);        // 100 Hz(为了让打印看到效果,可以判断数据)
        // 设置输出幅值
        pGen->setAmplitude(2);          // 2 V
        // 设置峰值偏移
        pGen->setOffset(0);             // 0 V
        // 打开硬件输出通道
        pGen->setOutputEnable(true);
    }
/*↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 信号发生器 配置部分 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑*/
    // 步骤九: 开始发生器,开始示波器(必须要先开启发生器,否则先开启示波器会崩溃)
//    pGen->start();
    pOsc->start();

    // 步骤十:等待60s
    QElapsedTimer elapsedTimer;
    elapsedTimer.start();
    while(elapsedTimer.elapsed() < 60 * 1000)
    {
        qApp->processEvents(QEventLoop::AllEvents, 1000);
//        LOG << elapsedTimer.elapsed() << pOsc->isDataReady();
        // 读取数据
        if(pOsc->isDataReady())
        {
            quint64 size = pOsc->recordLength();
            std::vector<float> buf(size);
            float *pBuf = &buf[0];
            pOsc->getData(&pBuf, 1, 0, size);
            QString str;
            for(int index = 0; index < size; index++)
            {
                if(index == 0)
                {
                    str += QSTRING("%1").arg(buf[index]);
                }else{
                    str += QSTRING(",%1").arg(buf[index]);
                }
            }
            LOG << "==============================================================";
            LOG << size << str;
        }
    }
    // 步骤十一: 停止输出波形,,但硬件输出缓冲/输出驱动仍然保持导通,输出引脚依然有电平;
    pGen->stop();
    // 步骤十二: 关断输出驱动, 等于将BNC输出断开
    pGen->setOutputEnable(false);
    // 步骤是三: 释放sdk
    TiePie::Hardware::Library::fini();
}

工程模板v1.1.0

  

上一篇:《Qt+TieQPieHS3开发笔记(一):TiePie HS3介绍、下载sdk和基础开发环境Demo》

下一篇:敬请期待...

本文章博客地址:https://hpzwl.blog.csdn.net/article/details/167589503

相关推荐
陈年老古董5 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
zhanghaha13145 小时前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
Cx330❀10 小时前
Qt 界面美化指南:从零掌握 QSS 核心机制与工程实践
开发语言·qt·ui·性能优化·图形渲染
zx_7414848111 小时前
PyQt5 环境搭建保姆级教程:PyCharm + QtDesigner + PyUIC 完整配置
开发语言·qt·pycharm·pyqt
Python图像识别13 小时前
46-【2027毕设】YOLO11田间杂草检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
沫璃染墨1 天前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
好好学习O(∩_∩)O1 天前
[QT] 多线程moveToThread 和易踩的8个坑
开发语言·qt
北i1 天前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
扶尔魔ocy1 天前
【qt openGL入门笔记】OSG实现显示飞机模型飞行的点迹(二)
qt·opengl·osg