diff --git a/sw/in_progress/motor_bench/ident_dyn.sce b/sw/in_progress/motor_bench/ident_dyn.sce new file mode 100644 index 0000000000..b348710e59 --- /dev/null +++ b/sw/in_progress/motor_bench/ident_dyn.sce @@ -0,0 +1,56 @@ +clear(); +getf('mb_utils.sci'); + +filename = "data/steps_stout_aero_geared.txt"; + +[time, throttle, rpm, amp, thrust, torque] = read_mb_log(filename); + + +// design an iir low pass with cutoff freq at 125Hz +hz=iir(3,'lp','ellip',[0.5 0.5],[.01 .01]); + +//[hzm,fr]=frmag(hz,256); +//plot2d(fr',hzm',3) + +[rpm_lp] = rtitr(hz(2), hz(3), rpm); + + +//if 0 + xbasc(); + subplot(2,1,1) + xtitle('Throttle'); + plot(time(30:length(time)), throttle(30:length(throttle)), 'b-'); + subplot(2,1,2) + plot(time(30:length(time)), rpm(30:length(rpm)), 'r-'); + plot(time(30:length(time)), rpm_lp(30:length(rpm_lp)), 'g-'); +//end + +s_avg = 30; +e_avg = 118; +rpm0 = mean(rpm(s_avg:e_avg)); + +plot(time(s_avg:e_avg), rpm0*ones(1,e_avg - s_avg + 1), 'b-'); + +my_kv = 100000; +my_taukq = - 0.0003313; // plain wrong it seems :( +my_tau = 0.3; // +my_kq = my_taukq / my_tau; // + + +time_ode = time(s_avg:length(time)); +u_ode = throttle(s_avg:length(throttle)); + + +function rpm_dot = my_mot_ode(t, rpm) + if ((t >= 389.7960)& (t < 390.7960)) + thr = 0.7; + else + thr = 0.6; + end + rpm_dot = mot_ode(my_tau, my_kq, my_kv, thr); + endfunction + + +rpm_sim = ode([rpm0], time(1), time_ode, my_mot_ode); + +plot(time_ode, rpm_sim, 'r-'); \ No newline at end of file diff --git a/sw/in_progress/motor_bench/ident_prbs.sce b/sw/in_progress/motor_bench/ident_prbs.sce new file mode 100644 index 0000000000..142eeb59a2 --- /dev/null +++ b/sw/in_progress/motor_bench/ident_prbs.sce @@ -0,0 +1,108 @@ +clear(); +getf('mb_utils.sci'); + +rank=[]; +time_s=[]; +time_r=[]; +throttle_raw=[]; +tacho_raw=[]; + +u=mopen('data/xxx_prbs.txt','r'); +while meof(u) == 0, + line = mgetl(u, 1); + if strindex(line, '#') ~= 1 & length(line) ~= 0, + [nb_scan, _rank, _time_s, _time_r, _throttle_raw, _tacho_raw] = msscanf(1, line, '%x %x %x %x %x'); + if nb_scan == 5, + rank = [rank _rank]; + time_s = [time_s _time_s]; + time_r = [time_r _time_r]; + throttle_raw = [throttle_raw _throttle_raw]; + tacho_raw = [tacho_raw _tacho_raw]; + end + end +end + +mclose(u); + + +// extract experiment +//EXPE_LEN = 4096; +EXPE_LEN = 100; +EXPE_START = 41; +rank = rank(EXPE_START:EXPE_START+EXPE_LEN); +time_s = time_s(EXPE_START:EXPE_START+EXPE_LEN); +time_r = time_r(EXPE_START:EXPE_START+EXPE_LEN); +throttle_raw = throttle_raw(EXPE_START:EXPE_START+EXPE_LEN); +tacho_raw = tacho_raw(EXPE_START:EXPE_START+EXPE_LEN); + +// compute time +TICK_PER_S = 15625; +time = time_s + time_r / TICK_PER_S; +DT = (time(length(time)) - time(1)) / (length(time) - 1) +F_EC = 1 / DT + +// normalise throttle +MAX_PPRZ = 9600; +throttle = throttle_raw / MAX_PPRZ; + +// compute rpms +TICK_PER_ROTATION = 36; +rpm = tacho_raw / DT / TICK_PER_ROTATION * 60; + +// integrate ODE +//kv0 = 100000; +kv0 = 22000; +//taukq = 0.0003313; // +taukq = 0.00001; // +//tau0 = 0.3; // +tau0 = 0.1; // +kq0 = taukq / tau0; // + +rpm0 = rpm(1); + +//idx = 1; +function rpm_dot = prbs_mot_ode(t, rpm) + idx=1; + while (time(idx) < t & idx < length(throttle)), idx=idx+1, end +// printf('%f %d %f\n', t, idx, time(idx)); + rpm_dot = mot_ode(my_tau, my_kq, my_kv, throttle(idx), rpm); +endfunction + +p0 = [tau0; kv0; kq0]; + + +function e = err_prbs(p,z) + my_tau = p(1); + my_kv = p(2); + my_kq = p(3); + rpm_sim = ode([rpm0], time(1), time, prbs_mot_ode); + _diff = rpm_sim - rpm; + sq_diff = _diff^2; + e = sum(sq_diff); +endfunction + + +if 0 + my_tau = tau0; + my_kv = kv0; + my_kq = kq0; + rpm_sim = ode([rpm0], time(1), time, prbs_mot_ode); +else + Z = [ 1; 1]; //unused... + [p, err] = datafit(err_prbs, Z, p0) + my_tau = p(1); + my_kv = p(2); + my_kq = p(3); + rpm_sim = ode([rpm0], time(1), time, prbs_mot_ode); +end + + + +xbasc(); +subplot(2,1,1); +xtitle('Throttle'); +plot(time, throttle, 'b-'); + +subplot(2,1,2); +plot(time, rpm, 'r-'); +plot(time, rpm_sim, 'b-'); \ No newline at end of file diff --git a/sw/in_progress/motor_bench/ident_stat.sce b/sw/in_progress/motor_bench/ident_stat.sce new file mode 100644 index 0000000000..28b558153d --- /dev/null +++ b/sw/in_progress/motor_bench/ident_stat.sce @@ -0,0 +1,35 @@ +clear(); +getf('mb_utils.sci'); + +load('averaged_ramp_geared.dat','av_throttle','av_rpm') + +// extract only data around operating point +//i_s = 20; +//i_e = 90; +i_s = 5; +i_e = 90; +t_part = av_throttle(i_s:i_e); +r_part = av_rpm(i_s:i_e); + +// tau_kq kv dv +p0=[0.00001; 20000]; +Z = [r_part; t_part]; +//[p, err] = datafit(err_mot_lin, Z, p0); + +[p, err] = datafit(err_mot_ric, Z, p0) +//p = p0; + +xbasc(); +//subplot(3,1,1); +xtitle('Rpms vs Throttle'); +plot2d(av_throttle,av_rpm); +plot2d(t_part,r_part, 4); + + +r_fit = []; +for i=1:length(av_throttle) + // r_fit = [r_fit mot_lin(av_throttle(i), p)]; + r_fit = [r_fit mot_ric_stat(av_throttle(i), p)]; +end + +plot2d(av_throttle,r_fit, 3); \ No newline at end of file diff --git a/sw/in_progress/motor_bench/mb_utils.sci b/sw/in_progress/motor_bench/mb_utils.sci index e1d9c95437..96fadd6ed8 100644 --- a/sw/in_progress/motor_bench/mb_utils.sci +++ b/sw/in_progress/motor_bench/mb_utils.sci @@ -111,3 +111,34 @@ function [] = param_fit(av_rpm, av_throttle) plot2d(X,FF(X,p),12) //the solution param_fitted=FF(X,p); endfunction + + +function r = mot_lin(t, p) + r = p(1) * t + p(2); + endfunction + +function e = err_mot_lin(p, z) + r=z(1), t=z(2); + e = r - mot_lin(t, p); + endfunction + + +function rpm = mot_ric_stat(throttle,param) + // maybe 1 + + tau_kq = param(1); + kv = param(2); + dv = 0.0; + rpm = (-1 + sqrt(1 + 4 * tau_kq * kv * (throttle + dv))) / (2 * tau_kq); +endfunction + +function e = err_mot_ric(p, z) + r_meas = z(1); + throttle = z(2); + e = r_meas - mot_ric_stat(throttle, p); +endfunction + + + +function rpm_dot = mot_ode(tau, kq, kv, V, rpm) + rpm_dot = -1/tau*rpm - kq * rpm^2 + kv/tau*(V); +endfunction \ No newline at end of file diff --git a/sw/in_progress/motor_bench/static_parameter.sce b/sw/in_progress/motor_bench/static_parameter.sce index 087385474c..07f31b5ff5 100755 --- a/sw/in_progress/motor_bench/static_parameter.sce +++ b/sw/in_progress/motor_bench/static_parameter.sce @@ -2,22 +2,28 @@ clear(); getf('mb_utils.sci'); load('averaged_ramp_geared.dat','av_throttle','av_rpm') -//separating the values to 20% to 90% -start=(length(av_throttle)-1)/5 -end=(length(av_throttle)-1)-(length(av_throttle)-1)/10 -for i=start:end, sep_av_throttle(i-start+1)=av_throttle(i);end -for i=start:end, sep_av_rpm(i-start+1)=av_rpm(i);end -fitted_courve = param_fit(sep_av_rpm, sep_av_throttle); - -//xbasc(); + +t_part = av_throttle(20:90); +r_part = av_rpm(20:90); + +p0=[0.00001; 20000]; +Z = [r_part; t_part]; +//[p, err] = datafit(err_mot_lin, Z, p0); + +[p, err] = datafit(err_mot_ric, Z, p0) +//p = p0; + +xbasc(); //subplot(3,1,1); -//xtitle('Relative Throttle by RPM'); -//plot2d(av_throttle,av_rpm); +xtitle('Rpms vs Throttle'); +plot2d(av_throttle,av_rpm); +plot2d(t_part,r_part, 4); -//subplot(3,1,2); -//xtitle('Fittet Relative Throttle by RPM'); -//plot2d(sep_av_throttle,[sep_av_rpm],style=[5,4]); -//subplot(3,1,3); -//xtitle('Fittet Relative Throttle by RPM'); -//plot2d(sep_av_throttle,[fitted_courve],style=[4]); +r_fit = []; +for i=1:length(av_throttle) + // r_fit = [r_fit mot_lin(av_throttle(i), p)]; + r_fit = [r_fit mot_ric(av_throttle(i), p)]; +end + +plot2d(av_throttle,r_fit, 3); \ No newline at end of file diff --git a/sw/in_progress/motor_bench/test.sce b/sw/in_progress/motor_bench/test.sce index 6d8cc6e530..aae9a389d9 100644 --- a/sw/in_progress/motor_bench/test.sce +++ b/sw/in_progress/motor_bench/test.sce @@ -5,7 +5,7 @@ getf('mb_utils.sci'); args = sciargs(); [nb_args, foo] = size(args) filename = args(nb_args); - +filename = "data/steps2_stout_aero_geared.txt" [time, throttle, rpm, amp, thrust, torque] = read_mb_log(filename);