目录
关于STM32的定时器的概况
STM32定时器
STM32最多达11个定时器,其中2个为高级控制定时器,4个为普通定时器和2个为基本定时器,2个看门狗定时器和1个SysTick滴答定时器。
高级控制定时器:TIM1、TIM8。功能最强,可以实现所有其他定时器的所有功能,在APB2总线上3对互补PWM,可用于电机控制。
通用定时器:TIM2~TIM5,还有TIM9~TIM14。功能次之。在APB1总线上。
基本定时器:TIM6和TIM7。功能最简单。在APB1总线上。
STM32通用定时器的基本应用——配置要点
以通用定时器 TIM5为例,基本的配置要点如下
选择时钟来源
选择计数器模式 TIM2-TIM5可以有向上计数、向下计数、向上向下双向计数三种计数模式
程序步骤 PSC(预分频值)和ARR(自动重装溢出值),前者就是对定时器所用的时钟进行分频,后者就是设置计数目标
第一步:配置系统时钟; 所有涉及的外设的时钟
第二步:配置NVIC; 中断及其使能
第三步:配置GPIO; 所用的GPIO (根据需要,这一步不是必须的)
第四步:配置TIMER。 所用的定时器配置
举例说明
1.配置相应的GPIO引脚
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
//对PH10初始化
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;// PH.10脉冲输入
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Fast_Speed;
GPIO_Init(GPIOH,&GPIO_InitStruct);
GPIO_PinAFConfig(GPIOH,GPIO_PinSource10, GPIO_AF_TIM5);
2.配置TIM5定时器的有关特性和参数
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//编写,定时器TIM5的基础初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);// 打开管脚时钟
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV2 ;//分频器
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down;//计数模式,是加还是减
TIM_TimeBaseInitStruct.TIM_Period=arr;//周期
TIM_TimeBaseInitStruct.TIM_Prescaler=1;//预分频器,相当简单分频
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter=;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStruct);//根据指定的参数初始化TIMx的
TIM_ARRPreloadConfig(TIM5, ENABLE);//使能ARR预装载缓冲器
//TIM_ClearFlag(TIMx,TIM_FLAG_Update); //清除溢出标志,可不用
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE); //使能定时器溢出中断
TIM_Cmd(TIM5, ENABLE);//使能TIM5外设
3.使能定时器(如果采用中断法,则要使能定时器中断,设置优先级,自定义中断函数
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn ;//查找中断源不需要分析组别,只要管脚对应即可,PA0,PB0,RC0,PD0
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn ;//查找中断源,PA0,PB0,RC0,PD0
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//设置中断主优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//设置中断子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//中断请求开关
NVIC_Init(&NVIC_InitStruct);
4.采用中断法或查询法读取计数值
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SYSCFG , ENABLE);//开系统时钟
NVTC_setup();
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);//将PA0,PC13设置为中断请求方式
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource13);
EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line13;//中断线
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发发式
EXTI_InitStruct.EXTI_LineCmd=ENABLE ;//中断线开关
STM32通用定时器的计数器原理
对内部时钟计数是典型的定时器。对外部脉冲计数可以理解其为定时器,也可以视其为计数器
STM32定时器的PWM
PWM:脉宽调制(PWM,Pulse Width Modulation)是脉冲宽度调制的简称,被广泛应用在从测量、通信到功率控制与变换的许多领域中。随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等。
它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,通过改变脉冲的宽度或占空比可以调压,如果采用适当控制方法即可使电压与频率协调变化,从而实现通过调整PWM的周期、PWM的占空比而达到改变电压、或电流的目的。
占空比(Duty Cycle)的含义:在一串理想的脉冲序列(如方波)中,正脉冲的持续时间与脉冲总周期的比值。例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。
STM32的PWM原理
STM32单片机的定时器中的计数单元对一定频率的时钟进行计数,当计数值达到某个设定值时,某一对应的引脚的输出状态进行翻转(例如:由高电平翻转为低电平),然后直到计数单元溢出,输出状态再次翻转回到原始状态。显然,在计数频率一定的情况下,改变计数值,就能改变脉冲宽度,即PWM。其实PWM就是定时器的一个比较功能而已。
STM32的PWM的三个基本步骤
配置输出通道:选择使用某个通道或某几个通道作为PWM功能的定时器的输出通道,那么,对应的脚(其实就是GPIO)必须进行时钟和引脚输出方式配置(PWM输出口要配置为复用推挽输出GPIO_Mode_AF_PP)
配置定时器:设置TIMx定时器的相关寄存器。主要是设置的ARR和PSC。这部分配置与前述内容没有本质差异。这一步设置PWM波形的周期(频率)
配置PWM模式:设置相关引脚为PWM模式(默认是冻结的)。通过函数TIM_OC1Init()~TIM_OC4Init(),不同通道的设置函数是不同的。
TIM_OCInitTypeDef TIM_OCInitStruct;//设置缺省值
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//设置占空比
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable ;//TIM5的输出
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low ;//使能输出状态
TIM_OC1Init(TIM5,&TIM_OCInitStruct);
//设置TIM3的PWM输出为使能
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);//通道1预装载
动态修改占空比的函数
uint16_t rx=10;
gpio_pwminit(255);
TIM_SetCompare1(TIM5,rx);
实训
STM32实验系统通过L298N控制电机以实现直流马达正反转控制和转速控制直流电机工作电压为4.5—36V