打印
[其他ST产品]

STM32 时钟分割TIM_ClockDivision配置及使用详细说明

[复制链接]
782|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

以STM32F4为例说明

TIM_ClockDivision:时钟分割,配置寄存器是TIM1->CR1

共有3种分割参数,这里CK_INT是指选择的时钟时基见图1-紫红色


使用特权

评论回复
评论
舒伯特玫瑰 2023-1-30 23:23 回复TA
———————————————— 版权声明:本文为CSDN博主「你的青春我的梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yuyan7045/article/details/121289037 
沙发
舒伯特玫瑰|  楼主 | 2023-1-30 22:14 | 只看该作者

CK_INT是用户选择的内部时钟,比如通用定时器=84MHz(当预分频系数为0时),那么CK_INT=84MHz,若预分频系数不为0,则按照相关计算得出CK_INT大小;那么tDTS就可以对应计算了

使用特权

评论回复
板凳
舒伯特玫瑰|  楼主 | 2023-1-30 22:21 | 只看该作者
是用到定时器输入相关的功能才使用到的配置,如:

外部触发输入,见图1-红色框,涉及到的寄存器TIM1->SMCR
输入捕获功能,见图1-蓝色框,涉及到的寄存器TIM1->CCMR1
死区时间设定,见图1-绿色框,涉及到的寄存器TIM1->BDTR

使用特权

评论回复
地板
舒伯特玫瑰|  楼主 | 2023-1-30 22:22 | 只看该作者

使用特权

评论回复
5
舒伯特玫瑰|  楼主 | 2023-1-30 22:28 | 只看该作者
那我们看一下这3个寄存器,有关的配置

使用特权

评论回复
6
舒伯特玫瑰|  楼主 | 2023-1-30 22:31 | 只看该作者


我们由上可知,这三个功能或寄存器都涉及到了tDTS(或者fDTS=1/tDTS)

使用特权

评论回复
7
舒伯特玫瑰|  楼主 | 2023-1-30 22:32 | 只看该作者
这样我们就清楚了时钟分割的用处了,就在这3个方面

1.外部触发输入:这个实际用得少,就不说了

2.输入捕获:一般是测量一个信号的频率、占空比、脉宽等

使用特权

评论回复
8
舒伯特玫瑰|  楼主 | 2023-1-30 23:20 | 只看该作者
这里以BLDC中捕获Hall信号来说明

BLDC中有6步驱动,每一步需要换相,而幻想的依据就是Hall信号发生跳变,在有感BLDC中使用输入捕获来检测HALL信号(当然有的会使用IO高低电平读取或采用外部中断来检测HALL信号)

使用特权

评论回复
9
舒伯特玫瑰|  楼主 | 2023-1-30 23:23 | 只看该作者
配置参数:

//定时器相关

TIM_TimeBaseStructure.TIM_Prescaler =84-1;//时钟频率为1MHZ

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分割

      TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

//输入捕获相关

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;

  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //

  // listen to T1, the  HallSensorEvent

  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;

  // Div:1, every edge

  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

TIM_ICInitStructure.TIM_ICFilter = 15;//滤波器位值=15

  TIM_ICInit(TIM4, &TIM_ICInitStructure);

使用特权

评论回复
10
舒伯特玫瑰|  楼主 | 2023-1-30 23:23 | 只看该作者
其它的相关配置,这里就不贴出来了

我们看到以上配置中有2个配置:配置分割系数,滤波器数值

(1)不分割就是说明CK_INT=84/84=1MHz,那么fTDS=1MHZ,tTDS=1us;

(2)滤波器数值=15,这要回到对应的寄存器中TIM1->CCMR1中,即IC1F[3:0]=1111b(2进制),可以到考到采样频率fSAMPLING=fTDS/32=1MHz/32=31.25KHz

根据奈奎斯特采样定律可知(至少2倍采样信号频率),被采样的频率最大为31.25KHz/2=15.625KHz,如果大于这个频率信号将不能被正常识别;

另外有一个N什么意思呢,手册中说:数字滤波器由事件计数器组成,每 N 个事件才视为一个有效边沿;

其实是指读取的电平信号持续多长时间才认为是有效电平信号,看下图


这里计数频率是1MHz,即t=1us,N=8即说明采集到高电平信号持续8us才能认为是有效高电平

设定分割频率,根据滤波系数决定的采样频率和N事件有利于滤除高频干扰信号、

使用特权

评论回复
11
舒伯特玫瑰|  楼主 | 2023-1-30 23:24 | 只看该作者
死区时间设定:这个以BLDC中高级定时器3路互补通道输出PWM为例

死区设定是防止半桥上下MOS同时导通,造成MOS烧坏,如下图1,因为MOS导通和关断是有时间限制的,虽然MCU输出的互补信号在高低电平上没有重叠,但是由于中间电路的延时和MOS本身特性导致最后驱动MOS的信号有开关重叠,如下图2


这样我们可以再定时器中配置互补信号输出的时序实现死区时间,不过这个时间一般200ns-2us,不能再大,有些电机应用中对这个要求更高,那要用死区补偿来优化

使用特权

评论回复
12
舒伯特玫瑰|  楼主 | 2023-1-30 23:25 | 只看该作者
配置程序如下

  TIM_TimeBaseStructure.TIM_Prescaler = 0;

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//中央对齐模式1

  TIM_TimeBaseStructure.TIM_Period = 5250;//设置周期

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;//2倍分割

  TIM_TimeBaseStructure.TIM_RepetitionCounter = REP_COUNTER;//重复计数器值

  TIM_BDTRInitStructure.TIM_DeadTime =(168*800)/1000/2;//800ns死区时间

其他下相关配置这里就不贴出来了

使用特权

评论回复
13
舒伯特玫瑰|  楼主 | 2023-1-30 23:30 | 只看该作者
F4的高级定时器=168MHz,这里预分频系数=0,说明不变;分割系数=2,找到寄存器TIM1->CR1可知tTDS=2*tCK_INT,那么找到死区配置寄存器TIM1->BDTR,计算对应死区时间,这里设定死区时间=800ns

上面配置TIM_DeadTime =(168*800)/1000/2=67;

使用特权

评论回复
14
舒伯特玫瑰|  楼主 | 2023-1-30 23:31 | 只看该作者
即DTG[7:0]=67=010 00011b(2进制)找到对应公式,符合第一条计算公式:DTG[7:5]=0xx=>…

DT=DTG[7:0]*tdtg, 其中DTG[7:0]=67,tdtg=2*tDTS,即tdtg=2*tCK_INT,

DT=67*2*(1/168000000)s=797ns

到这里就说完了TIM_ClockDivision分割系数在实际中的应用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

264

帖子

2

粉丝