×
单片机 > 单片机程序设计 > 详情

【STM32电机方波】记录3——TIM1时基初始化配置

发布时间:2020-06-18 发布时间:
|

定时器分类 :
STM32F1x 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。

基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。

通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。

高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。 





高级定时器TIM1的库函数:



定时器TIM1时基结构体缺省值:

{

TIM1_Period =TIM1_Period_Reset_Mask;// 定时器周期,设定自动重载寄存器TIMx_ARR 的值

    TIM1_Prescaler = TIM1_Prescaler_Reset_Mask;//预分频器,设定TIMx_PSC 寄存器的值,

    TIM1_CKD =TIM1_CKD_DIV1;               // 时钟分频 

    TIM1_CounterMode = TIM1_CounterMode_Up; //计数模式(高级定时器有5种模式)

    TIM1_RepetitionCounter = TIM1_RepetitionCounter_Reset_Mask;//重复计数器 

}


TIM1 时基初始化及中断子程序配置:

void TIM1_TimeBaseInit(u16 arr,u16 psc)

{

 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM1时基结构体

 NVIC_InitTypeDef NVIC_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①时钟 TIM1 使能

 

 TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器ARR周期的值

 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值

 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割

 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数

 TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //计数频率为72MHz

 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIM1

 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //③允许更新中断  //中断优先级 NVIC 设置

 

 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1 中断

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 1 级

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能

 NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器


 TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM1

}

void TIM1_IRQHandler(void) //TIM1 中断

{

    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查 TIM1 更新中断发生与否

   {

      TIM_ClearFlag(TIM1, TIM_IT_Update ); //清除 TIM1 更新中断标志

        ………………………………………………………………

    }

}

发生中断时间=(TIM_Prescaler+1)* (TIM_Period+1)/FLK


基本定时器的核心是时基,通用计时器和高级定时器也有。 对于高级定时器TIM1 来说:

1、时钟源 

定时器时钟TIMxCLK,即内部时钟CK_INT,经APB2预分频器后分频提供,如果APB2 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB2 预分频的系数是 2,即 PCLK2=36M,所以定时器时钟 TIMxCLK=36*2=72M 。 

2、计数器时钟 

定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。 

具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。 

3.计数器 

计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。 

4、自动重装载寄存器 

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。 

5. 定时时间的计算 

定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/(CK_CLK * ARR)。如果在中断服务程序里面设置一个变量 time,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于: 1/CK_CLK *(ARR+1)*time。 



BLCD电机的起动:

按下功能键,令高级定时器TIM1 输出 PWM 方波、进入TIM1中断,通过两相通电法测定初始状态的电机。具体的操作是给任意两相通电,并控制电机电流不致过大,启动电机做一次换向,通电一段时间后,转子就会转到与该通电状态对应的预知位置,完成转子的定位

PWM输出:

PWM的配置在其结构体 TIM_Period(周期设定)、TIM_Prescaler(分频)、TIM_OCMode(输出模式)、TIM_OutputNState(互补输出状态)、TIM_Pulse(捕获比较器的值,即设定PWM的占空比)等的配置。另外对于BLDC来说,PWM波形使用TIM1产生,1、2、3三个通道产生3路PWM驱动六个MOSFET,4通道用于ADC采样,而ADC1扫描3个通道获取反电动势,其扫描结果由DMA传输。


关键字:STM32  电机方波  TIM1  时基初始化 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯