STM32脉冲宽度调制(PWM)原理与应用详解

STM32使用PWM(脉冲宽度调制)

  • 一、PWM概述
  • 二、STM32的PWM分析
  • 三、PWM产生的流程
  • 示例代码
  • 一、PWM概述

    脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出(1或0)来对模拟电路进行控制的一种非常有效的技术。

    PWM应用场景如下:

    使用PWM信号控制温度。
    使用PWM信号控制比例阀的开度。
    使用PWM信号控制电机的转速(直流电机 步进电机 伺服电机)
    使用PWM信号控制舵机的转向。
    

    占空比:占空比是指在一个脉冲循环内,通电时间(可能是高电平,可能是低电平)相对于总时间所占的比例。

    二、STM32的PWM分析

    PWM产生框架图如下:

    定时器部分是提供PWM周期,如在定时器1MHZ,计1000个数,那么PWM周期:1ms(周期不能过长)

    输出极性:程序设置默认输出的电平。当通道有效,则输出默认的设置电平;通道无效,输出与设置的极性相反的电平(设置999为速度最快为高极性,反之为低极性)

    PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

    在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为无效状态( OC1REF=“0”),否则为有效状态( OC1REF=“1”)。

    PWM 模式 2–– 在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无效状态,否则为有效状态。

    在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

    三、PWM产生的流程

    (1)使能定时器4和相关IO口时钟。
    	PB6----TIM4_CH1
    (2)使能定时器4和相关IO口时钟。
    	使能定时器4时钟:RCC_APB2PeriphClockCmd();
    	使能GPIOB时钟:RCC_AHB2PeriphClockCmd ();
    (3)初始化IO口为复用功能输出。
    	函数:GPIO_Init();
    	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;       //复用功能 
    (4)初始化定时器:ARR,PSC等:
    	TIM_TimeBaseInit();
    (5)初始化输出比较参数:
    	TIM_OC1Init();
    (6)使能预装载寄存器: 
    	TIM_OC1PreloadConfig(TIM4, 	TIM_OCPreload_Enable); 
    (7)使能自动重装载的预装载寄存器允许位	
    	TIM_Cmd(TIM4, ENABLE);
    (8)不断改变比较值CCRx,达到不同的占空比效果:
    	TIM_SetCompare1();
    

    示例代码

    将这段代码放到你的工程文件中,将GPIO引脚号改为你的LED灯的引脚号,你将看到led灯以呼吸灯的形式闪烁。

    void Pwm_init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStruct;
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    	 TIM_OCInitTypeDef TIM_OCInitStruct;
    	//使能定时器4和相关IO口时钟。
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
    	//初始化IO口为复用功能输出。
    	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用模式
    	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//引脚1
    	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速率
    	GPIO_Init(GPIOB, &GPIO_InitStruct);
    	//初始化定时器:ARR,PSC等:
    	TIM_TimeBaseInitStruct.TIM_Period=2000-1;//周期数 计2000个数  在1000000HZ下 20ms 
    	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;//预分频 72HZ/720= 100000HZ
    	TIM_TimeBaseInitStruct.TIM_ClockDivision=0;//分频因子 一个脉冲记一个数
    	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
    	//初始化输出比较参数:
    	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式1
    	TIM_OCInitStruct.TIM_Pulse = 0;//脉冲值
    	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//高极性
    	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//使能
    	TIM_OC4Init(TIM3,&TIM_OCInitStruct);
    	//使能预装载寄存器: 
    	TIM_OC4PreloadConfig(TIM3, 	TIM_OCPreload_Enable); 
    	//使能自动重装载的预装载寄存器允许位	
    	TIM_Cmd(TIM3, ENABLE);
    }
    
    #include "stm32f10x.h"
    #include "delay.h" 
    
    //主函数
    int main(void)
    {
    	int i;
    	//中断优先级分组
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	LED_Init();//初始化LED
    	Pwm_Init();//设置定时器3输出PWM
    	
    	while(1)//呼吸灯
    	{
    		//从暗到亮
    		for(i=1; i<499; i++)//定时器4重装载值为499
    		{
    			
    			TIM_SetCompare1(TIM3,i);//根据i的值设置比较值,调整占空比
    			delay_ms(20);//根据实际情况进行调整,方便观察效果
    		}
    		
    		//从亮到暗
    		for(i=499; i>0; i--)
    		{
    			
    			TIM_SetCompare1(TIM3,i);
    			delay_ms(20);
    		}
    	}
    	return 0;
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32脉冲宽度调制(PWM)原理与应用详解

    发表评论