以STM32F4为例说明
TIM_ClockDivision:时钟分割,配置寄存器是TIM1->CR1
共有3种分割参数,这里CK_INT是指选择的时钟时基见图1-紫红色
CK_INT是用户选择的内部时钟,比如通用定时器=84MHz(当预分频系数为0时),那么CK_INT=84MHz,若预分频系数不为0,则按照相关计算得出CK_INT大小;那么tDTS就可以对应计算了
是用到定时器输入相关的功能才使用到的配置,如:
- 外部触发输入,见图1-红色框,涉及到的寄存器TIM1->SMCR
- 输入捕获功能,见图1-蓝色框,涉及到的寄存器TIM1->CCMR1
- 死区时间设定,见图1-绿色框,涉及到的寄存器TIM1->BDTR
图1
那我们看一下这3个寄存器,有关的配置
我们由上可知,这三个功能或寄存器都涉及到了tDTS(或者fDTS=1/tDTS)
这样我们就清楚了时钟分割的用处了,就在这3个方面
1.外部触发输入:这个实际用得少,就不说了
2.输入捕获:一般是测量一个信号的频率、占空比、脉宽等
这里以BLDC中捕获Hall信号来说明
BLDC中有6步驱动,每一步需要换相,而幻想的依据就是Hall信号发生跳变,在有感BLDC中使用输入捕获来检测HALL信号(当然有的会使用IO高低电平读取或采用外部中断来检测HALL信号)
配置参数:
//定时器相关
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);
其它的相关配置,这里就不贴出来了
我们看到以上配置中有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事件有利于滤除高频干扰信号
3.死区时间设定:这个以BLDC中高级定时器3路互补通道输出PWM为例
死区设定是防止半桥上下MOS同时导通,造成MOS烧坏,如下图1,因为MOS导通和关断是有时间限制的,虽然MCU输出的互补信号在高低电平上没有重叠,但是由于中间电路的延时和MOS本身特性导致最后驱动MOS的信号有开关重叠,如下图2
图1
图2
这样我们可以再定时器中配置互补信号输出的时序实现死区时间,不过这个时间一般200ns-2us,不能再大,有些电机应用中对这个要求更高,那要用死区补偿来优化
配置程序如下
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死区时间
其他下相关配置这里就不贴出来了
F4的高级定时器=168MHz,这里预分频系数=0,说明不变;分割系数=2,找到寄存器TIM1->CR1可知tTDS=2*tCK_INT,那么找到死区配置寄存器TIM1->BDTR,计算对应死区时间,这里设定死区时间=800ns
上面配置TIM_DeadTime =(168*800)/1000/2=67;
即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分割系数在实际中的应用
版权声明:本文为CSDN博主「你的青春我的梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yuyan7045/article/details/121289037
暂无评论