欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PWM输出 STM32呼吸灯

程序员文章站 2022-06-08 19:06:28
...

脉冲宽度调制模式可以产生一个由TIMx_ARR(自动装载寄存器)寄存器确定频率、由TIMx_CCRx(捕获/比较寄存器)寄存器确定占空比的信号。
PWM输出 STM32呼吸灯
在TIMx_CCMRx(捕获/比较模式寄存器)寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。
PWM输出 STM32呼吸灯
必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器.
PWM输出 STM32呼吸灯
最后还要设置TIMx_CR1(控制寄存器)寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
PWM输出 STM32呼吸灯
OCx的极性可以通过软件在TIMx_CCER(捕获比较使能寄存器)寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。TIMx_CCER寄存器中的CCxE位控制OCx输出使能。详见TIMx_CCERx寄存器的描述。
PWM输出 STM32呼吸灯
PWM输出 STM32呼吸灯
在PWM模式(模式1或模式2)下,TIMx_CNT和TIMx_CCRx始终在进行比较,(依据计数器的计数方向)以确定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。

PWM的工作过程
PWM输出 STM32呼吸灯
PWM输出配置步骤

 1.使能定时器3和相关IO口时钟。
    	使能定时器3时钟:RCC_APB1PeriphClockCmd();
        使能GPIOB时钟:RCC_APB2PeriphClockCmd();
2.初始化IO口为复用功能输出。函数:GPIO_Init();
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
       所以需要开启AFIO时钟。同时设置重映射。
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 
3.初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
4.初始化输出比较参数:TIM_OC2Init();
4.使能预装载寄存器: TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); 
5.使能定时器。TIM_Cmd();
6.不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

呼吸灯

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定时器3时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}