(2)STM32F103ZETx高级定时器死区时间的再分析

    使用示波器测试实际输出波形,见图1,周期1ms,占空比20%,图2是测量的死区时间~280ns,72MHz时钟,死区时间设置为:                                                                                 sBreakDeadTimeConfig.DeadTime = 20;

图1
图2

问题:那么设置的20是怎么得到的280ns呢?

    找了一下资料,死区时间由寄存器TIMx_BDTR的DTG[7:0]: 死区发生器设置 (Dead-time generator setup)决定,如图3,其中TDTS由TIMx_CR1寄存器的CKD[1:0]: 时钟分频因子 (Clock division)决定:

                               htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;  //TIM_CLOCKDIVISION_DIV1 = 0x0

即TDTS = (1/72MHz) = 13.89ns。20*13.89ns = 277.8ns,和280ns很接近的样子。

图3

    网上找了篇博客(https://blog.csdn.net/geek_monkey/article/details/82809931)学习了下,有点理解了,但是感觉没理清楚,自己载分析分析。 

Case0:DTG[7:5]=0xx => DT=DTG[7:0] × Tdtg, Tdtg = TDTS;

就是说当DTG[7]=0时,不管DTG[6:0]是多少,DT都等于DTG[7:0] × Tdtg(Tdtg = TDTS)。当DTG[7]=0时,DTG[7:0]max = 0111 1111 = 127,Tdtg = TDTS = 1/72MHz = 13.89ns,那么Case0下,最大能够定义的死区时间为13.89ns*127 = 1764.03ns = 1.764us。反推一下,假设死区时间为1.5us,有1500ns / 13.89ns = 107.9 ≈ 108,即:

                                                              sBreakDeadTimeConfig.DeadTime = 108;

那前面程序中20*13.89ns = 277.8ns,和图1测试的相差不大。

Case1:DTG[7:5]=10x => DT=(64+DTG[5:0])×Tdtg,Tdtg = 2×TDTS;

就是说当DTG[7:6]=10时,不管DTG[5:0]是多少,DT都等于DT=(64+DTG[5:0])×Tdtg,Tdtg = 2×TDTS。当DTG[7:6]=10时,十进制为128,同时DTG[5:0]max = 0011 1111‬ = 63。TDTS = 1/72MHz = 13.89ns,Tdtg = 13.89ns*2 = 27.78ns。那么Case1下,最大能够定义的死区时间为(64+63)*27.78ns = 3,528.06‬ns = 3.528‬us,最小能够定义的死区时间为63*27.78ns =1,750.14‬‬‬ns = 1.75‬us,反推一下,假设死区时间为3us,有3000ns / 27.78ns = 107.9 ≈ 108 = (64+DTG[5:0]),即DTG[5:0] = 108-64 = 44,又DTG[7:6] = 128,则DTG[7:0] = 128+44 = 172 = 0xAC,即:

                                                             sBreakDeadTimeConfig.DeadTime = 172;

    后面2个Case不再分析,图4列出了4种Case下对应的可以设置的DT范围,总结了一下:可以不用关注DTG[7:0],直接看下死区时间在哪个范围内,然后用对应范围的计算公式直接计算出.DeadTime即可。

图4

 

如有错误,请指出。 

发布了8 篇原创文章 · 获赞 1 · 访问量 173

猜你喜欢

转载自blog.csdn.net/fendoulanyan/article/details/104569047