定时器PWM输出实验

发布时间 2023-12-21 17:56:40作者: 潘守登

定时器PWM输出实验

由于是用TIM定时器输出,必涉及到IO口的复用。

原理:以上计数方式为例:计数器从零计数到arr(重装载值),此过程中,我们定义一个crr_x,则被分为两种情况:计时器值大于crr_x,计数器值小于crr_x。我们使第二种情况输出低电平,第一种情况输出高电平,就可以得到输出电平。我们调整arr和crr_x的值,就可以调整输出电平的周期和占空比。定时器PWM输出有两种模式:向上计数时:第一个模式为计数器值小于crr_x输出有效电平,第二种模式为计时器值大于crr_x时输出有效电平。我们可以规定高电平或低电平为有效电平来控制输出电平。

高级定时器有七个通道,通用定时器有四个通道,每个通道都能独立输出一路PWM信号。

本实验是用TIM14的通道一来实现DS1的逐渐变亮和暗(不断调整输出的PWM信号的占空比达到)

实验流程:

1,使能时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

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

3.GPIO口复用映射到TIM14

  GPIO_PinAFConfig();

4,初始化定时器

TIM_TimeBaseInit();

对于通用寄存器初始化:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1(PWM模式一上文已介绍,上计数是小于比较值的为有效电平)
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低(低电平为有效电平)

5初始化输出比较参数

TIM_OC1Init();(因为用的是通道一,如果其他通道为TIM_OCx_Init();)

6 使能输出预装载和自动重装载的预装载寄存器允许位

TIM_OCxPreloadConfig();//

 TIM_ARRPreloadConfig();//

7,使能定时器

TIM_Cmd()

8,不断改变比较值,来达到不同占空比的效果

TIM_SetCompare1();

 

 

完整代码:

void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置

GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14

//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器

TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能

TIM_Cmd(TIM14, ENABLE); //使能TIM14
}

 

 

主函数中:我们想不断改变占空比:

if(dir)led0pwmval++;//dir==1 led0pwmval递增
else led0pwmval--; //dir==0 led0pwmval递减
if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
if(led0pwmval==0)dir=1; //led0pwmval递减到0后,方向改为递增
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比