定时器分类 :
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电机方波】记录4——PWM输出配置
下一篇:【STM32电机方波】记录2——NVIC中断基本设置
推荐阅读最新更新时间:2024-03-16 16:14