1.TIMER输出PWM根本概念
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是运用微处理器的数字输出来对模仿电路进行操控的一种十分有用的技能。简略一点,便是对脉冲宽度的操控。一般用来操控步进电机的速度等等。
STM32的守时器除了TIM6和TIM7之外,其他的守时器都能够用来发生PWM输出,其间府第守时器TIM1和TIM8能够一起发生7路的PWM输出,而通用守时器也能一起发生4路的PWM输出。
1.1PWM输出形式
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形式”一节,在此就不详细赘述了。
1.2PWM输出管脚
PWM的输出管脚是确认好的,详细的引脚功用能够检查《STM32参考手册》的“8.3.7守时器复用功用重映射”一节。在此需求着重的是,不同的TIMx有分配不同的引脚,可是考虑到管脚复用功用,STM32提出了一个重映像的概念,便是说经过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。可是这些重映像的管脚也是由参考手册给出的。比如说TIM3的第2个通道,在没有重映像的时分,指定的管脚是PA.7,假如设置部分重映像之后,TIM3_CH2的输出就被映射到PB.5上了,假如设置了彻底重映像的话,TIM3_CH2的输出就被映射到PC.7上了。
1.3PWM输出信号
PWM输出的是一个方波信号,信号的频率是由TIMx的时钟频率和TIMx_ARR预分频器所决议的,详细设置办法在前面一个学习笔记中有详细的告知。而输出信号的占空比则是由TIMx_CRRx寄存器确认的。其公式为“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因而,能够经过向CRR中填入恰当的数来输出自己所需的频率和占空比的方波信号。
2.TIMER输出PWM完结过程
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的时钟和技能形式等等。详细设置参看“TIMER根本守时功用”的学习笔记。
第4步设置PWM相关寄存器,首先要设置PWM形式(默许情况下PWM是冻住的),然后设置占空比(依据前面所述公式进行核算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状况和使能TIMx的PWM输出使能。
相关设置完结之后,就能够经过TIM_Cmd()来翻开TIMx守时器,然后得到PWM输出了。
3.TIMER输出PWM源代码
我们我现在手上的斗争开发板是将PB.5接到LED上,因而需求运用TIM3的CH2通道,而且要进行引脚重映像。翻开TIM3之后,PWM输出,使得LED点亮,经过改动PWM_cfg()中的占空比能够调理LED的亮度。
#include “stm32f10x_lib.h”
void RCC_cfg();
void GPIO_cfg();
void TIMER_cfg();
void PWM_cfg();
//占空比,取值规模为0-100
int dutyfactor = 50;
int main()
{
int Temp;
RCC_cfg();
GPIO_cfg();
TIMER_cfg();
PWM_cfg();
//使能TIM3计时器,开端输出PWM
TIM_Cmd(TIM3, ENABLE);
while(1);
}
void RCC_cfg()
{
//界说过错状况变量
ErrorStatus HSEStartUpStatus;
//将RCC寄存器从头设置为默许值
RCC_DeInit();
//翻开外部高速时钟晶振
RCC_HSEConfig(RCC_HSE_ON);
//等候外部高速时钟晶振作业
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//设置AHB时钟(HCLK)为体系时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置高速AHB时钟(APB2)为HCLK时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置低速AHB时钟(APB1)为HCLK的2分频
RCC_PCLK1Config(RCC_HCLK_Div2);
//设置FLASH代码延时
FLASH_SetLatency(FLASH_Latency_2);
//使能预取指缓存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(ENABLE);
//等候PLL准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置PLL为体系时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判别PLL是否是体系时钟
while(RCC_GetSYSCLKSource() != 0x08);
}
//舱位TIM3的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//舱位GPIOB的时钟和复用功用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
//部分映射,将TIM3_CH2映射到PB5
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//挑选引脚5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//输出频率最大50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//从头将Timer设置为缺省值
TIM_DeInit(TIM3);
//选用内部时钟给TIM3供给时钟源
TIM_InternalClockConfig(TIM3);
//预分频系数为0,即不进行预分频,此刻TIMER的频率为72MHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
//设置时钟切割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器形式为向上计数形式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置计数溢出巨细,每计7200个数就发生一个更新事情,即PWM的输出频率为10kHz
TIM_TimeBaseStructure.TIM_Period = 7200 – 1;
//将装备应用到TIM3中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
}
void PWM_cfg()
{
TIM_OCInitTypeDef TimOCInitStructure;
//设置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM形式1输出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;
//TIM输出比较极性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能输出状况
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM3的CH2输出
TIM_OC2Init(TIM3, &TimOCInitStructure);
//设置TIM3的PWM输出为使能
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/265822.html