matlab导⼊数据后画图_简易数据采集分析流程.stm32+python
背景:
对于⼀些需要快速验证传感器性能,或者某些实验需要快速采集数据并且需要直观显⽰成波形或者图⽚, 搭建⼀个简易⽅便的数据采集分析系统是有必要的.
本⽂主要介绍以下⼏个⽅⾯:
数据采集整体框架.
Pc使⽤python设定相关参数: fs, 采样点数 采样时间 etc..
MCU使⽤⾃带ADC 根据pc设定的采样率fs进⾏采集后通过uart将数据回传.
Python可以直接对数据简单处理,或者保存成csv⽅便导⼊matlab进⾏更进⼀步数据分析.
Ex1: ADC规则组同时采集 ADC dual channel mode cfg.(strict sample multiple channel at same time)
Ex2: ADC采样率⾃动配置 adc sample rate automatic cfg.
Py & mcu ⾃定简易通信协议. eg:
1. Py send ‘#f=1000’, ‘#sc=1024’ (此处表⽰采样率1000hz, 采样点数1024)
2. Mcu 解析uart接收的命令. 配置参数后进⾏采样. 在采样完成的DMA传输完成IRQ⾥(使⽤DMA可以提⾼最⼤采样速率)将数据上传
upload.
串⼝助⼿抓到的数据格式(字符串, 假设我这⾥是2个通道同时采样)
采集adc值 + 换⾏
adc1 , adc2 + ’rn’
123,333
124,334
120,330
xxx,xxx
Python实现简易串⼝读写与存储.python怎么读取串口数据
1. 环境搭建: (打开命令⾏, 输⼊以下命令安装serial模块)
1pip install serial
2. 开始写代码: 打开串⼝, 读写操作
包含头⽂件 import serial
import serial
ser = serial.Serial('com19', 115200) #按照参数打开串⼝
ser.set_buffer_size(rx_size=20480) #为了设置合适的缓冲区
if ser.isOpen(): #检查打开成功
print('open port successful')
data = b'f=' + bytes(fs, encoding='ascii') + b'rn'
ser.write(data) # only bytes array is supported. lines = '' #所有的⾏
while True: # 在这⾥阻塞2s等待, 读取rx buffer的数据
time.sleep(2)
cnt = ser.inWaiting() # bytes to read in rx buffer
if (cnt > 0):
data = ad(cnt)
lines = str(data, encoding='ascii') # 转码成字符串 break
break # end receive
3. 保存成csv . ⽤于存档或者导⼊MATLAB等其他数据分析处理软件
csv_file = open(f_name + '.csv' , 'w') # 创建并打开⼀个⽂件
csv_file.write(lines) # 如果接收时已经是csv格式可以直接写⼊
for i in range(len(adc1)): # 或者解析成list后再按需存⼊
csv_file.write(adc1[i] + ',' + adc2[i] + 'n')
csv_file.close() # 写完记得关闭.
4.简单的python绘图 - matplotlib
0. 安装matplotlib
pip install matplotlib
1.导⼊并使⽤它的pylab来绘图
import matplotlib.pylab as pl
lines = str(lines, encoding='ascii').splitlines() #.split('rn')
light_cnt = len(lines) # 光强数据长度 print('cnt = ', light_cnt)
light_data = [] # 光强数据
for line in lines: # 分割成⼀⾏⼀⾏, 每⾏2个数据 # if line is not '':
light_data.append(int(line))
print(int(line))
N = light_cnt
axis_x = np.linspace(1, N, num=N)
pl.plot(axis_x, light_data)
pl.title('charge time= %dms' % charge_time)
pl.show()
更详细绘图代码参考 Python 绘图,我只⽤ Matplotlib(⼆)
简单操作 - matlab 绘多个⼦图相关
1. 同⼀张图绘制多条曲线:
plot(y1);
hold on;
plot(y2);
2. 同⼀个页⾯绘制多张图⽤于对⽐:
figure(1); %创建画布.
subplot(1, 2, 1);%在1⾏*2列⾥,画第1个图
subplot(1, 2, i);
%在1⾏*2列的格⼦画第i个图 ,1<i<=总数
例如subplot(2, 3, i)就是这样的.i=1~6
简单操作 - matlab 读取 csv⽂件
M = csvread(csv_name); %返回M是⼀个矩阵.
M(:,1) %可以取第⼀列.(ch1的数据) :表⽰所有⾏
M(:,2) %可以取第⼆列, 以此类推.
plot(M); %按默认画出图
title( ['f=' num2str(freq)]) %画图后title函数⽤于加上格式化的标题
Ex1: ADC dual channel mode cfg.(strictly sample multiple channel at same time)
多ADC同时规则采样配置(严格的同时,同⼀时钟边沿采样)步骤 (单ADC在同⼀时间最多只能采样1个channel)
1. stm32f4⽀持最多3ADC同时采样,称为dual mode/ triple mode.
2. 多ADC时, ADC1=master, ADC2/3 = slave.
只可能存在2种搭配,dual:ADC1+ADC2. Triple:ADC1+ADC2+ADC3.
多ADC⽆法同时采集同⼀个pin.
3. 如果开启DMA传输, 只需要为master(也就是ADC1) 配置即可.
Slave会由master进⾏触发转换.
DMA的src data addr 配置成专门的ADC-CDR 寄存器.
单个data size = word. 在dual mode时, 相当于ADC1+ADC2分别在⾼半字和低半字
Ex2: adc sample rate automatic cfg.
要计算ADC采样率, 需要单次转换所需时钟周期tc cycle和ADC时钟频率 fa.
单次转换cycle = sampling cycle + n-bit resolution cycle.
例如配置为 3 sampling cycle, 12bit采样时, 总共需要的转换时间= 15cycle.也就是每15个ADC clock 可以采样⼀次.
然后对于STM32F4, ADC clock 来⾃APB2 clock. 于是fa与APB2分频值APB2_clk_div以及ADC配置的ADC_CLK_DIV相关.
将这些所有可能的分频值adc_div, apb2_clk_div与单次转换周期tc组合起来,可以构成i*j*k种组合⽅式,⽤for来遍历计算.然后取⼿册上可⾏的ADC clock范围(0.6M~36Mhz)来计算可以所有算出可配置的ADC采样率fs.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论