您的位置 首页 报告

STM32通用定时器(TIM2-5)PWM输出

脉冲宽度调制(PWM),是英文PulseWidthModulation的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是使用微处理器的数字输出来对模仿电路进行操控的一种十分有用的技能。简略一点,便是对脉冲宽度的操控。一般用来操控步进电机的速度等等。STM32的定时器除了TIM6和TIM7之外,其他的定时器都能够用来发生PWM输出,其间高档定时器TIM1和TIM8能够一起发生7路的PWM输出,而通用定时器也能一起发生4路的PWM输出。

PWM输出形式

STM32的PWM输出有两种形式,形式1和形式2,由TIMx_CCMRx寄存器中的OCxM位确认的(“110”为形式1,“111”为形式2)。形式1和形式2的差异如下:

110:PWM形式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有用电平(OC1REF=1)。

111:PWM形式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有用电平,否则为无效电平。

由此看来,形式1和形式2正好互补,互为相反,所以在运用起来不同也并不太大。

而从计数模式上来看,PWM也和TIMx在作定时器时相同,也有向上计数形式、向下计数形式和中心对齐形式,关于3种形式的具体材料,能够检查《STM32参阅手册》的“14.3.9 PWM形式”一节,在此就不具体赘述了。

PWM输出管脚

PWM的输出管脚是确认好的,具体的引脚功用能够检查《STM32参阅手册》的“8.3.7定时器复用功用重映射”一节。在此需求着重的是,不同的TIMx有分配不同的引脚,可是考虑到管脚复用功用,STM32提出了一个重映像的概念,便是说经过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。可是这些重映像的管脚也是由参阅手册给出的。比如说TIM3的第2个通道,在没有重映像的时分,指定的管脚是PA.7,假如设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,假如设置了彻底重映像的话,TIM3_CH2的输出就被映射到PC.7上了。

PWM输出信号

PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决议的,具体设置办法在前面一个学习笔记中有具体的告知。而输出信号的占空比则是由TIMx_CRRx寄存器确认的。其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因而,能够经过向CRR中填入恰当的数来输出自己所需的频率和占空比的方波信号。

按以下过程装备:

1.设置RCC时钟;

2.设置GPIO时钟;

3.设置TIMx定时器的相关寄存器;

4.设置TIMx定时器的PWM相关寄存器;

第1步设置RCC时钟现已在前文中给出了具体的代码,在此就不再多说了。需求留意的是通用定时器TIMx是由APB1供给时钟,而GPIO则是由APB2供给时钟。留意,假如需求对PWM的输出进行重映像的话,还需求敞开引脚复用时钟AFIO。

第2步设置GPIO时钟时,GPIO形式应该设置为复用推挽输出GPIO_Mode_AF_PP,假如需求引脚重映像的话,则需求用GPIO_PinRemapConfig()函数进行设置。

第3步设置TIMx定时器的相关寄存器时,和前一篇学习笔记相同,设置好相关的TIMx的时钟和技能形式等等。

第4步设置PWM相关寄存器,首先要设置PWM形式(默许情况下PWM是冻住的),然后设置占空比(依据前面所述公式进行核算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状况和使能TIMx的PWM输出使能。相关设置完结之后,就能够经过TIM_Cmd()来翻开TIMx定时器,然后得到PWM输出了。

以下是我写的参阅程序:

void GPIO_PA_Init()
{//PA13管脚装备
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOA);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP ;//复用推挽输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能端口时钟A
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIMER3_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_InternalClockConfig(TIM3);
TIM_TimeBaseStructure.TIM_Period=10000-1;//ARR的值周期10K
TIM_TimeBaseStructure.TIM_Prescaler=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数形式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
}

void TIMER3_PWM_Init()
{
TIM_OCInitTypeDef TIMOCInitStructure;
TIMOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM形式1输出
TIMOCInitStructure.TIM_Pulse =0;//占空比=(CCRx/ARR)*100%
TIMOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM输出比较极性高
TIMOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出状况
TIM_OC2Init(TIM3, &TIMOCInitStructure);//TIM3的CH2输出
TIM_CtrlPWMOutputs(TIM3,ENABLE);//设置TIM3的PWM输出为使能

TIM_Cmd(TIM3, ENABLE); //敞开时钟
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/256929.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部