PWM,英语好的人大概都知道这三个大写字母代表什么三个英文单词。我天赋不太高,所以就简单说一下中文意思:脉宽调制。玩过Freescale的人想必都不会陌生。 PWM大家很熟悉,电机驱动需要PWM,控制舵机转向需要PWM。总之,可以说,PWM,你真好。
好啦,回归正题,各位网友,我们又见面了,大家早晚午,好吧,好像我们从来没有见过面。 STM32的PWM可以说是数一数二的,STM32的PWM是由定时器产生的,但奇怪的是除了定时器TIM6和TIM7不能产生PWM外,其他定时器都可以产生PWM,而且有多个通道。 “高官”TIM1和TIM8表示:我最多可以生成7个通道,而其他定时器则默默感叹自己最多只能生成4个通道(四个通道)。
上一篇博客介绍了几位注册高手(http://www.sychzs.cn/alvis-jing/p/3691901.html)。请继续追随他们的脚步,因为他们还需要被利用,如果他们拒绝留下来,他们将受到最残酷的惩罚:金钱和美女服务,言归正传。接下来,为了催生PWM,我们还将邀请以下寄存器高手(由于高手比较低调,这里就不提了)。这是一个隆重的介绍。有兴趣的话请寻找「向日葵哥哥」)
注:对于寄存器,本博客不会深入解释。也可以参考STM32参考手册。因为本篇博客讲解的是思路和库函数,所以就不详细讲解寄存器了。请原谅我
1。捕捉/比较模式寄存器 1 (TIMx_CCMR1)
2。捕捉/比较使能寄存器(TIMx_CCER)
3。捕捉/比较寄存器 2 (TIMx_CCR2)
好啦,我们如何使用定时器来产生PWM呢? ?在此之前,我们先来了解一下PWM产生背后不为人知的秘密:
脉宽调制模式可以生成频率由 TIMx_ARR 寄存器确定、占空比由 TIMx_CCRx 寄存器确定的信号。
将‘110’(PWM 模式 1)或‘111’(PWM 模式 2)写入 TIMx_CCMRx 寄存器中的 OCxM 位,以独立设置每个 OCx 输出通道以生成 PWM。必须设置TIMx_CCMRx寄存器的OCxPE位才能使能相应的预载寄存器,(请注意这句话!!!)最后,必须设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式下) ) 以启用自动重新加载预载寄存器。
在 PWM 模式(模式 1 或模式 2)下,TIMx_CNT 和 TIMx_CCRx 总是进行比较(根据计数器的计数方向),以确定 TIMx_CCRx ≤ TIMx_CNT 还是 TIMx_CNT ≤ TIMx_CCRx。
所以,这个寄存器的值总是和CNT进行比较,并根据比较结果产生相应的动作。利用这一点,我们可以通过修改该寄存器的值来控制PWM的输出脉冲宽度。 (有专门的库函数可以操作,相当方便)
怎么办? ?这里,我们用到了一个很重要的概念,从来没有提到过:重映射,将TIM3_CH2的PA7重映射到PB5,而PB5是连接LED的,所以我们可以通过观察LED的亮度来体验PWM。 LED先生,总是被人注视,脸从来不红……
所谓重映射,就是将原来默认的pin引诱到另一个pin上。从专业上来说,是重新映射,但我觉得没那么简单。果然它还有另外一个功能:复用,,所以第一步:
我们需要打开复用时钟,并将IO口设置为复用推挽输出。当然,我们还需要打开TIM3的时钟。看代码:(有部分映射和全映射,还有可用的功能。这里我们是部分映射,但是如果映射了一个引脚,其他引脚也涉及到了,唉)
接下来:通用定时器的初始化:(由于在之前的博客中已经解释过,这里不再赘述,敬请见谅http://www.sychzs.cn/alvis-jing/p/3691901 .html)请看代码:
接下来就是重点的PWM了。这里,我们需要将TIM3_CH2设置为PWM模式。 (注意,由于TIM3可以生成四个PWM通道,因此每个通道都有不同但相似的功能来控制)这里,我们通过
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) 实现
打开“stm32f10x_tim.h”可以看到,这里我们只显示了一些对我们有用的参数:
TIM_OCMode 输出模式;—>PWM2
TIM_OutputState 输出使能;—>使能 PWM
TIM_OCPolarity 输出极性;—>极性为高 代码如下:
接下来,最关键也是最容易错过的步骤:启用预载寄存器。这里我们使用库函数
TIM_OC2PreloadConfig 启用或禁用 CCR2 上的 TIMx 预载寄存器 请参阅代码:
好的,最后一步就是启动定时器TIM3。这是大家都熟悉的,还是老规矩;如果你知道的话,就来赏十个美人吧。如果你还不知道,就拉出来逗逗他们十分钟
亲爱的,在这里,你觉得你能看到LED由暗变亮吗? ?你想看,但是LED先生还是拒绝,是的,但是为什么呢? ?
原因是这里设置生成的PWN的脉冲宽度是固定的,那么我们该如何改变呢? ?嘿嘿,库函数给我们提供了这么好的机会:
TIM_SetCompare2 设置 TIMx 捕获比较 2 寄存器值
通过该功能我们可以设置脉冲宽度来控制PWM。代码如下:
好吧,我们总结一下步骤:
1。打开TIM3定时器的时钟。如果有复用,还要打开复用时钟。
2。初始化 TIM3
3。设置TIM3_CH2的PWM模式并使其输出使能(注意:预载寄存器必须使能)
4。启动 TIM3
5。改变脉冲宽度,从而改变PWM
有一些话我觉得很幽默,很幽默。为了让自己看起来不再那么粗心,这篇博客就到此结束了。我也处于学习阶段。尽量把自己当成读者,这样读者才能理解。有错误之处请指出。非常感谢。我希望它能帮助你理解。
-->