STM32通用定时器PWM输出
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;
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的值
}