STM32学习——高级定时器

高级定时器简介

在这里插入图片描述
1.输入捕获模式,可用来测频率或脉宽(原理:捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器CCR中,把前后两次捕获到的CCR寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,需要进行额外的处理)
2.输出比较应用,主要应用为PWM输出

配置PWM输出,代码实现

(1)高级定时器TIM1的工作方式配置以及初始化
1.时基结构体TIM_TimeBaseInitTypeDef,配置预分频PSC,计数方式,定时器周期ARR,时钟分频(与死区时间相关),重复计数器(用不上)
2.输出比较结构体TIM_OCInitTypeDef,配置比较输出模式(PWM1),比较输出使能,比较互补输出使能,脉冲宽度,输出极性(决定PWM先高还是低),互补输出极性……
3.断路和死区结构体TIM_BDTRInitTypeDef,配置断路和死区的相关参数。

static void Advance_Tim_Mode_Config(void)
{
	//开启定时器时钟,即内部时钟CK_INT=72M
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	/*===============时基结构体初始化================*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	//自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
	TIM_TimeBaseInitStructure.TIM_Period=8-1;
	//驱动CNT计数器的时钟 = Fck_int/(psc+1)
	TIM_TimeBaseInitStructure.TIM_Prescaler=9-1;
	//时钟分频因子 ,配置死区时间时需要用到
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	//计数器计数模式,设置为向上计数
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	//重复计数器的值,没用到不用管
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
	//初始化定时器
	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
	
	/*==============输出比较结构体初始化============*/
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//配置为PWM模式1
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	//输出使能
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	//互补输出使能
	TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
	//设置占空比大小
	TIM_OCInitStructure.TIM_Pulse=4;
	//输出通道电平极性配置
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	//互补输出通道电平极性配置
	TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
	// 输出通道空闲电平极性配置
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
	// 互补输出通道空闲电平极性配置
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
	TIM_OC1Init(TIM1,&TIM_OCInitStructure);
	
	/*================刹车和死区结构体初始化=================*/
	TIM_BDTRInitTypeDef TIM_BDTRInitSturcture;
	TIM_BDTRInitSturcture.TIM_OSSRState=TIM_OSSRState_Enable;
	TIM_BDTRInitSturcture.TIM_OSSIState=TIM_OSSIState_Enable;
	TIM_BDTRInitSturcture.TIM_LOCKLevel = TIM_LOCKLevel_1;
	// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
	// 这里配置的死区时间为152ns
	TIM_BDTRInitSturcture.TIM_DeadTime = 11;
	TIM_BDTRInitSturcture.TIM_Break = TIM_Break_Enable;
	// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
	TIM_BDTRInitSturcture.TIM_BreakPolarity = TIM_BreakPolarity_High;
	TIM_BDTRInitSturcture.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
	TIM_BDTRConfig(TIM1, &TIM_BDTRInitSturcture);
	
	//使能计数器
	TIM_Cmd(TIM1, ENABLE);
	//主输出使能,当使用的是通用定时器时,这句不需要
	TIM_CtrlPWMOutputs(TIM1,ENABLE);
}

(2)初始化输出以及断路对应的GPIO

static void Advance_Tim_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//输出比较通道GPIO初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//输出比较通道互补通道GPIO初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	//输出比较通道刹车通道GPIO初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}

(3)主函数中完成以上两步初始化就可以输出PWM

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值