python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

539ad80226ec634ab9137f9cc3b323df.png

如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题:

  • 示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush.Mcush类型才能运行,比较繁琐。
  • 基础的adc命令只能进行低速测量,不能控制采样率实现高速测量(需要更高阶的ShellLab采集器的daq指令)。

为了解决上述问题,将Shell Lab T1采集器固件做了部分移植,适配一批资源较为充裕的实验板,定制成专用固件(简称“Shell Lab社区版固件”系列)解决上述两个问题,方便大家实验。

优先移植到STM32F401CC/411CE实验板上,参考介绍:

PengShulin:用Python控制硬件33-基于STM32F401CC和STM32F411CE的迷你实验板​zhuanlan.zhihu.com
9c235da8a36137da964e33b89e1c67e6.png

移植完成的“Shell Lab社区版固件”下载地址:

F401CC板子:

http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF401CC.bin

http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF401CC.hex

F411CE板子

http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF411CE.bin

http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF411CE.hex

烧入固件(注意BIN二进制代码需指定写入地址0x08000000),完成后连上USB串口终端,看看有哪些变化(以F401CC为例)?

$ dmesg
...
[683194.776689] usb 1-4: new full-speed USB device number 117 using xhci_hcd
[683194.962409] usb 1-4: New USB device found, idVendor=ffff, idProduct=ffff
[683194.962422] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[683194.962429] usb 1-4: Product: Shell Lab Community Version
[683194.962436] usb 1-4: Manufacturer: Linkong Software
[683194.962442] usb 1-4: SerialNumber: 31003B001351353234363331
[683194.963681] cdc_acm 1-4:1.0: ttyACM0: USB ACM device
$ 

USB设备类型变成:“Shell Lab Community Version”

=>*idn?
ShellLab-WeAct-F401CC,1.0
31003B001351353234363331
=>

设备类型识别变成ShellLab。

=>daq --help
usage: daq [-c <command>] [-i <index>] [-v <value>]
options:-c/--cmd        info|(de)init|start|stop|reset|done|read|freq|vref|channel_mask-i/--idx        index param-v/--val        value param
=>

支持daq命令,用于指定采样率测量波形。

下面打开Shell Lab测试台软件,调出示例脚本“daq”-->“FFT analysis”:

279e71e4838594503cb465607e523453.png

准备信号发生器,生成1KHz正弦波(偏置1.5V,幅度1V),输入PA0引脚,点击“运行”:

155869f8af36de8e60c8b9afd4e703eb.png

可以看到采到了0.016秒的波形(包含4096个采样点),下图是FFT分析结果(分析带宽是采样率的一半:256kHz/2=128kHz),并在较大的几个峰位置标注了幅度。

点击导航栏的方向箭头按钮,然后用鼠标右键可以拖动图表区,实现缩放移动功能,以便观察细节。动态效果:

c66ccaed00f78d5a3fe2cf3a4babcd9b.png
256k采样率采集波形并FFT分析https://www.zhihu.com/video/1182229714634170368

继续换几种波形看看:

三角波,可以看到谐波的组成与方波相似(1/3/5/7...),只是衰减地很快:

46ea9e89b9cf7fa2deab308b42ff03dd.png

锯齿波,可以看到谐波组成的变化(1/2/3/4...):

861b1269e437a769b99bb80b3abca684.png

调幅波,中心频率和两个边频:

6aa12bca303b1156ebdf160fe16a2937.png

更多的波形请读者自行实验了。下面分析一下完整的示范脚本代码(加了中文注释):

# 6 - daq - FFT analysis
# 脚本开始先确定采样参数(通道、采样率、点数)
CHANNEL = 0  # input channel
SAMPLE_RATE = 256000  # HZ
SAMPLE_LENGTH = 4096
SAMPLE_TIME = SAMPLE_LENGTH / float(SAMPLE_RATE)
# FFT峰值检测标注的最大数量限制
PEAKS_LIMIT = 10
# FFT是否需要加窗函数的开关
ADD_WINDOW = False
WINDOW_TYPE = 'hamming'# 下面切换至绘图区域,准备几个字图,每个都有命名,方便后续控制
# 这是FFT相位子图的开关,默认关闭,开启后会增加一个子图
FFT_PHASE_PLOT = False  # True
p = getPlotPanel()
p.addPlot( 'wave', 211, label_y='Signal voltage' )
p.setLimit( 'wave', top=3.3, right=SAMPLE_TIME, auto=False )
p.setLegend( 'wave','Channel %d'% CHANNEL )
if FFT_PHASE_PLOT:p.addPlot( 'fft', 413, label_y='FFT Amplitude', label_x="Frequency (Hz)" )p.setLimit( 'fft', right=SAMPLE_RATE/2, auto=False )p.addPlot( 'fft2', 414, label_y='FFT Phase', label_x="Frequency (Hz)" )p.setLimit( 'fft2', right=SAMPLE_RATE/2, auto=False )
else:p.addPlot( 'fft', 212, label_y='FFT Amplitude', label_x="Frequency (Hz)" )p.setLimit( 'fft', right=SAMPLE_RATE/2, auto=False )# 创建控制器对象并初始化
s = ShellLab(PORT)
s.daq_init( freq=SAMPLE_RATE, length=SAMPLE_LENGTH, channels=[CHANNEL] )while True:# 启动测量s.daq_start()# 循环等待测量结束while True:done = s.daq_done()info('Sampling (%d / %d)'% (done, SAMPLE_LENGTH))if done >= SAMPLE_LENGTH:breaktime.sleep(0.01)# 测量完成,读数据(因为只有一个通道,传入第0通道的参数),返回数据列表info('Reading...')dat = s.daq_read(0)  # read the first channel# 开始画图info('Ploting...')# 先绘制原始波形dat_x = numpy.linspace(0, SAMPLE_TIME, SAMPLE_LENGTH, endpoint=False)p.resetData( 'wave' )p.addData( 'wave', dat, dat_x )# 根据需要,数据加窗if ADD_WINDOW:window = scipy.signal.get_window( WINDOW_TYPE, len(dat) )dat_offset = numpy.mean(dat)dat = (dat-dat_offset) * window + dat_offset# 快速傅立叶变换fft_x = numpy.linspace(0, SAMPLE_RATE, SAMPLE_LENGTH, endpoint=False)fft_raw = numpy.fft.fft(dat)/(SAMPLE_LENGTH/2)fft_abs = abs(fft_raw)fft_abs[0] = 0  # reset the waveform offset#fft_abs_max = max(fft_abs)p.resetData( 'fft' )#p.addData( 'fft', fft_abs, fft_x )  # plot the whole spectrum rangep.addData( 'fft', fft_abs[:SAMPLE_LENGTH/2], fft_x[:SAMPLE_LENGTH/2] )if FFT_PHASE_PLOT:fft_phase = numpy.angle(fft_raw) / math.pi * 180p.resetData( 'fft2' )p.addData( 'fft2', fft_phase[:SAMPLE_LENGTH/2], fft_x[:SAMPLE_LENGTH/2] )# 查找谱图峰值并排序fft_max = max(fft_abs[:SAMPLE_LENGTH/2])peaks, props = scipy.signal.find_peaks(fft_abs[:SAMPLE_LENGTH/2],height=fft_max/5)def peak_sort( fa, fb ):global fft_absreturn 1 if (fft_abs[fa] >= fft_abs[fb]) else -1peaks = list(peaks)peaks.sort( peak_sort, reverse=True )# 添加峰值标注p.resetAnnotation('fft')  # dynamic marker needs to be clear for next roundfor idx in peaks[:PEAKS_LIMIT]:# 默认标注幅度,可以改为频率或自定义txt = '%f'%fft_abs[idx]  # add amplitude#txt = '%f'%fft_x[idx]  # add freq value#txt = peaks.index(idx) + 1  # add sequencep.addAnnotation( 'fft', txt, xy=(fft_x[idx],fft_abs[idx]) )# 复位,准备下一循环 s.daq_reset()

上面代码的理解需要一定的数字信号处理基础,这里就不展开了。

熟悉Python的同学应该已经发现了, Shell Lab测试台软件集成了数值分析库numpy,才能方便地进行矩阵分析,快速傅立叶变换。

没错,除此之外还集成了scipy库进行科学计算,集成了matplotlib库用于绘图。

至此,你可以用二三十元的成本获得一个简易的4通道12位精度的信号测量采集控制系统,你可以改动脚本把数据存下来,还具备数据记录功能。

对比F401CC和F411CE两种板子有什么区别呢?主要是后者SRAM容量大了64K字节,所以单次的测量深度更长。

实测:前者最大12000点,后者最大39000点,推荐后者。

注:Shell Lab测试台软件对个人用户免费,目前处于公测阶段,欢迎试用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java连接hbase_HBase实战 | 05405.15.0Spark2使用HBaseSpark访问HBase

转载自微信公众号Hadoop实操温馨提示&#xff1a;如果使用电脑查看图片不清晰&#xff0c;可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github&#xff1a;https://github.com/fayson/cdhproject提示&#xff1a;代码块部分可以左右滑动查看噢1文章编写目的越…

wxpython使用简介_wxpython简介

Python​ Python是一种成功的脚本语言&#xff0c;它最初是由Guido van Rossum开发的。它于1991年首次发布。Python的灵感来自于ABC和Haskell编程语言。Python是一种高级的、通用的、多平台的、解释型的语言。有人更喜欢称它为动态语言。它很容易学习。Python是一种极简主义语言…

电脑4次连续故障音_格力空调电子膨胀阀故障判定与“E6”处理方法

一、电子膨胀阀常见故障原因电器电子膨胀阀是一种利用电子控制器通过电缆向线圈发出脉冲控制信号&#xff0c;控制施加于膨胀阀上的电压或电流&#xff0c;从而控制阀针的动作实现阀口流通面积改变达到流量自动调节目的的节流器件&#xff0c;是空调器的重要部件之一&#xff0…

mysql+性能+计算列_MYSQL性能优化的最佳20+条经验

当你查询表的有些时候&#xff0c;你已经知道结果只会有一条结果&#xff0c;但因为你可能需要去fetch游标&#xff0c;或是你也许会去检查返回的记录数。在这种情况下&#xff0c;加上 LIMIT 1 可以增加性能。这样一样&#xff0c;MySQL数据库引擎会在找到一条数据后停止搜索&…

ClickHouse 入门与实战教程

目录 1. ClickHouse 简介 什么是 ClickHouse&#xff1f; ClickHouse 的优势和特点 适用场景 2. 安装 ClickHouse 3. ClickHouse 的基本概念 4. ClickHouse 的基本操作 创建数据库和表、插入和查询数据 使用 MergeTree 引擎处理时序数据 管理分区 创建带有分区的 Mer…

sid图像数据_实战材料信息学:使用skimage处理扫描电子显微镜(SEM)图像数据

算开个头&#xff0c;不算特别实战扫描电子显微镜&#xff0c;材料开发不可缺少的分析仪器。原理就不详述了。材料的形貌&#xff0c;具体长什么样的都可以看得很清楚。材料表面的形貌很多情况下会和材料的物性产生直接关系&#xff0c;比如说可以从SEM看出粒子的直径分布&…

arcgis制作空间变化图怎么做_听说如果做数据分析不用GIS,会被开?

Q你有没有遇到这样的情况&#xff1f;身边的同事或同学经常说什么高程图、坡向图、坡度图、生态水文图、热力密度图、大数据算法&#xff0c;而自己却一无所知&#xff0c;心里感到特别的慌啊。文末附ArcGIS最新版及超强数据神器 很多人会说&#xff0c;“设计师是感性的&#…

仅完成部分的readprocessmemory或write_王者荣耀:三种李小龙获取方式!无需完成任务、28号即可兑换...

哈喽大家好&#xff01;我是你们的小菜鸡“荣耀急先锋”王者荣耀五周年庆限定皮肤李小龙活动已经开始啦&#xff01;大家有参加了吗&#xff1f;或者说对这个活动不太理解&#xff0c;针对这些小伙伴菜鸡今天就简单的跟大家讲讲李小龙皮肤活动的规则&#xff0c;让我们一起看看…

优秀ppt作品范例_首次公开|锐普的内部PPT配色库

每次发锐普的作品&#xff0c;总会有小伙伴们问&#xff1a;这么漂亮的配色到底是怎么做的呢&#xff1f;今天我在锐普内部的资源库发现一个超级宝贝——锐普内部的PPT配色库&#xff0c;1008张超精彩PPT配色范例。我的天&#xff0c;原来设计部竟然还藏着这种宝贝&#xff01;…

linux rz sz 安装_Windows与Linux文件传输之lrzsz工具

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章如需学习视频&#xff0c;请查看本头条号简介&#xff0c;免费在线观看学习视频1. lrzsz工具简介Windows向Linux传输文件&#xff0c;最简单的方法是使用rz和sz命令。当然用有其他的方法&#xff0c;比如通过ssh(winscp…

java游戏重新开始_问题1:java问题--某局小游戏结束后怎么重新开始?

有个问题&#xff0c;想了好久没解决&#xff0c;上网找了下&#xff0c;貌似也没找到好的解决方法(谷歌暂时没上去)&#xff0c;现在这里写下来吧&#xff1a;最近在写一个五子棋的小游戏&#xff0c;也算是刚刚开始java入门的一个作品了吧&#xff0c;刚刚完成到人人对战(当然…

lua pcall 返回值_Redis和Lua整合

前面我们已经介绍完了Redis相关的理论知识&#xff0c;从本篇开始我们介绍一些Redis相关的时机应用。比如&#xff1a;Redis整合LuaRedis的消息模式Redis实现分布式锁常见的缓存问题我们先从Redis整合Lua的使用开始。lua是一种轻量小巧的脚本语言&#xff0c;用标准C语言编写并…

java 异步调用webapi_Async Await异步调用WebApi

先铺垫一些基础知识 在 .net 4.5中出现了 Async Await关键字&#xff0c;配合之前版本的Task 来使得开发异步程序更为简单易控。 在使用它们之前 我们先关心下 为什么要使用它们。好比 一个人做几件事&#xff0c;那他得一件一件的做完&#xff0c;而如果添加几个人手一起帮着…

百度相关搜索软件_不太热门的办公神器软件篇搜索相关

这次介绍两个windows平台超好用的搜索神器——listary和everything全文阅读约需3分钟在工作中&#xff0c;虽然大部分文件都会分门别类地放在对应的文件夹中&#xff0c;但总有一些放完就忘了在哪或是层级过深打开不便的情况。这两个搜索神器完美地解决了找不到文件且windows自…

mysql 回滚段_MySQL和PostgreSQL比较

1、MySQL相对来说比较年轻&#xff0c;首度出现在1994年。它声称自己是最流行的开源数据库。MySQL就是LAMP(用于Web开发的软件包&#xff0c;包括 Linux、Apache及Perl/PHP/Python)中的M。构建在LAMP栈之上的大多数应用都会使用MySQL&#xff0c;包括那些知名的应用&#xff0c…

dbscan java_DBSCAN算法的Java,C++,Python实现

最近由于要实现‘基于网格的DBSCAN算法’&#xff0c;网上有没有找到现成的代码[如果您有代码&#xff0c;麻烦联系我]&#xff0c;只好参考已有的DBSCAN算法的实现。先从网上随便找了几篇放这儿&#xff0c;之后对比研究。DBSCAN简介&#xff1a;1.简介DBSCAN 算法是一种基于密…

java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

Java并发一、锁1. 偏向锁1. 思想背景来源&#xff1a;HotSpot的作者经过研究发现&#xff0c;大多数情况下&#xff0c;锁不仅不存在多线程竞争&#xff0c;而且总是由同 一线程多次获得&#xff0c;为了让线程获得锁的代价更低而引入了偏向锁。原理&#xff1a;在对象头和栈帧…

python 数组赋值_pythonamp;numpy的赋值

有点编程基础的童鞋看到这个标题可能会有点懵逼&#xff0c;这还是个问题吗&#xff1f;不就是个等号()解决问题嘛&#xff01;我也希望是如此简单&#xff0c;因为上个星期被这个问题折磨到崩溃&#xff01;一般的python程序需要赋值时的确是通过等号()实现的&#xff0c;不管…

我的世界java 内存_我的世界如何分配内存

如果你在运行Minecraft时出现内存错误等问题&#xff0c;你可能需要给Minecraft分配更多内存来解决运行故障。如果你玩的是新版本的Minecraft&#xff0c;那么你可以从启动器里直接分配内存(RAM)。如果你使用的是旧版本&#xff0c;那么你需要创建一些文件来改变Minecraft内存使…

springbean的生命周期_spring bean生命周期(涵盖spring常用接口的载入)

spring bean生命周期流程图&#xff1a;​​​​其中包含了很多常用的接口&#xff0c;可以参考spring 常用接口&#xff1b;下面写个例子证明下&#xff1a;1.实现InitializingBean以及各个Aware接口public class UserB implements InitializingBean , BeanFactoryAware , Bea…