使用示波器測試實際輸出波形,見圖1,週期1ms,佔空比20%,圖2是測量的死區時間~280ns,72MHz時鐘,死區時間設置爲: sBreakDeadTimeConfig.DeadTime = 20;
問題:那麼設置的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很接近的樣子。
網上找了篇博客(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.06ns = 3.528us,最小能夠定義的死區時間爲63*27.78ns =1,750.14ns = 1.75us,反推一下,假設死區時間爲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即可。
如有錯誤,請指出。