STMCU小助手
发布时间:2023-10-27 16:14
|
01问题背景 客户需要使用 MCU 输出正弦波,但受限于 MCU DAC 数量不足,建议尝试使用 PWM加滤波方式产生正弦波。同时要求正弦波与固定电平交替输出。因此可用一个 TIM 输出PWM,同时用另一个 TIM 来定时切换输出正弦波或固定电平。 + d: D- J7 q ^* r7 T' v 使用 TIM 输出 PWM 产生正弦波形时,需要结合 GPDMA 来实现。在 STM32U5 系列中,GPDMA 共有 16 个独立通道,其中 12-15 通道还具有 2D addressing/ repeat 功能。因此也可以使用一个 TIM 加 GPDMA 的一个 2D 通道实现 PWM 波形切换功能。 " @, _+ G E) E! k1 M7 ` 02产生PWM 本文按以下配置产生 PWM,在 U575 NUCLEO 板测试: (1)MCU 主频:100MHz (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 的连续正弦波形 2.1. STM32CubeMX 生成测试工程 7 T4 Q1 p4 n' R* W$ b 2.1.1. TIM1 CH1 PWM 配置 9 p( H; g9 H. L6 b' V
图1. TIM1 CH1 PWM + ~; Q: h s. l2 \( h" G 2.1.2. GPDMA CH12 配置 选用 GPDMA 通道 12,并配置为循环模式: 0 e ? x8 }3 \, P# P; V
图2. GPDMA CH12 2.1.3. GPDMA Linked List 配置 创建 Linked List Queue,并配置为搭配 GPDMA 2D 功能通道使用。创建两个节点,TN1, TN2,并使用循环模式,指定首个循环节点为 TN1。
图3. Linked List / r+ H- I# Z9 A' t2 y6 y! d TN1 节点配置,由此节点结合 TIM 来产生 PWM,并滤波成正弦信号: (1)TIM1 更新事件作为 DMA 请求 (2)使能 2D 功能,一个 block 传输完成后,回退到数组起点,重新传输 (3)使能 Repeat 功能,重复 block 传输 1000 次 首先使能了 TrustZone 架构,然后将 LPGPIO 映射到了非安全区,并且配置了 DMA 链表功能,使用 LPTimer 作为触发,自动地修改 LPGPIO 的寄存器,从而达到在低功耗模式下,GPIO自动切换的功能。但遇到了 LPDMA 的配置问题,并且程序无法跳转到 Non-Secure 工程。 $ N! p% }$ s- J/ ^+ C& Z
图4. Linked List Node1 TN2 节点配置,与 TN1 节点类似,用于切换到第二组数据产生第二种波形 , |$ o9 l* g7 k
图5. Linked List Node2 2.2. 测试代码 4 q& u1 u1 J# q1 y0 [
& c* E" `5 \# u U/ N1 a GPDMA Linked List 模式执行流程
图6. Linked List 执行过程及期望输 03PWM滤波输出 0 O i2 ?* I7 ^; m: C 在 U575 NUCLEO 板上测试,结果如下:
图7. 实际输出 8 D) s( K# b) g( I3 A* i 从实测结果来看,滤波后的正弦波频率,波形持续时长都符合预期。另外,与通过额外 TIM 计时来切换 PWM 输出的方式相比,使用 Linked List repeat 这种方式,正弦波与固定电平输出之间切换更平滑。 $ o9 |0 Y% K; f2 U" H
图8. 额外 TIM 计时来切换 PWM 输出 04小结 通过使用 GPDMA Linked List 模式,使用 2D addressing repeat 功能,能方便实现这种多种波形切换的应用场景。如 Node1 与 Node2 使用不同的数据长度和重复次数,则可得到不同时长的两种波形;通过增加更多 Node,则可得到多种不同波形。 ) R8 |( I `: T. a T, x ]转载自: STM32单片机% n8 j: N5 D- k% |. Z6 y 如有侵权请联系删除 6 ^- M* \! q* i3 G# m8 |; S" ? k # W& f! D$ X; {- Z8 N1 q" x |
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
微信公众号
手机版
学习学习
学习啦~~