0. 一定要先看上一节:STM32配置ADC2(DMA)进行采集 DAC 输出-1
1. 实验目标
在上一节的基础上,我们把 DAC(三角波)给集成进来,实现按下按键输出三角波,通过串口发送数据给电脑,分析然后画出电压的波形并且展示出来
开发板:正点原子探索者STM32F407ZG
2. STM32部分
2.1 DAC部分
这里我们采用实验22-2 DAC输出三角波实验
的例程,查看主函数找中和 DAC 相关的代码,发现下图红框中的函数只出现在了 DAC.c 中,于是我们将 DAC.c 添加到上一节的项目中,此时还不够,因为我们采用的是 HAL 库编程,还需要引入官方提供的和 DAC 相关的库函数才可以使用。
全部添加完成后,文件结构如下图所示
此时我们分析一下代码,发现在需要输出三角波的时候,只需要调用dac_triangular_wave
即可,于是我们可以把这个函数放在按键的中断处理中去。
2.2 按键外部中断
和上面类似的方式打开实验4 外部中断实验
,然后添加相关的文件到项目中,如下图所示
然后在按键中断函数部分,我们需要先开启 ADC 的采集,然后发送三角波,这样可以最大程度的保证采样的完整,下面是完整代码
2.3 串口发送
串口集成的过程不再赘述,这里主要是在 ADC 使用 DMA 采集到指定的点数后,会产生一次DMA中断,我们可以在 DMA 中断函数中将采集到的数据发送给电脑,下面是完整代码
到这里STM32部分就已经完成了,再放上一个主函数的图,主要就是各种初始化部分
3. Python处理程序
#%%
import numpy as np
import matplotlib.pyplot as plt
#%%
yt = np.array([])
file_obj = open("ADCdata.txt", encoding="utf-8")
lines = file_obj.readlines()
#%%
for line in lines:
line = line.replace("\n", "")
if len(line) :
# print(line.replace("\n", "").split(' ')[1])
# print(line.replace("\n", "").split(' ')[0])
try:
# original_vol = int(line.replace("\n", "").split(' ')[1])*256+int(line.replace("\n", "").split(' ')[0])
# real_vol = original_vol * (3.3 / 4096);
real_vol = int(line) * (3.3 / 4096);
yt = np.append(yt,real_vol)
# print(real_vol)
except Exception as e:
print(e)
print(yt)
file_obj.close()
# %%
xt = np.arange(0,yt.shape[0],1)
fig1 = plt.figure(figsize=(8, 6))
plt.plot(xt,yt,'.')
plt.plot(xt,yt)
plt.show()
# %%
yt = yt-np.mean(yt)
fig2 = plt.figure()
plt.plot(xt,yt,'.')
plt.plot(xt,yt)
yfft = np.fft.fft(yt)
# plt.plot(abs(np.fft.fftshift(yfft)))
fig3 = plt.figure(figsize=(8, 6))
xf = np.linspace(0,yfft.shape[0]*10000,140)
plt.plot(xf,20*np.log10(abs((yfft))))
# plt.plot((yfft))
plt.show()
# %%
4. 具体操作流程
将 STM32 的 PA4(DAC) 和 PA5(ADC2) 用杜邦线连接起来,然后按下 key0 根据我的程序是会发出两个三角波,按下 key1 是会发出 10 个三角波。我们先打开 STM32 然后打开串口助手连接到 STM32 ,按下 key0 后串口会收到如下的数据
我们把这里的数据全部给拷贝到ADCdata.txt
中,然后运行上面的 Python 程序可以得到如下的结果(因为我设置的采样点很多,所以后面的都是噪声,但是确实是有两个三角波的波形,于是实验是成功的)
如法炮制,我们可以得到按下 key1 的波形,如下图所示,我们可以清楚的看到有10个三角波,实验成功