From 0d6a73d83563fad775d11bd56dd1a641ea46ecbe Mon Sep 17 00:00:00 2001 From: Ayzen Date: Tue, 3 Feb 2026 19:29:40 +0300 Subject: [PATCH] added sram saw --- __pycache__/device_commands.cpython-312.pyc | Bin 20462 -> 21431 bytes .../device_interaction.cpython-312.pyc | Bin 8090 -> 8500 bytes __pycache__/gui.cpython-312.pyc | Bin 18512 -> 19159 bytes _device_main.py | 7 +- device_commands.py | 82 +++++++++++++----- device_interaction.py | 41 +++++---- gui.py | 8 ++ 7 files changed, 99 insertions(+), 39 deletions(-) diff --git a/__pycache__/device_commands.cpython-312.pyc b/__pycache__/device_commands.cpython-312.pyc index 3f7dcecc1aabe03a467ab6e4541ec4a9bd3a96fd..1ebe2d23d174d313fa3dda28916306de9ae0f43e 100644 GIT binary patch delta 4348 zcmaJ^dr(}}8NX-W4<5@dgnh9*!Xpa{fdv8ykc3wf5*`U)TB+$uxR->4?Bdyr0xnq+ z6N{Nz6HliywjGmBS`$-^&N@@A*74ObX{&`8>w3kho$9pd*bX*-bn0|!zwhiqusYs^ z-}&C>obR0TowNUVjQrwpQu5o>RFeST9iHPOFEk6npOIPqGLpp2ADk%}jEboPRxxeB zCYlB^Rl;^bOg|xr7KvO^C(H)2#EcWdz#7pCm@V1>?P4aNL(Gz#;u^^%W=rm2ooGLy z8ORYGpz(-Kz+BM{a3u9MuN7ye46a_FuMx~mX&1o@>q^N9)>S981C>VM zi~qz%(bou$e)z)x)lxYI5o_SD7WfU|Y7y(ewMwjqA^63OfYstAz?w;ow~2j^+^)Z& zfkfS~u#d<-6-{HUss$5fm?C5|k9wWX%~{r|{==FaAQjU{P!7nUz(Hw(7J?v`)oYrF zo9)SQu!l5HsAxKC(7MY|1 z08G6^A>l9qD$$u@7#~$kLer`NUF0!MhMhN(V$)#-tT?2dHw7l#-w0iEJS760jgFer?kOTo=?dkmFP&fA#6w30kGQD zG&C9tO9|gj(Dg7~+GgnZ75g0fAnjT@?^k;d9g(GrD%!$cO3!xl1+avrpcv?H?%Ne; z?{04CY^S~8{%!VYdPCCv*Oqr{c<(*f@owx`1(3|VV&wta+FN_t+LuGz2Ks{#B8z>T zQ4C@BWzVtm)-#)V1dN4afJV`d1jokZFT}GY<85oct+RhQ;65-8vnR9sy2^JnRn*Nc z*&?*eGmlxniE+M#`sI1CGg;Z% z{UA93ebyx>Fui7?{L7|bq$G0K+uqf)w>_|}19B*V_(68R-EZ_?*Hp(f2I`LO%T|$+ zuMS}1bMEVJ?r*0D!SxYvg)J3(#XgzXGW4r+Z{~i@Z5!*WtLb5IJjatBabnWp2*qA> zUL&M{J>+)#c)pFHaXGMmQkKFibHxc54@hz#(R~>B%j{kEBy_(gXCEO)*kw<A^WUuF5hGQk?wb=RAOKBY( z9U31Ul%>|*R(daZ{GPp)w+}k@<=;U_I(wj?#*zo(8(ILGhG1oH7UYs3`+LE=R$jb~_3k0E)4FVn`a3M?yjB zL?I4>-i|N;;8iK9nBkG&fxy@x9XvuOLAo+ycA(s&Jr9ykVyDV?t6|*lS6a#1pQ8KE z5FQ6mNKny)WoayolYn}K=Z0DQZtYXZvnu~EIL`S?i8&nvBf?g2yvW|Hu617m-fN(j zp`lMBJcEEi>Cc&`rjF#Wy)_=~^C0lC$(jeFSX>p&!O*BUl)SM(APBhYk-s?y@Q4sm z9n(fsA~_5*raBp9iEmmJ5ssxqgoGxnj}WjUD|V`7yFNk2sqjz6*!+u-h#Eq((P~Fj z9Z`#_!{9(wqG}pB_2D+osgdgwyqa!`@n|Z*4Z#BQ)F^h?$5oa7KwocjS71j^XIr4H zofiScwOZ5H+_k&2y>D4bOE3;km4+r#A4SP80Tg|B@W|LGY<3NBiPWRmIRqOo5QYT} zBn<+?AsQH_(p~grFxUvSK0E}(j1bqGXCkNNxw{^oTud*S)x`B_Gts${vwI%(T_~L| zZG72uW$@MX#q`p7L+N5##`lZnOlPA9p4OZTF4$||wr+Skt!`#JIGxToesA1ro7E$o zdHiVHx&~;ob*7v0EAcrTmre=}?jMyDBOlrk*w#wQ>QN>Ye1Q$%u>9$O;0rteNqt0! zie%alQB!TiAgZP^1pzn>=hR6~ON|l3t(9Mq)<$$QI(cQKr*#n>EL~zD)tu8L7g7V9 z9`=WRWq)9b`8OTagIJq1)K2Rmh;9l}I&DNbr%b`#hyY#T$P-RNgaE%Xt7#HZ0ncA< zXn>n@)t-WKF6xs#=%>LKhLIR1nI=(SbxEZT1Fcf3fV(v`&f$PW!xSVCf*O&Vf?W-R zCDW#eA!3|L0gVZ9+AQOS<)4h@h<}&B1Hb8%ND9~EYex{|L<3aBz_ylTIhNJ`uQh(H z*7UVnGip;)WGfE}a43tNX|UayvOFj_Yo_E`GlQBRIQk+|{FK0?pxPju1i0}zfY+>8 zlILw(XY+P`9O+AF@+*WV5Mr#Zt}$AO!Y+ zEkbGEoN8D z?ueVS=FK^a4*%@Vc+~8iHy12=8fSarX4~n(Q;qR#JDS)|??2TP&vtP0IdW=q+~EX! zbJm;=2jR#?#yPhK8BZ>HJLmeZne*eG0$^+fXZsgy-V1{Z*7Z;Ccusz%XCb2vhvS;n zeVCqk`tApg!U)rgXV}I1Mz&C&$^KpMf&0b2(WPrrpdMe??*a?-~&+9aIvqx_fVFSys$g) zUaEmP!V?AaD8ArtJ4){V(4Uz8G8K7TKL z1QE{1>}^F5A-1{wNi}$Xvcm(Hqq)OJe#7cJsvz{Cj$Orgzj_HDvsXBv~1eL@aY@pHCH;HM|prJb&(`_N9`)zclQ-Rq~vSGc;pmGl?}x{fe|5C`xY zDV9z}9Sq$=A7koWq4j@59nU|Xj|NycIa?El#+*zUf1CXWR99o?c0Ek8_}#M=c(0+m zySu-CTX(m&mTm3YQo&an`=H|p{RrI%hY+qJBuW8NSJ;zX+0i$Uyj3Z%{v~!!8B+BK z4G4VG1cAar5E_(eD@ySf5A8(gMZljB6rcSxfUqAyLO6(U7y+NE{Gpk6w(UKI{CNOH zvp*CXrB5OMJi^NeZz14*qqt=#W`Vj8coOhM`kA2-F5U4_X*1P8If4H|_*r(cyT=;0 zIpzgR+>> eMJi1wtGJo&0P>#^;so4WK&&@+5<9W*>HH53WFAHU delta 3520 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 H#GC&E|BN_@ diff --git a/__pycache__/device_interaction.cpython-312.pyc b/__pycache__/device_interaction.cpython-312.pyc index 708036d896ae9b051348cfb7139a4709c6b58e91..9703250977f0fd345def56da9f31d7f0efdfe1e7 100644 GIT binary patch delta 1025 zcmZ`%OH30{6rBeQZD(3q+9}g^rqd}Q5~7Jv0WB&Ye<1RaPlBMPEwl)vfKF>7rUrCX z6Bj0TL3BlQMKA_aO;~7xI}$fDvS`yZF(!nC8ws*5wCql6AGLxOo#v_k(8*_mevI^Vrx7Gd1%hYp5=lv#pr$Ocjd>aiP2Y}2V%hTrWnwlOt|?N^ z;N6w81SA3;0x|(IM~zJ};z!oecEMj)>kAC@w{-_Pdb=(FYZV38SSUIcIP4u5pH%|m zO5_eavASWeT!w1vI4oNmkO{t6yX9tL+(Mw0Ks|w@7-A+2vMfWBO`h)~39{z!5iU?) zb(RdvsjQfD2x&*X=BQ6z&ak}7dY0PNs*@SBQ#E^YZaMAtX>Q+BCMQT~!LJGawd(bz zjk!%>IN6os_%!F!INw^;hC{s>%CuZjhk|>>$Ucf58+J-5qoA^tImw%rTIV&XHQAeC zZ7M4)=~Vf|zdP`*G+(Fjb*t5DP3!kI`K!r}LVb=XK8^R0gk5FbOI2#6FXt4~&IZld zusX3`vOcR01vZ_*WM`owFE(n<#$;zD2aN~g#l)Fb)Qc~fZ)d*my>DjT?8{?M zj`-esy*xwWns|S9Rb2B${m2EEJweZ12g58eCAKUW3?McJ31JvsaTw-=E(q}$o(dv- z=7O*($Z(RZe+XXqgo0vQ$ys8vsKmW+R9R}xFn3(A#&-FclB-HwX&}bH&>x67j1YYF z#6b&Ski8u!3O(Lv++A`n9yj8xREEj68E9`lmw*j74!f(rnXL04O{SXmM_V98S(ak8 ztyNF9{p;Gk=Yg2p|K*chdNS$QY1i`Vm3eK)W$3eNer8^SdZ*YP&^^Q#j^b|k-iblQ zSEJIjuBnEW85Awe|@~(XP%$h>K89o_*P0&9kj&3 z3U3RzAt;uhtlV0c>KXHrYR(()gq!74cI}z?0kMIXkCI>EBU21H1AF8$zAm2BEtf{{op- ByjTDL diff --git a/__pycache__/gui.cpython-312.pyc b/__pycache__/gui.cpython-312.pyc index d94c7f27b15c8db888ffdb86e0702345bac14ff0..85b68723c87e492d9460722a217482e2a0c3ff84 100644 GIT binary patch delta 1639 zcmbu9ZA@EL7{~8vOA%HI)xNB(&YAfvkbVs1zL+m zHis`$h9~n~af#7r8~34^Tbwb|4<<$v?}CX-{oofrZHZYjzqsh)d0H-1;|CK@a)0MJ z&+~uIx#yhwT4tAn`r`VM^qF*Jdu_-+F%=Ai>>a6}^DTMA zmHI=|N48WlsggZ+Zkkh%YR!7OyiHF=X`|6WSIq`mTCv06hLVJWNmxseY!4pVZ*b6y z6$P~2*iN-p1M$*pRx>$F_gPK!ElVp2QcY!9{Bbw}`N^XRRW?st&*!-DVAhjMaY`Ps ztYa*X|BrdXM&1A%Nghw&hFBX>#z)HLRXK}_*+4F13K&dokvEv5oyk>YZ8*V{>s!cC z{@bj|%&eaEbITF`ziCx4NDHeR#79d?O!Rxp1A4HEbMl)C3K%*`z)x@M%=Ds7uY5v` z(ycZpiBfllXEXfTR*6yFxEPf)K{2d=C+U#Qt_%LdJHfmL`jfVr7FQedPQqkzivC(v z6Su;2QYoL?NMX(vWAdzW=FJ(9XteMr@n*0@;}cm)51YZ3xcZGG;rK3yyi zJ=t1`>NW)H9(vH>CIPzYs9^lc@v(lCEo)Z@9jp@`%-W-Lp>CdZr|#87l&vODkJrb_ zv)_kB>T?}>sK@8+IqFT9{ypGfl7l^-Oe{6is3V1+;FRnM-Ab)A{aHYlJB$=Mbp^-P zocvnrfaIs~4g(e2jMfkN3%u0Wb**{L*8AP0biyaOhNR)h50>a{B{9e7Qs=uGzoMU* zy?K(#@Y`^zX>X^RjM0hiwwhsFIOc(VEfq-WW|1W)q4+tjIeL%1FSmV=ZE+E2)XAp~s9SAHO z;WXk|#B+!t?U7yHH(->ypO0t*bo*(8N$rq5Hh!TnVBDPLJPW^ z8SdVP@4cnDQRQ+}WrA1`T|ljVP$^eg%4sW#h_}#u z8XwfCJVFygHpckKGtuCai4VqiLt?~NkNK!*V&WwG+i&N;JF_#H_Yc^{BGa$O#zqUg zbtcdD)gB7!liAl`?#fYD9^}bpFw6NM$OVuu7eaw-fkN2|7P$zlaxoOiHYj$LfX!ux z61f!Yav7A)3354an`m`pyQhF@EuWZaA_RA1^h z4frXmlwH8p1Vg-seux?z2PZ^?+HfS>@H-m_Cp>dPJI_x1&CEl8vJP;DPOi`tyty^* zw1C#f!cT(W@#0!`lIBz>25kujrl8AcU^23tB<96;MuScR|IOmGl&y&2vD`XrHS80i z6JO+5;(a?4C?a$XG3Z8HY6{kw65~(%#&G>Lv$31FwgDyh8uA*c(EdC^$;A@+#U)8p(L^bYjY zw>K(AdT$8}8!~2wsk}st5;MeQ;sBu#v&2Xwnwq^*xRg diff --git a/_device_main.py b/_device_main.py index 05dc422..814cc0b 100644 --- a/_device_main.py +++ b/_device_main.py @@ -105,6 +105,8 @@ def set_initial_params(): params['RampPatBase'] = 2 params['RampDacClk'] = '' params['RampTriangle'] = True + params['RampSramMode'] = False + params['RampSramSamples'] = '' return params def update_data_lists(): @@ -469,9 +471,12 @@ if __name__ == "__main__": dac_clk_mhz = parse_optional_float(values.get('-RampDacClk-')) dac_clk_hz = dac_clk_mhz * 1e6 if dac_clk_mhz is not None else None triangle = values.get('-RampTriangle-', True) + sram_mode = values.get('-RampSramMode-', False) + sram_samples = parse_optional_int(values.get('-RampSramSamples-')) dev.start_ramp_max(prt, freq_hz=freq_hz, duty=duty, saw_step=saw_step, pat_period=pat_period, pat_period_base=pat_period_base, - dac_clk_hz=dac_clk_hz, triangle=triangle) + dac_clk_hz=dac_clk_hz, triangle=triangle, + sram_mode=sram_mode, sram_samples=sram_samples) elif event == '-StopCycle-': window['-StopCycle-'].update(disabled = True) current_and_temperature_settings_available = True diff --git a/device_commands.py b/device_commands.py index ef71d54..f17eba5 100644 --- a/device_commands.py +++ b/device_commands.py @@ -16,6 +16,9 @@ AD9102_SAW_STEP_DEFAULT = 1 AD9102_PAT_PERIOD_DEFAULT = 0xFFFF AD9102_PAT_PERIOD_BASE_DEFAULT = 0x02 AD9102_DAC_CLK_HZ = None # set to actual DAC clock if you want freq->SAW_STEP conversion +AD9102_FLAG_SRAM = 0x0004 +AD9102_SRAM_SAMPLES_DEFAULT = 16 +AD9102_SRAM_HOLD_DEFAULT = 1 class TaskType(IntEnum): Manual = 0x00 @@ -307,44 +310,77 @@ def calc_pat_period_for_duty(saw_step: int, duty: float, pat_period_base: int, t pat_period = 0xFFFF return pat_period +def calc_sram_samples_for_freq(freq_hz: float, dac_clk_hz: float, hold: int = None): + if hold is None or hold <= 0: + hold = AD9102_SRAM_HOLD_DEFAULT + if freq_hz is None or freq_hz <= 0 or dac_clk_hz is None or dac_clk_hz <= 0: + return AD9102_SRAM_SAMPLES_DEFAULT + samples = int(round(dac_clk_hz / (freq_hz * hold))) + if samples < 2: + samples = 2 + if samples > 4096: + samples = 4096 + return samples + + def create_AD9833_ramp_command(saw_step: int = None, pat_period: int = None, pat_period_base: int = None, enable: bool = True, - triangle: bool = True): - if saw_step is None: - saw_step = AD9102_SAW_STEP_DEFAULT - if pat_period is None: - pat_period = AD9102_PAT_PERIOD_DEFAULT - if pat_period_base is None: - pat_period_base = AD9102_PAT_PERIOD_BASE_DEFAULT - if saw_step < 1: - saw_step = 1 - if saw_step > 63: - saw_step = 63 - if pat_period < 0: - pat_period = 0 - if pat_period > 0xFFFF: - pat_period = 0xFFFF - if pat_period_base < 0: - pat_period_base = 0 - if pat_period_base > 0x0F: - pat_period_base = 0x0F - + triangle: bool = True, + sram_mode: bool = False, + sram_samples: int = None, + sram_hold: int = None): flags = 0 if enable: flags |= 0x0001 if triangle: flags |= 0x0002 + if sram_mode: + flags |= AD9102_FLAG_SRAM - param0 = ((pat_period_base & 0x0F) << 8) | (saw_step & 0xFF) - crc_word = flags ^ param0 ^ pat_period + if sram_mode: + if sram_samples is None: + sram_samples = AD9102_SRAM_SAMPLES_DEFAULT + if sram_samples < 2: + sram_samples = 2 + if sram_samples > 4096: + sram_samples = 4096 + if sram_hold is None or sram_hold <= 0: + sram_hold = AD9102_SRAM_HOLD_DEFAULT + if sram_hold > 0x0F: + sram_hold = 0x0F + param0 = sram_samples & 0xFFFF + param1 = sram_hold & 0x000F + else: + if saw_step is None: + saw_step = AD9102_SAW_STEP_DEFAULT + if pat_period is None: + pat_period = AD9102_PAT_PERIOD_DEFAULT + if pat_period_base is None: + pat_period_base = AD9102_PAT_PERIOD_BASE_DEFAULT + if saw_step < 1: + saw_step = 1 + if saw_step > 63: + saw_step = 63 + if pat_period < 0: + pat_period = 0 + if pat_period > 0xFFFF: + pat_period = 0xFFFF + if pat_period_base < 0: + pat_period_base = 0 + if pat_period_base > 0x0F: + pat_period_base = 0x0F + param0 = ((pat_period_base & 0x0F) << 8) | (saw_step & 0xFF) + param1 = pat_period + + crc_word = flags ^ param0 ^ param1 data = flipfour(AD9833_CMD_HEADER) # Word 0 (header) data += flipfour(int_to_hex(flags)) data += flipfour(int_to_hex(param0)) - data += flipfour(int_to_hex(pat_period)) + data += flipfour(int_to_hex(param1)) data += flipfour(int_to_hex(crc_word)) return bytearray.fromhex(data) diff --git a/device_interaction.py b/device_interaction.py index 80f603b..e7877e8 100644 --- a/device_interaction.py +++ b/device_interaction.py @@ -112,21 +112,32 @@ def send_task_command(prt, sending_param): -def start_ramp_max(prt, freq_hz=None, duty=None, saw_step=None, pat_period=None, pat_period_base=None, dac_clk_hz=None, triangle=True): - # Start AD9102 sawtooth with configurable frequency/duty (via SAW_STEP and PAT_PERIOD) - if pat_period_base is None: - pat_period_base = cmd.AD9102_PAT_PERIOD_BASE_DEFAULT - if saw_step is None and freq_hz is not None: - if dac_clk_hz is None: - dac_clk_hz = cmd.AD9102_DAC_CLK_HZ - saw_step = cmd.calc_saw_step_for_freq(freq_hz, dac_clk_hz, triangle) - if saw_step is None: - saw_step = cmd.AD9102_SAW_STEP_DEFAULT - if pat_period is None and duty is not None: - pat_period = cmd.calc_pat_period_for_duty(saw_step, duty, pat_period_base, triangle) - if pat_period is None: - pat_period = cmd.AD9102_PAT_PERIOD_DEFAULT - hexstring = cmd.create_AD9833_ramp_command(saw_step, pat_period, pat_period_base, enable=True, triangle=triangle) +def start_ramp_max(prt, freq_hz=None, duty=None, saw_step=None, pat_period=None, pat_period_base=None, dac_clk_hz=None, triangle=True, sram_mode=False, sram_samples=None, sram_hold=None): + # Start AD9102 sawtooth with configurable frequency/duty or SRAM ramp mode + if sram_mode: + if sram_hold is None: + sram_hold = cmd.AD9102_SRAM_HOLD_DEFAULT + if sram_samples is None and freq_hz is not None: + if dac_clk_hz is None: + dac_clk_hz = cmd.AD9102_DAC_CLK_HZ + sram_samples = cmd.calc_sram_samples_for_freq(freq_hz, dac_clk_hz, sram_hold) + hexstring = cmd.create_AD9833_ramp_command(enable=True, triangle=triangle, sram_mode=True, + sram_samples=sram_samples, sram_hold=sram_hold) + else: + if pat_period_base is None: + pat_period_base = cmd.AD9102_PAT_PERIOD_BASE_DEFAULT + if saw_step is None and freq_hz is not None: + if dac_clk_hz is None: + dac_clk_hz = cmd.AD9102_DAC_CLK_HZ + saw_step = cmd.calc_saw_step_for_freq(freq_hz, dac_clk_hz, triangle) + if saw_step is None: + saw_step = cmd.AD9102_SAW_STEP_DEFAULT + if pat_period is None and duty is not None: + pat_period = cmd.calc_pat_period_for_duty(saw_step, duty, pat_period_base, triangle) + if pat_period is None: + pat_period = cmd.AD9102_PAT_PERIOD_DEFAULT + hexstring = cmd.create_AD9833_ramp_command(saw_step, pat_period, pat_period_base, + enable=True, triangle=triangle) cmd.send_AD9833(prt, hexstring) time.sleep(WAIT_AFTER_SEND) status = cmd.get_STATE(prt).hex() diff --git a/gui.py b/gui.py index c0e1056..8ac9c2b 100644 --- a/gui.py +++ b/gui.py @@ -47,6 +47,8 @@ SET_RAMP_PATPERIOD_TEXT = 'PAT_PERIOD (1-65535):' SET_RAMP_PATBASE_TEXT = 'PAT_PERIOD_BASE (0-15):' SET_RAMP_DACCLK_TEXT = 'DAC clk (МГц):' SET_RAMP_TRI_TEXT = 'Треугольник' +SET_RAMP_SRAM_MODE_TEXT = 'SRAM режим' +SET_RAMP_SRAM_SAMPLES_TEXT = 'SRAM точки (samples):' GRAPH_POINTS_NUMBER = 100 # Number of most recent data points shown on charts @@ -228,6 +230,12 @@ def setup_gui(params): [sg.Text(SET_RAMP_TRI_TEXT, size=(SET_TEXT_WIDTH_NEW,1)), sg.Checkbox('', default=bool(params.get('RampTriangle', True)), key='-RampTriangle-')], + [sg.Text(SET_RAMP_SRAM_MODE_TEXT, size=(SET_TEXT_WIDTH_NEW,1)), + sg.Checkbox('', default=bool(params.get('RampSramMode', False)), key='-RampSramMode-')], + + [sg.Text(SET_RAMP_SRAM_SAMPLES_TEXT, size=(SET_TEXT_WIDTH_NEW,1)), + sg.Input(params.get('RampSramSamples', ''), size=(SET_INPUT_WIDTH,1), key='-RampSramSamples-')], + [sg.HSeparator(pad=H_SEPARATOR_PAD)], [sg.Button(SET_START_BUTTON_TEXT, key='-StartCycle-', disabled_button_color=("Gray22", "Blue"), disabled=True), sg.Button(SET_STOP_BUTTON_TEXT, disabled_button_color=("Gray22", "Blue"), key='-StopCycle-', disabled=True), sg.Button(SET_RAMP_BUTTON_TEXT, key='-StartRamp-', disabled_button_color=("Gray22", "Blue"))]]