当前位置:职场发展 > STM32的PWM

STM32的PWM

  • 发布:2023-09-30 06:56

-->

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的时钟。看代码:(有部分映射和全映射,还有可用的功能。这里我们是部分映射,但是如果映射了一个引脚,其他引脚也涉及到了,唉)

注意红色代码
1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,启用); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

接下来:通用定时器的初始化:(由于在之前的博客中已经解释过,这里不再赘述,敬请见谅http://www.sychzs.cn/alvis-jing/p/3691901 .html)请看代码:

TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);

接下来就是重点的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 输出极性;—>极性为高 代码如下:

1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);

接下来,最关键也是最容易错过的步骤:启用预载寄存器。这里我们使用库函数

TIM_OC2PreloadConfig 启用或禁用 CCR2 上的 TIMx 预载寄存器 请参阅代码:

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

好的,最后一步就是启动定时器TIM3。这是大家都熟悉的,还是老规矩;如果你知道的话,就来赏十个美人吧。如果你还不知道,就拉出来逗逗他们十分钟

/* 启用 TIM3 计数器 */
TIM_Cmd(TIM3, 启用);

亲爱的,在这里,你觉得你能看到LED由暗变亮吗? ?你想看,但是LED先生还是拒绝,是的,但是为什么呢? ?

原因是这里设置生成的PWN的脉冲宽度是固定的,那么我们该如何改变呢? ?嘿嘿,库函数给我们提供了这么好的机会:

TIM_SetCompare2 设置 TIMx 捕获比较 2 寄存器值

通过该功能我们可以设置脉冲宽度来控制PWM。代码如下:

TIM_SetCompare2(TIM3, 临时);

好吧,我们总结一下步骤:

1。打开TIM3定时器的时钟。如果有复用,还要打开复用时钟。

2。初始化 TIM3

3。设置TIM3_CH2的PWM模式并使其输出使能(注意:预载寄存器必须使能)

4。启动 TIM3

5。改变脉冲宽度,从而改变PWM

有一些话我觉得很幽默,很幽默。为了让自己看起来不再那么粗心,这篇博客就到此结束了。我也处于学习阶段。尽量把自己当成读者,这样读者才能理解。有错误之处请指出。非常感谢。我希望它能帮助你理解。

-->

相关文章