(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

 

如有錯誤,請指出。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章