PWM输出 STM32呼吸灯

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

PWM的工作过程
在这里插入图片描述
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
}
发布了4 篇原创文章 · 获赞 2 · 访问量 89

猜你喜欢

转载自blog.csdn.net/qq_44708426/article/details/103963044