6

labview入门到出家11(补充)——基于单片机和labview开发的虚拟示波器 - laocao-老曹

 2 years ago
source link: https://www.cnblogs.com/laocao-blog/p/16479121.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

labview入门到出家11(补充)——基于单片机和labview开发的虚拟示波器

    之前有小伙伴提到需要虚拟示波器的资料,有些库还有文件丢失了,直接给的工程跑不起来,这里我把关键的地方讲解一下,大家可以自行开发。其实开发不难,只是有些点会耗点时间。虚拟示波器,顾名思义就是非实物的示波器,但也还是硬件(便携的采集设备)和软件(在电脑上显示和操作)的结合,和数字示波器相比,本质上区别不大,现在贵一些的数字示波器从功能上看,也很像一台计算机了)。今天要讲的只是低配的,简易版的虚拟示波器(在下当年的毕业设计)。下位机是基于STM32的ADC采集实现的信号抓取,然后通过串口传到上位机中显示。单片机的ADC和串口传输,注定了这虚拟示波器采集的波形频率不会太高,之前能在上位机上还原得比较好的波形频率是25Khz以下,如果大家有其他更快的采集(DSP,FPGA,NI采集卡)和数据上传的方式(USB等),可以尝试一下,也期待你们的分享。下面大体对硬件(外围电路),单片机程序(STM32),和上位机程序(labview)三部分进行讲解。

d5b7411fa9a8439385568126158de3f6.png

2283375-20220714195728230-1760774956.gif​编辑

1、硬件

        硬件很简单,就是将输入到单片机的波形信号进行处理。因为我用的STM32的单片机,能检测到的电压值是0~3.3V,所以硬件部分就是把输入的交流信号先控制在-1.65V~1.65V之间,最后再通过电路将信号往上偏置1.65V就可以给单片机采集了。至于如何将信号放大放小,控制到可采集的电压范围呢,可以通过上位机发送串口数据给单片机,让单片机控制继电器(或者其他开关方式)切换运放端的电阻,达到更改运放倍数的方式,最后上位机呈现波形的时候加上放大缩小的倍数,就可以在上位机界面上还原波形信号了。我这里先采用了LM358的双电源运放芯片(交流信号,需要双电源运放芯片),后面因为LM358在高频输入的时候,运放输出的信号在零点处会失真,换了一款高频的运放芯片UA741,问题解决。双电源里面的负电压是通过LCL7660输出的。至于偏置电压,是我在multisim上面仿真出来的,实际测试后确实可以偏置,大家可以尝试使用1比1的运放后加偏置电压,也可以参考我的设计电路。附上完整电路图。

5a599a955d2c44eb8bb16f830556f526.jpeg

2283375-20220714195728230-1760774956.gif​编辑

1-1:运放电路

这是直接用了毕业设计里面的图片,之前的文件不见了。应该能看懂吧 。运放采用的是最简单的负反馈放大电路。放大倍数Vout/Vin=R1/R2。

6959682288a9414ab7e6f6a9d6124105.jpeg

2283375-20220714195728230-1760774956.gif​编辑

1-2:负电压电路

由于运放芯片想运放负极电压信号,需要采用双电源模式,必须为运放芯片提供负电压。所以本设计采用低功率,额定电压为5V的电源极性转换器ICL7660。ICL7660输入5V正电压,输出-5V电压。为LM358提供双电源。本设计采用ICL7660的基本负电压转换模式。

4b9adf511212459182ed841d2edb493c.png

2283375-20220714195728230-1760774956.gif​编辑

1-3:1.65V偏置电路(自己仿真实现的,实测可用)

 

41ee714bb7eb4323ae9240cfa500ec01.png

2283375-20220714195728230-1760774956.gif​编辑

2、单片机软件

这个直接用STM32的单片机ADC采集和串口例程,将数据分高4位和低8位的方式(单片机串口只能上传8位的数据),将12位的ADC数据通过串口分别传输给上位机,ADC采样率调到最高,串口通过DMA的方式,这样可以达到最高的采集速度。最后分别用两个for循环,循环往串口发送1000个低8位和1000个高4位数据。每次发送两组1000个数据的间隔你们可以自己定,我记得我应该间隔是100ms左右刷新一次数据,上位机整合两组数据后,一次显示1000个数据点。ADC和串口传输数据的可以在STM32的例程中找到,具体逻辑这里不再累述。不过还是附上当年写的几条程序吧。

5b688e65dfec4706aec42ee19536304f.png

2283375-20220714195728230-1760774956.gif​编辑

1、连续读取1000个ADC数据;

2、拆分低8位和高4位;

3、向串口上传低8位数据;

4、向串口上传高4位数据;

3、上位机

        上位机在整合两次接收的数据,直接调用Labview提供的信号分析函数,如单频测量函数,频谱测量函数以及幅值和电平测量函数。

3-1:读取串口数据

c0bcad84d93f49ce8a2634813fb26c67.png

2283375-20220714195728230-1760774956.gif​编辑

 3-2:整合高4位,低8位位数据。右侧输出直接给到波形显示控件

57fff312bf1f4956874caf890a467a6e.png

2283375-20220714195728230-1760774956.gif​编辑

 3-3:波形控件

前面板->控件->新式->图形->波形图。

bd017f82fdd844089c22c9f997e10508.png

2283375-20220714195728230-1760774956.gif​编辑

4、最终整合后的虚拟示波器效果

55f6fd77aa384e7bbb15e684eb6beea9.png

2283375-20220714195728230-1760774956.gif​编辑

 采集的信号范围为5HZ~25KHZ(STM32F1系列采样率最高为0.5MS/s),0.1V~16.5V的模拟信号;幅值误差低于5%,频率误差低于2%,能满足日常中大多信号/电压的信号采集与分析。希望对大家有所作用,也希望国内开源资源能越来越丰富吧。虽然一般技术不能给我们工程师带来多大的财富,但至少在某个年龄段,在追求一种引以为傲的技能的时候,能让我们感到充实,自豪,也是一种不错的人生体验呢!

原创不易,一键三连拉!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK