!=============================== !SPC5 self contained subroutine !Include in the .data section ! !Additional work needs to be done for multiple SPC5 mix periods ! !CMR Lab...UIUC...Trent Franks author !=============================== !---- SPC5 parameters .time extern autofix t_mix "mixing time" = 2000.0us; .time extern autofix pw360Xdq "X channel 360" = 20us; .time extern ZF_delay "Z filter time" = 100us; .time extern ZF_delay1 = 100 us; .time autofix PW360Xdq "pw360Xdq - tm1" = 20.0us; .time autofix PW270Xdq "pw360Xdq*.75 - tm1" = 15.0us; .time autofix PW90Xdq "pw360Xdq*.25 - tm1" = 5.0us; .time t_dqdec = 10us; .long extern q = 0; !number of rf cycles .long extern bigN_SPC5= 2; .ampl extern aXdq = 0.40; !X amplitude for DQ .ampl extern aHdq = 0.80; !H amplitude for DQ .ampl extern aHzfil = 0.30; !H amplitude for DQ .time extern tau_r = 100us; !---- RAD parameters .ampl extern aHrad =0.15; .time extern autofix tau_rad = 5000us; !DO NOT USE SPC5.inc and RAD.inc in same program. !--- SPC5 phases .phase ph_temp = 0.0; .phase list pdq[] = 0.0, 72.0,144.0,216.0,288.0, 180.0,252.0,324.0, 36.0,108.0; !=============================== !* Add the following lines to .acq file !# SPC5 parameters !q;No. cycles in t_exc;7;-;0;250;0;3;long !tau_r;rotor period;100;u;10;5000;2;2;float !t_mix;2Q mix + 0.1u;500;u;0;25000;2;3;float !bigN_SPC5;2Q rotor periods;2;-;1;5;0;1;long !pw360Xdq;X 360 (aXdq);16;u;.1;4000;2;2;float !aXdq;X dq ampl;0.0;-;0.0;1.0;4;3;float !pw90X;X 90 (aX90);4;u;.1;1000;2;3;float !aX90;X 90 ampl;0.0;-;0.0;1.0;4;3;float !#RAD/DARR parameters !tau_rad;rad mix time;1;m;0.01;100;3;3;float !aHrad;dec. dur. RAD;0.0;-;0.0;0.50;4;3;float !# SPC5 decoupling !aHdq;H dec. (DQ);0.0;-;0.0;1.0;4;1;float !aHzfil;dec. dur. z filter;0.25;-;0.0;1.0;4;1;float !*/ !.update "speed = bigN_SPC5/(5000.0*pw360Xdq)/2.0"; .update "tau_r = 1.0/speed/1000.0"; .update "ZF_delay = tau_r - pw90X"; .update "pw360Xdq = bigN_SPC5*tau_r/10.0"; .update "t_mix = (2.0*pw360Xdq)*q + 1u"; !(2.0*pw360Xdq)*q + tau_rad + 0.001u"; DEFINE SPC5_Prog SPC5_PROG; ENDDEF DEFINE SPC5_PROG dpc=dp; bigN_SPC5*tau_r/10.0; t_dqdec = pw360Xdq*2.0; PW360Xdq = pw360Xdq - tm1; PW270Xdq = (0.75*pw360Xdq) - tm1; PW90Xdq = (0.25*pw360Xdq) - tm1; ENDDEF DEFINE SPC5_prog SPC5_PROG; ENDDEF DEFINE START_MAIN_SPC5 pdq=pdq.start; ENDDEF DEFINE SPC5_C(store,recall) SPC5_X(store,recall); ENDDEF DEFINE SPC5_X(store,recall) out tm1 ch1:TG|AP(aX90,store); out pw90X ch1:TG; out time(ZF_delay) ch1:AP(aXdq,@pdq); out tMX ch1:MX; do(q) { out tm1 ch1:TG|P(@pdq); out PW90Xdq ch1:TG; out tm1 ch1:TG|P(p180+@pdq); out PW360Xdq ch1:TG; out tm1 ch1:TG|P(@pdq++); out PW270Xdq ch1:TG; } out tau_rad; out tm1 ch1:AP(aX90,recall); out time(ZF_delay); out tMX ch1:MX; out pw90X ch1:TG; ENDDEF DEFINE SPC5_H out tm1; out pw90X ch2: TG|A(aH)|p0; out time(ZF_delay) ch2: TG|A(aHzfil); out tMX; do(q) { out time(t_dqdec) ch2: TG|A(aHdq); } if (float(aHrad)>0.01){ out tau_rad ch2: TG|A(aHrad);} else{ out tau_rad;} out tm1; out time(ZF_delay) ch2: TG|A(aHzfil); out tMX; out pw90X ch2: TG|A(aH)|p0; ENDDEF DEFINE SPC5_N SPC5_Y; ENDDEF DEFINE SPC5_Y out tm1; out pw90X ; out time(ZF_delay); out tMX; do(q) { out time(t_dqdec); } out tau_rad; out tm1; out time(ZF_delay); out tMX; out pw90X; ENDDEF DEFINE SPC5_X_DQF(store,pdqf,recall) out tm1 ch1:TG|AP(aX90,store); out pw90X ch1:TG; out time(ZF_delay) ch1:AP(aXdq,@pdq); ph_temp=pdqf; out tMX ch1:MX; do(q) { out tm1 ch1:TG|P(@pdq); out PW90Xdq ch1:TG; out tm1 ch1:TG|P(p180+@pdq); out PW360Xdq ch1:TG; out tm1 ch1:TG|P(@pdq++); out PW270Xdq ch1:TG; } do(q) { out tm1 ch1:TG|P(ph_temp+@pdq); out PW90Xdq ch1:TG; out tm1 ch1:TG|P(ph_temp+p180+@pdq); out PW360Xdq ch1:TG; out tm1 ch1:TG|P(ph_temp+(@pdq++)); out PW270Xdq ch1:TG; } ! Careful with pass lists that are called more than once. out tau_rad; out tm1 ch1:AP(aX90,recall); out time(ZF_delay); out tMX ch1:MX; out pw90X ch1:TG; ENDDEF DEFINE SPC5_X_EXC(store) out tm1 ch1:TG|AP(aX90,store); out pw90X ch1:TG; out time(ZF_delay) ch1:AP(aXdq,@pdq); out tMX ch1:MX; do(q) { out tm1 ch1:TG|P(@pdq); out PW90Xdq ch1:TG; out tm1 ch1:TG|P(p180+@pdq); out PW360Xdq ch1:TG; out tm1 ch1:TG|P(@pdq++); out PW270Xdq ch1:TG; } ENDDEF DEFINE SPC5_X_REC(pdqf,recall) out tm1 ch1:TG|AP(aXdq,pdqf+@pdq); do(q) { out PW90Xdq ch1:TG; out tm1 ch1:TG|P(pdqf+p180+@pdq); out PW360Xdq ch1:TG; out tm1 ch1:TG|P(pdqf+(@pdq++)); out PW270Xdq ch1:TG; out tm1 ch1:TG|P(pdqf+@pdq); } out tau_rad; ! out tm1 ch1:AP(aX90,recall); out time(ZF_delay) ch1:AP(aX90,recall); out tMX ch1:MX; out pw90X ch1:TG; ENDDEF DEFINE SPC5_H_EXC out tm1 ch2: TG|A(aHdq)|p0; out pw90X ch2: TG; out time(ZF_delay) ch2: TG|A(aHzfil); out tMX ch2: TG|A(aHdq); do(q) { out time(t_dqdec) ch2: TG|A(aHdq); } ENDDEF DEFINE SPC5_H_REC out tm1 ch2: TG|A(aHdq)|p0; do(q) { out time(t_dqdec) ch2: TG; } if (float(aHrad)>0.01){ out tau_rad ch2: TG|A(aHrad);} else{ out tau_rad;} out time(ZF_delay) ch2: TG|A(aHzfil); out tMX ch2: TG; out pw90X ch2: TG|A(aHdq)|p0; ENDDEF DEFINE SPC5_Y_EXC out tm1; out pw90X; out time(ZF_delay); out tMX; do(q) { out time(t_dqdec); } ENDDEF DEFINE SPC5_Y_REC out tm1; do(q) { out time(t_dqdec); } out tau_rad; out time(ZF_delay); out tMX; out pw90X; ENDDEF DEFINE RAD_H(aDEC) out tm1; out pw90X ch2: TG|A(aDEC)|p0; out time(ZF_delay) ch2: TG|A(aHzfil); out tMX; out tau_rad ch2: TG|A(aHrad); out tm1; out tMX; out pw90X ch2: TG|A(aDEC)|p0; ENDDEF DEFINE RAD_X(Store,Recall) out tm1 ch1:TG|AP(aX90,Store); out pw90X ch1:TG; out time(ZF_delay) ; out tMX ch1:MX; out tau_rad; out tm1 ch1:TG|AP(aX90,Recall); out tMX ch1:MX; out pw90X ch1:TG; ENDDEF DEFINE RAD_Y out tm1; out pw90X; out time(ZF_delay); out tMX; out tau_rad; out tm1; out tMX; out pw90X; ENDDEF DEFINE RAD_C(Store,Recall) RAD_X(Store,Recall); ENDDEF DEFINE RAD_N; RAD_Y; ENDDEF