STM32配置ADC2(DMA)进行采集 DAC 输出-2

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个三角波,实验成功
在这里插入图片描述

5. 完整的工程代码和实验数据可以在这里进行下载

STM32配置ADC2(DMA)进行采集 DAC 输出

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你可以使用STM32DAC模块来输出一个波形,然后使用ADC模块来采集这个波形。下面是一个简单的例子,展示了如何使用STM32Cube HAL库来实现这个功能。 首先,你需要配置DACADC的引脚和模式。例如,你可以选择一个DAC通道输出一个三角波形,然后将该通道连接到ADC输入引脚。 接下来,你需要初始化DACADC模块。在初始化DAC时,你可以设置输出波形的幅值和频率。在初始化ADC时,你需要配置输入通道和采样率等参数。 然后,在主循环中,你可以使用DAC模块来生成波形,并同时使用ADC模块来采集该波形。 以下是一个简单的示例代码,展示了如何实现这个功能: ```c #include "stm32f4xx_hal.h" DAC_HandleTypeDef hdac; ADC_HandleTypeDef hadc; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DAC_Init(void); static void MX_ADC1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DAC_Init(); MX_ADC1_Init(); HAL_DAC_Start(&hdac, DAC_CHANNEL_1); HAL_ADC_Start(&hadc); while (1) { for (uint16_t i = 0; i < 4096; i++) { HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, i); HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); uint16_t adcValue = HAL_ADC_GetValue(&hadc); // 在这里可以处理采集到的ADC值 } } } void SystemClock_Config(void) { // 系统时钟配置 } static void MX_GPIO_Init(void) { // GPIO初始化配置 } static void MX_DAC_Init(void) { hdac.Instance = DAC; HAL_DAC_Init(&hdac); DAC_ChannelConfTypeDef sConfig = {0}; sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1); } static void MX_ADC1_Init(void) { hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.NbrOfConversion = 1; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; HAL_ADC_Init(&hadc); ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; // 根据实际情况选择ADC通道 sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc, &sConfig); } ``` 请记得根据你的具体硬件配置和需求进行适当的修改。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值