本文的目的是解释如何使用STM32微控制器的DMA控制器和计时器的PWM输出生成自定义信号,在这种情况下是正弦波。尽管本示例使用NUCLEO-H474ZI-Q,但相同的步骤也可用于其他基于STM32H7的板。在本文中,以下是用于生成自定义信号的:-定时器在PWM输出模式下与信号在CH1-DMA控制器上注意,其他技术可以用于生成各种类型的信号,如DAC(数模控制器),甚至GPIO位敲击。对于这个例子,使用Timer和DMA生成正弦波是最理想的方法,也是本文中描述的方法。

0、简介

本文的目的是解释如何使用STM32微控制器的DMA控制器和计时器的PWM输出生成自定义信号,在这种情况下是正弦波。尽管本示例使用NUCLEO-H474ZI-Q,但相同的步骤也可用于其他基于STM32H7的板。在本文中,以下是用于生成自定义信号的:-定时器在PWM输出模式下与信号在CH1-DMA控制器上注意,其他技术可以用于生成各种类型的信号,如DAC(数模控制器),甚至GPIO位敲击。对于这个例子,使用Timer和DMA生成正弦波是最理想的方法,也是本文中描述的方法。


1.理论

其想法是从STM32上的计时器输出(PWM模式)生成数字信号,并使用外部RC滤波器将其转换为模拟正弦波。为了简单起见,如下所示,使用基本的低通滤波器进行转换。虽然本文侧重于生成数字信号的基础知识,但有关RC滤波器的详细信息,请参阅其他资源。

我们将使用STM32定时器PWM输出通道生成如下红色所示的自定义信号:


然后,使用连接到定时器PWM输出通道输出的RC滤波器,我们将获得所需的正弦波:

我们将使用中心对准计时器 模式以使用PWM和DMA来生成定制信号。这可以通过一种将STM32H7定时器与内部DMA功能相结合的方法来实现。此方法将使用DMA将正弦波输出的连续数据传输到计时器CCR寄存器。定时器CCR寄存器控制PWM占空比的宽度。这将在定时器输出引脚处产生结果栅极驱动信号。当使用DMA硬件将连续数据传输到定时器时,Cortex-M内核可以自由并行处理其他应用程序功能。我们可以通过DMA将该信号的数据馈送到定时器CCR寄存器来生成任何自定义波形。在这个练习中,我们将生成一个正弦波。

 

2.先决条件

核-H745ZI-Q:

Micro USB电缆

  • 该电缆将主机连接到Nucleo板,用于Nucleo上STM32的电源和调试/编程。

示波器

  • 这是为了查看来自STM32 I/O的信号,以检查生成的信号。

软件工具

  • STM32管


 

3.步骤

在本节中,我们将介绍使用STM32CubIDE生成自定义信号的步骤,以及配置NUCLEO-H474ZI-Q板上使用的STM32H7的步骤。

  1. 打开STM32CubeIDE并使用NUCLEO-H474ZI-Q板创建一个项目

  2. 时钟配置:480/240 MHz

我们正在以其最高速度运行STM32H7:系统时钟为480 MHz,外围时钟为240 MHz。



 
  1. 定时器4配置
  •  启用TIM4

  • 在配置模式下,选择Cortex-M7并为通道1选择PWM Generation CH1:


 
  • 添加以下配置

在本节中,我们将选择将要生成的PWM信号的频率。
请更改计数器周期,如下红色突出显示。
同时配置PWM生成通道1,如下红色所示。
注:虽然PWM将被配置为具有一个计数的初始脉冲宽度,但DMA将负责从表中写入值,以生成所需的脉冲串。

  1. DMA配置

在这种情况下,我们使用DMA,因为这是准确生成信号的最佳方式,在这种情况中,CPU不使用,可以处理其他任务。



 
  1. 生成代码

保存STM32CubeIDE项目,此操作将生成代码。

  1. 添加正弦波代码

对于这个例子,它是一个正弦波,但其他数据可以用来生成不同频率的正弦波。
如果您有兴趣了解正弦波数据的更多信息,请在以下分为两部分的视频中找到更多详细信息:
STM32定时器的实践:使用PWM和DMA的自定义信号生成,第1部分,共2部分-YouTube
STM32定时器的实践:使用PWM和DMA的自定义信号生成,第2部分,共2部分-YouTube


CM7项目中的主要.c:

…/*用户代码BEGIN PV*/#定义CCRValue_BufferSize 37 ALIGN_32BYTES(uint32_t不连续正弦CCRValue_Buffer[CRVValue_BufferSize]9414999};/*用户代码端PV*/
  1. 启用D&I(数据和指令)缓存并刷新D缓存

STM32中的两个缓存被启用以提高整体性能。此外,必须刷新数据缓存以正确更新DMA使用的SRAM的内容。
在main.c中为CM7项目添加以下代码:

/*用户代码开始1*/*启用I-Cache------------------------------------------------------*/SCB_EnableICache();/*启用D缓存------------------------------------------------------*/SCB_EnableDCache();/*用户代码结束1*/…/*用户代码开始初始化*/*清理数据缓存以更新DMA要使用的SRAM的内容*/SCB_CleanDCache_by_Addr((uint32_t*)DisconnectousSineCRValue_Buffer,CCRValue_BbufferSize);/*用户代码结束初始化*/
  1. 启动将数据从RAM传输到计时器的功能

在main.c中为CM7项目添加以下代码:

/*用户代码开始2*/HAL_TIM_PWM_Start_DMA(&htim4,TIM_CHANNEL_1,不连续正弦CCRMalue_Buffer,CCRMValue_BufferSize);/*用户代码端2*/
  1. 编译代码并将其闪存到Nulceo板

  2. 使用Nucleo板上的黑色重置按钮B2重置板,运行代码

4.示波器上的结果

TIM4 CH1(GPIO引脚PD12)的自定义PWM信号输出可在连接器CN10引脚#21的Nucleo板上获得(见下图)。

PD12上的示波器捕获:

当将外部RC滤波器添加到PWM输出时,信号被转换为正弦波,如以下示波器捕获所示:

5.链接

  • AN4013:STM32跨系列定时器概述-应用说明

  • NUCLEO-H445ZI-Q:NUCLEO-H745ZI-Q-STM32Nucleo-144开发板,带STM32H445ZI MCU、SMPS,支持Arduino、S。。。

  • STM32CubeIDE:STM32CubeIDE-STM32集成开发环境-STMicroelectronics

  • STM32H745参考手册:STM32H745/755和STM32H747/757基于Arm®的高级32位MCU参考手册

  • STM32H745数据表:数据表-STM32H753xI-32位Arm®Cortex®-M7 400MHz MCU,高达2MB闪存、1MB RAM、46 com。。。

视频

下面是一个由两部分组成的视频的链接,该视频描述了本文中涵盖的步骤。
STM32定时器的实践:使用PWM和DMA的自定义信号生成,第1部分,共2部分-YouTube
STM32定时器的实践:使用PWM和DMA的自定义信号生成,第2部分,共2部分-YouTube