ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
651030 Топик полностью
m16_home (05.02.2016 13:02, просмотров: 96) ответил Peter_M на А что посоветуете для математические расчетов (регуляторы), где переменные должны быть знаковые, в диапазоне от 500 до минус 100, с дискретностью не выше 0,0001. Т.е. нужно представить числа типа 500,0001.
дискретность 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 ;------------------------------------------------------------------------------