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

STM32通用定时器PWM输出

程序员文章站 2022-06-08 18:43:13
...

PWM输出工作过程STM32通用定时器PWM输出

比如,采取自动重装载向上计数,从0一直加到ARR预设值,然后再与CCRx进行比较,当计数大于CCRx的值,可通过代码配置,输出高电平或者低电平,这样就能输出一个PWM波,CCRx的x表示定时器通道。CCRx决定占空比,ARR决定周期。STM32通用定时器PWM输出
通道1为例
CCR1:捕获比较寄存器(x=1,2,3,4),设置比较值
CCMR1:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1或者PWM模式2
CCER:CC1P位:输入/捕获1输出极性。0:高电平有效;1:低电平有效。
CCER:CC1P位:输入/捕获1输出使能。0:关闭;1:打开。STM32通用定时器PWM输出
也就是说,PWM1:不管向上/向下计数,当计数数值小于CCRx的设定值,通道为有效电平;PWM2:不管向上/向下计数,当计数数值大于CCRx的设定值,通道为有效电平

配置步骤

1.使能定时器3和相关IO口时钟。

使能定时器3时钟: RCC APB1PeriphClockCmd();

使能GPIOB时钟: RCC APB2PeriphClockCmd();

2.初始化IO口为复用功能输出。

GPIO_ InitStructure.GPlO Mode=GPIO Mode AF PP;

3.这里我们是要把PB0和PB1用作定时器的PWM输出引脚,所以需要开启AFIO时钟。

RCC_ APB2PeriphClockCmd(RCC APB2Periph AFIO,ENABLE);

4.初始化定时器: ARR,PSC等: TIM TimeBaselnit0;

5.初始化输出比较参数: TIM_ OCxInit();

6.使能预装载寄存器: TIM OCxPreloadConfig(TIM3, TIM OCPreload Enable);

7.使能定时器。TIM Cmd();

8.不断改变比较值CCRx,达到不同的占空比效果:TIM SetCompare20;

代码配置

以TIM3的CH3和CH4通道为例(需要沿用定时器的配置)

void TIM3_PWM_Init(u16 arr,u16 psc)
{
 TIM_OCInitTypeDef TIM_OCInitStrue;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
 GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin   =  GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟
  TIM_TimeBaseInitStrue.TIM_Period=arr;//自动装载值
 TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
 TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);//初始化定时器3

 TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1  计数CNT小于CCR3为有效点平
 TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高   当计数小于比较器CCR3为高电平
 TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
 TIM_OC3Init(TIM3,&TIM_OCInitStrue);//通道3初始化
 
 TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1  计数CNT小于CCR4为有效点平
 TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性:TIM输出比较极性高   当计数XIAO于比较器CCR4为高电平
 TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
 TIM_OC4Init(TIM3,&TIM_OCInitStrue);//通道4初始化
TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}

nt main(void)
 {  
  u16 led12=0,flag=1;
 GPIO_LEDandKEY_Configuration();
 usart_Init();
 GPIO_KEY_Configuration()  ;
 TIM3_PWM_Init(199,7199);  //PWM频率=72000000/7200=10Khz,周期0.1ms,时长20ms
 Delay_1ms(100);
 while(1)
 {
 if(flag)
 	led12++;
  else 
  	led12--;
  if(led12>200)
   	flag=0;
  if(led0pwmval==0)
  	flag=1;           
  TIM_SetCompare3(TIM3,led0pwmval); //通过此函数可配置CCR3的值,这样不停的改变占空比,此效果为呼吸灯
  TIM_SetCompare4(TIM3,led0pwmval);//通过此函数可配置CCR4的值
 }