高级定时器简介
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
上一篇:STM32学习——MPU6050姿态传感器
下一篇:STM32学习——TIM基本定时器
推荐阅读最新更新时间:2024-11-11 17:30
设计资源 培训 开发板 精华推荐
- DC2040A,使用 LTC3355EUF、20V 1A 降压 DC/DC 和集成 SCAP 充电器和备用稳压器的演示板
- 使用 Analog Integrations Corporation 的 AIC16 的参考设计
- 基于VIPER16的超宽输入范围、双输出反向转换器演示板
- VL53L0X测距模块
- MIC5205 LDO 稳压器评估板
- 使用 LT1054ISW 数字可编程负电源的典型应用
- 具有 400mA 突发钳位、fSW = 1MHz 同步降压型稳压器的 LTC3621HMS8E-5 2.5V Vout 的典型应用
- 使用 ROHM Semiconductor 的 BD5358 的参考设计
- 用于远程控制的 PSoC 嵌入式系统
- TCR2LN32 200mA、3.2V输出电压CMOS低压降稳压器的典型应用