дискретность 0,0001 , в целочисленке 1. диапазон -100..500. в целочисленке со знаком -1000000...5000000 в шестнадцатеричной FFF0 BDC0...004C 4B40. невооружённым глазом видно достаточности 32-х разрядной арифметики с которой справится авр, пик, стм но как правильно заметил SciFi - требования к скорости
для примера пид регулятор на асме авра. знаковая 16-ти и 32-х разрядная целочисленка
;* Ut = ( new_err * kp + It + Dt ) / Sc_r // ( 0 - 100%)
pid_control:
// new_err = P_set - P_val
lds_w E0,P_set
lds_w E1,P_val
sub_w E0,E1
sts_w New_err,E0
mov_w X,E0 // X = new_err
........................................................................................
// It = It + k_int * new_err
lds_w E1,k_int
muls_w // dF = E1 * E0
// It + ki_int
lds_d dE,It
add_d dE,dF // It + ki_int * new_err
........................................................................................
// if ( It < 0 ) It = 0
lds_d dF,sci_r
neg_d dF
cp_d dE,dF
brge pp1
mov_d dE,dF
rjmp pp2
..................................................................................
// else if( It > Sc_r ) It = Sc_r
pp1: lds_d dF,sci_r
cp_d dF,dE
brge pp2
mov_d dE,dF
pp2: sts_d It,dE // save It
mov_d dH,dE // dH (Z : Y) = It
..................................................................................
// Dt = kd_r * ( new_err - old_err )
lds_w E1,old_err
mov_w E0,X
sub_w E0,E1 // new_err - old_err
lds_w E1,K_df
muls_w // // dF = E1 * E0
// kd_r * ( new_err - old_err )
// dF = Dt
// X = new_err
// dH (Z : Y) = It
sts_d Dt,dF // save Dt
....................................................................................
// Ut = ( new_err*kp + It + Dt ) / Sc_r // ( 0 - 100%)
add_d dH,dF // dH = It + Dt
...............................................................................
// old_err = new_err
sts_w old_err,X
...............................................................................
mov_w E1,X
lds_w E0,K_pr
muls_w // dF = E1 * E0
// new_err * kp
add_d dF,dH // dF = It + Dt + new_err * kp = Ut
// if ( Ut < 0 ) Ut = 0
tst df_3
brge pp3 // Ut > 0
clr df_0 // Ut = 0
rjmp pp4
// Ut = ( new_err kp + It + Dt ) / Sc_r // ( 0 - 100%)
pp3: lds_w E0,sc_r
div_d_w // dF = dF / E0
ldi_w E0,100
cp_w F0,E0
breq pp4
brlo pp4
ldi df_0,100
...............................................................................
pp4: sts Ut,df_0 // save Ut
ret
;------------------------------------------------------------------------------