STM32 PWM笔记
关于PWM的STM32
stm32的定时器除了TIM6和TIM7。其他的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出。而通用定时器也能同时产生多达4路PWM输出,stm32最多可以同时产生30路PWM输出。通用定时器TIMx产生PWM输出,用到寄存器:捕获/比较模式寄存器TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4),还有个TIMx的ARR寄存器是用来控制PWM输出频率的。
PWM基本原理:
控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
PWM工作过程:
定时器从0开始向上计数
0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
当TIMx_CNT值达到ARR时,定时器溢出,至此一个PWM周期完成。
PWM一般配置步骤:
- 使能相关时钟(定时器和GPIO)
- 初始化GPIO
- 初始化定时器
- 初始化输出比较参数
- 使能自动重装载的预装载寄存器
- 使能定时器
- 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();
//TIM3 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时钟 //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 //设置该引脚为复用输出功能,输出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 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Period = arr; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim //TIM向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM3 //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 //输出极性:TIM输出比较极性高 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据指定的参数初始化外设TIM3 OC2 //使能TIM3在CCR2上的预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); //使能TIM3 }