Замените тип
mt_time: DWORD; на TIME;
или просто
mt : TIME;
На кой лишний dword и буквы ?

и тогда замените
timer.dw_time_ms
на TIME()
arr_tt[j].mt:=TIME();

Упростите счетчик
IF j=n THEN
j:=0;
ELSE
j:=j+1;
END_IF
на классический циклический
j := (j + 1) mod (n + 1);


Вычитаете
..[j] - ..[j2]
dt - это из текущего вычесть прошлое, но
j2 := j + 1; это будущее

логичней было бы не j2 а j0 (или j_) Да и определить проще :
j0 := j;
j := (j + 1) mod (n + 1);

сложное и странное dt
((...) / (DWORD_TO_REAL(arr_tt[j].mt_time)-DWORD_TO_REAL(arr_tt[j2].mt_time)))*60000
60000 - тута не СИ ?

((...) / (TIME_TO_REAL(arr_tt[j].mt - arr_tt[j0].mt)) * 1000
это *С /сек

Ну и есть смысл какой нить init для вычисления dT/dt т.к. при 1-ом измерении еще нет прошлого

if init then
..dT/dt;
end_if
init := true;