参考文章:工程师笔记|使用 TIMER 输出比较模式输出相移信号
在全桥变换器中,需要同极性,不同相位的PWM波来驱动MOS管实现升压操作。
本文章参考如上文章,使用TIM1高级定时器输出了1路原始PWM波,定时器的输出比较功能输出了三路基于原始PWM波移相后的PWM波,并使用了DMA。
首先参照别人的文章看看输出比较模式和PWM模式的区别:
stm32输出比较模式与PWM模式
主要区别就是:
PWM1模式:CNT与CCR作比较,若CNT小于CCR则输出为高电平,若CNT大于CCR则输出为低电平,并且在CNT计数至ARR时,CNT会更新至0并产生上溢事件。
输出比较模式:在CNT与CCR不断做比较的过程中,若CNT等于CCR,产生的则是电平翻转,并且会产生中断,通过对中断回调函数的编写,就能够实现多路不同频率信号的输出。
DMA 的循环模式,可以在最后一次数据传输完成后,自动重新加载初始编程值,内部地址寄存器会重新加载基址值,进入下一个循环。
所以输出比较结合DMA相当于就是中断函数,但是DMA处理的速度会更快。
目标:频率10khz 占空比40%
TIM1_CH1:基准PWM波 相位为0
TIM1_CH2: 相移45°
TIM1_CH3: 相移90°
TIM1_CH4: 相移180°
配置:
Toggle on match"(匹配时翻转电平)
CCR不用设置,通过DMA写入的值
基准PWM极性为高(高电平有效),输出比较通道的极性为低(低电平有效)(为什么?)
看看这篇文章先了解一下极性和有效吧!
对DMA的配置:
记住!每一个通道的DMA都要点一下进行配置!
设置为循环/内存到外设
Q:为什么这里用的是Word一个字?
因为在后续的定义中传输的数据是uint32_t类型的 ,stm32的一个字就是32位的。
计算第一,二次反转的CCR值
我就直接引用别的文章的话了:
首先需要计算 channel2、channel3 和 channel4 的 CCR 值。以 channel2 为例:配置的计数周期为 100,初始极性为 low,当 CNT 计数值与 CCR 寄存器匹配的时候,输出电平发生翻转,所以为了实现与 channel1 占空比相同的波形,需要翻转两次电平。
第一次翻转的 CCR 可以通过相位差进行计算,第二次翻转的 CCR 值可以通过占空比和第一次翻转的 CCR 值这两个条件进行计算。Channel2 第一次翻转的 CCR 值为: “1000 x (45°/360°) = 125”;第二次翻转的 CCR 值为:“125 + (40% x 100) = 525”
同理:
Channel3(90): 1.250 2.650
Channel4(180): 1.500 2.900
添加代码如下:
测试结果: