做化妆品的一些网站,营口市代做网站,100m网站空间服务费,西安旅游攻略自助游如前篇所介绍#xff0c;用Shell Lab测试台软件配合之前介绍的任意款实验板#xff0c;都能方便地实现ADC电压测量#xff0c;但遇到两个问题#xff1a;示例代码虽然众多#xff0c;但大都默认ShellLab类型的控制器#xff0c;需要手动改为Mcush.Mcush类型才能运行…如前篇所介绍用Shell Lab测试台软件配合之前介绍的任意款实验板都能方便地实现ADC电压测量但遇到两个问题示例代码虽然众多但大都默认ShellLab类型的控制器需要手动改为Mcush.Mcush类型才能运行比较繁琐。基础的adc命令只能进行低速测量不能控制采样率实现高速测量需要更高阶的ShellLab采集器的daq指令。为了解决上述问题将Shell Lab T1采集器固件做了部分移植适配一批资源较为充裕的实验板定制成专用固件简称“Shell Lab社区版固件”系列解决上述两个问题方便大家实验。优先移植到STM32F401CC/411CE实验板上参考介绍PengShulin用Python控制硬件33-基于STM32F401CC和STM32F411CE的迷你实验板zhuanlan.zhihu.com移植完成的“Shell Lab社区版固件”下载地址F401CC板子http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF401CC.binhttp://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF401CC.hexF411CE板子http://www.linkongsoft.com/shell-lab/firmware/ShellLabCommunity_WeActF411CE.binhttp://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, idVendorffff, idProductffff
[683194.962422] usb 1-4: New USB device strings: Mfr1, Product2, SerialNumber3
[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”准备信号发生器生成1KHz正弦波偏置1.5V幅度1V输入PA0引脚点击“运行”可以看到采到了0.016秒的波形包含4096个采样点下图是FFT分析结果分析带宽是采样率的一半256kHz/2128kHz并在较大的几个峰位置标注了幅度。点击导航栏的方向箭头按钮然后用鼠标右键可以拖动图表区实现缩放移动功能以便观察细节。动态效果256k采样率采集波形并FFT分析https://www.zhihu.com/video/1182229714634170368继续换几种波形看看三角波可以看到谐波的组成与方波相似1/3/5/7...只是衰减地很快锯齿波可以看到谐波组成的变化1/2/3/4...调幅波中心频率和两个边频更多的波形请读者自行实验了。下面分析一下完整的示范脚本代码加了中文注释# 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_ySignal voltage )
p.setLimit( wave, top3.3, rightSAMPLE_TIME, autoFalse )
p.setLegend( wave,Channel %d% CHANNEL )
if FFT_PHASE_PLOT:p.addPlot( fft, 413, label_yFFT Amplitude, label_xFrequency (Hz) )p.setLimit( fft, rightSAMPLE_RATE/2, autoFalse )p.addPlot( fft2, 414, label_yFFT Phase, label_xFrequency (Hz) )p.setLimit( fft2, rightSAMPLE_RATE/2, autoFalse )
else:p.addPlot( fft, 212, label_yFFT Amplitude, label_xFrequency (Hz) )p.setLimit( fft, rightSAMPLE_RATE/2, autoFalse )# 创建控制器对象并初始化
s ShellLab(PORT)
s.daq_init( freqSAMPLE_RATE, lengthSAMPLE_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, endpointFalse)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, endpointFalse)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],heightfft_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, reverseTrue )# 添加峰值标注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测试台软件对个人用户免费目前处于公测阶段欢迎试用。