PWM输出工作过程
比如,采取自动重装载向上计数,从0一直加到ARR预设值,然后再与CCRx进行比较,当计数大于CCRx的值,可通过代码配置,输出高电平或者低电平,这样就能输出一个PWM波,CCRx的x表示定时器通道。CCRx决定占空比,ARR决定周期。
通道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:打开。
也就是说,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;