使用STM32定时器实现PWM输出

STM32定时器实现PWM原理:
在这里插入图片描述
上图就是STM32一个简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT<CCRx时,输出0,当CNT>=CCRx时输出1。那么就可以得到如上的PWM示意图:当CNT值小于CCRx的时候,IO输出低电平(0),当CNT值大于等于CCRx的时候,IO输出高电平(1),当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的频率,这就是PWM输出的原理。
STM32F4的定时器除了TIM6和7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出!这里我们仅使用TIM14的CH1产生一路PWM输出。
代码:
<初始化函数>

//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GF9复用为TIM14

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//TIM14时钟使能
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14

//初始化TIM14 Channel1 PWM模式
TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性
TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //初始化外设TIM14 OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14, ENABLE);  //使能TIM14
} 

<主函数>

int main(void)
{
TIM14_PWM_Init(500-1,84-1);//定时器时钟为84M,分频系数为84,所以计数频率
//为84M/84=1Mhz,重装载值500,所以PWM频率为1M/500=2Khz.    
TIM_SetCompare1(TIM14,100);//修改比较值,修改占空比

while(1);
}

效果:
PA7引脚输出波形:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/liwuxin1/article/details/89065696