定时器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); //修改比较值,修改占空比
标签:输出,使能,定时器,TIM14,TIM,GPIO,PWM From: https://www.cnblogs.com/panshoudeng/p/17919765.html