
有人想实现如下 PWM 输出波形,周期 T=12us,两路输出波形特征一样,只是第 2 路【下图中的 CHn】波形的输出比第 1 路【下图中的 CHm】滞后 T/2。另外,还要保证二者占空比在 0~50%范围内可以同步调节。![]() 对于这种输出波形,如果使用 2 个定时器来做会相对方便点,通过定时器的主从模式来实现。现在客户希望使用 1 个定时器来完成,那如何实现呢? 当然,用 1 个带多比较通道的定时器也是可以实现的。我们可以使用 PWM 输出模式来实现第 1 路,使用 OC toggle 模式来实现第 2 路。下面以 STM32F334 Nucleo 开发板来着手配置、编程、验证。 这里不妨选用 TIM3 来实现该输出波形。TIM3 的时钟源目前配置为 64Mhz,不做预分频,使用向上计数模式。一个计数周期对应的 ARR 是 (12*64)-1,即 767。TIM3 的通道 1 输出对应于下图中第 1 路,TIM3 的通道 3 输出对应于第 2 路.【图中的黄色斜箭头表示计数器计数变化趋势,从 0 到 ARR,并周期性循环计数。】 ![]() 因为 TIM3 通道 1 采用 PWM 模式来输出,设置好 CCR1、ARR 的值即可。通道 3 采用 OC 切换输出模式来实现。对于通道 3,在一个周期内有两个翻转点,即上图中第 2 路上升沿的 R点和下降沿的 F 点。结合本实例需求,不难得知,R 点所对应的比较值【CCR3】为768/2,即 384 并保持不变。F 点的比较值的大小决定其占空比。由于这里实际需求的占空比不超过 50%,正常来讲,则 F 点可以设置的比较值最大不会超过 ARR 的值。 我们可以借助 TIM3 CH3 的比较事件触发 DMA,通过 DMA 来传输存储在内存中 R 点/F 点所对应的比较值以更新 CCR3 寄存器内容。在 R 点发生比较事件时,更新 F 点的比较值,在 F点发生比较事件时更新 R 点的比较值。刚才前面说过了,这里上升沿 R 点的比较值始终保持不变,即 384,我们是通过改变 F 点的比较值来改变 TIM3 通道 3 的占空比。 另外,我们在 TIM3 通道 1 的比较中断里修改 CCR1 的值和通道 3 在 F 点所对应的 CCR3 比较值,最终实现 2 路占空比 0~50%灵活可调的输出。 大致原理就介绍到这里。下面描述从基于 STM32CubeMx 进行初始配置开始到实现输出的全过程。下面有关 RCC/SYS 等的初始配置从略,不附加截图了。 1、关于定时器 TIM3 的基本时基参数配置如下: ![]() 完整版请查看:附件 |
Form_waveform_based_on_stm32timer.pdf
下载371.78 KB, 下载次数: 0
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32定时器同步启动示例及应用提醒
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | 更改STM32定时器周期后的输出疑问分析
基于定时器捕获测量脉宽的应用示例
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法