
1. 问题背景客户需要使用 MCU 输出正弦波,但受限于 MCU DAC 数量不足,建议尝试使用 PWM加滤波方式产生正弦波。同时要求正弦波与固定电平交替输出。因此可用一个 TIM 输出PWM,同时用另一个 TIM 来定时切换输出正弦波或固定电平。. ]8 u3 A3 l% Y. G$ G 使用 TIM 输出 PWM 产生正弦波形时,需要结合 GPDMA 来实现。在 STM32U5 系列中,GPDMA 共有 16 个独立通道,其中 12-15 通道还具有 2D addressing/ repeat 功能。因此也可以使用一个 TIM 加 GPDMA 的一个 2D 通道实现 PWM 波形切换功能。 2 |6 B" [- ~" A+ a& | 2. 产生 PWM4 ^2 {2 ^& }" Q6 P. M c P 本文按以下配置产生 PWM,在 U575 NUCLEO 板测试: \7 u2 m* Q- F) I9 ?$ t$ T9 U (1)MCU 主频:100MHz% X4 Z( h% S2 D; G" e, V. a (2)PWM 频率 2MHz(周期 500ns),脉宽可调范围 0~50 个计数时钟, (3)每个正弦波周期(10us)对应 20 个 PWM 脉冲,各 PWM 脉宽用计数时钟表示分别为:25, 33, 40, 45, 49, 50, 49, 45, 40, 33, 25, 17, 10, 5 , 1 , 0 , 1 , 5 , 10, 17 (4)将步骤 3 中的正弦波重复 1000 次,对应 10ms 的连续正弦波形9 o- j" @' F; `) X0 Q( [8 h 9 r2 q0 g, g0 _$ e% k2 b8 P 5 [/ H( U! r7 R3 }: P" }. v 2.1. STM32CubeMX 生成测试工程7 x% U$ b" `" `3 u$ O 2.1.1. TIM1 CH1 PWM 配置2 P$ O7 w6 Z9 e' K U5 Y3 _ 图1. TIM1 CH1 PWM 7 L/ B7 V# e- l0 f# @9 T( p4 {2 D ( d P2 e: O/ J ![]() 2.1.2. GPDMA CH12 配置+ t! {1 B/ D. S; p 选用 GPDMA 通道 12,并配置为循环模式:* {0 a! {, a) y0 Y* f 图2. GPDMA CH12 # x* ]" b5 s# ^3 c3 ^. E # {, D% [( s& l$ W L1 |7 S ![]() 2.1.3. GPDMA Linked List 配置 创建 Linked List Queue,并配置为搭配 GPDMA 2D 功能通道使用。创建两个节点,TN1, TN2,并使用循环模式,指定首个循环节点为 TN1。( X: ]& b+ O( ~0 M2 _( e * \4 d7 o3 o" @' R1 Z; v' X / U* f0 D$ m- G5 `. v# B5 | ![]() 4 W6 _2 o+ p0 [2 z) A0 e- |# u TN1 节点配置,由此节点结合 TIM 来产生 PWM,并滤波成正弦信号: (1)TIM1 更新事件作为 DMA 请求 (2)使能 2D 功能,一个 block 传输完成后,回退到数组起点,重新传输, a0 Q5 D) k: S) b. Q/ t (3)使能 Repeat 功能,重复 block 传输 1000 次 7 ]( F) [6 N. U# m# Q! _) v. o5 T ![]() " o8 w P# Z' M$ s TN2 节点配置,与 TN1 节点类似,用于切换到第二组数据产生第二种波形) X5 J% O9 {4 y; _, k! H5 n( Q7 ~ 7 W( ?/ J- l1 B- m J/ ]; R 完整版请查看:附件 ![]() |
实战经验 | TrustZone应用中串口通信的DMA传输失败问题
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享