From 12cf9d67166ee4969800adff68db1e6acab3687a Mon Sep 17 00:00:00 2001 From: Ayzen Date: Wed, 18 Feb 2026 16:04:20 +0300 Subject: [PATCH] added dac --- __pycache__/device_commands.cpython-312.pyc | Bin 25281 -> 26739 bytes .../device_interaction.cpython-312.pyc | Bin 9786 -> 10267 bytes __pycache__/gui.cpython-312.pyc | Bin 23170 -> 24253 bytes _device_main.py | 32 ++++++++++++++- device_commands.py | 38 ++++++++++++++++++ device_interaction.py | 7 ++++ gui.py | 16 ++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) diff --git a/__pycache__/device_commands.cpython-312.pyc b/__pycache__/device_commands.cpython-312.pyc index 11be430620df9ceee82daa235398fc6d5e9f3439..05daedef29b748b6102b6cd126db318f3bcf882b 100644 GIT binary patch delta 5318 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 delta 4260 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 delta 290 zcmbOou*-+fB#t9SE6HEnDxLO#axKo5uxPdfJif{@KkmgMh zN#O<3d?|b_3{m_k{6JD5MF2<&Rx)aeZak7HviYajd`8xIpo!Bq&y|Q{Vv7PYi=rnp zN@uEpM2nO`gf@`SWG@l{u@gZ=5{O6!5h;@=NZYgK0GSImUy+t(Vl4tPH*fwT`;wV4 zb@Dw$cgFpj)s)^d3YP-KZ!zbj=4mqBVo6CXNi3?Etf3;q+5;5dx7kyrkcqV)$b3F| zzna11Pii8JLX+9m{Y1fz02yBdGPnq&x~PA0zPc3GBp{O!h>NQyPgYNx{7+pL0Get` AZvX%Q diff --git a/__pycache__/gui.cpython-312.pyc b/__pycache__/gui.cpython-312.pyc index a11ad81ac1d5c0be61246da1465243b8eb656dd5..2f446a1eff3c59387f994d5c94792ca877d945b8 100644 GIT binary patch delta 2185 zcmai#drVVT9LIZG-j8C1(Fd<$F<7Lf2&g=iN1+dBp{xb*POZp61wr&uP-+nYhnrIr zk8a|0=-j4AvpG99;)c5S7F~9kT}GIi&3_iNEFqcMA4`_({CZm#@sHi4pZh!C-}9c_ zdpa;lO;1z8+tJYxJaYAXbgIQ>9T7?>%SigqeRM9$rSni8y%MdYSD{sntI=vYALY{p zh({Nq0=ftl(rZu=y%w#Zi_u!T1QpYzsHCwBl{RWo8C{OFbOkD>b*O^Yle+=wXd}|o zmB>I>A>%iI3jZB0!J(SY?2&VDurh>xyoH16LIcJ5uyi_Y+W+}~8c4ZJB zdyc)z-kdowbBz6von)ukDR$BqLL%hL*b|v@jat1zou@45l0f*ynf{ppk}}QSV6U-L zGXpb6AiOIEoM(vmK_I)}5hB_+pW%}m!}kn^rw3Dwo(Z8_Kn>xB#aH-0$Z=ytrbiR2 zkl`3b95sM{S)#>bs&KqL%`Di4wqtdMm}V~sk=?y{LV(>$C5~2y zT*~w9;iwG1KiyN|&g|49gjalRhMh+B;LS1~+ zO$OM5gR+#=UaZbiiCzt~W%#IPCxx6?o-D;Tv*JYi9H#?5#NWzCE}X1Uih38Q`+aKP z0`-7T?O&h{_|(A#>Or6S;sSLD-_g_tA3`s=U&eAxdO`|1>=p!eVq1j6zXd#A>lwT| zA~yULbOaqnN8Q8tK(>@Ri$#`L#T$Y7T_NP@kGUxF?8hfUIJGy_720|Ma$`r((LiO2 z=L)s*lqWoYWe*11<|4?;S>D)G-_ho93N&hsGfMTJqH;#6tj!KiP|ZbghSkyN=<0Na zY2;b*TupwSQ|M3O94b%GDhn0YPlizP86&wdCeH51_gD8)wVoI9PX=w0Su1RI-)Cee zFTLGbp|u%ns_nLl2HTwYXqo(=N}$HHB2bVz0E2l@!e{@5aBE2kPYFRIM&7j|(jzMfZdka*Gnm*P>S!P8uK5)e!!q zvm|iN=c$ENt;AoZuO=MPR}tRVD+norp3vyyh`~VYIUf~9u-kl`G(yZjMnf1^yPi*G zO2KWFP~do_VF@R1;V*32#OFL)`S@2uJYG~4LK4JPPfs$^+wpRtYqK3-S6Mx^NUBt-qZqbnT@Th zXG_<4r49F_31dV(AAd=9L3X)%s`75Co;7b|QL9(F1A4Sm^NJ>ak?qgS-s1PP;crbh zqT0C?8}!^`#)Hj;A><(b-kL|baIj4tass}ElX$r;A>=hMPh*o!9sGcpwVpoPA->o$ z7p-HOo2@PFyV{!dbw&pMCz$VW(z=vBIC+^-0GzAL8Nlm+C4i%Va{xFJmW22Ais7sd_dyMXrqR{`$>t^qvww{=Oa*TMW4 z@D1P-zzx7nz%9V1fX@J*1HJ%YKso@vSLPmo+b*!U-2w~#Ll`*GncLXXP?7;(I0HL4 z&SP@H&LQ|atf;*Mb+t9GWge0x9HgDIp6d-clw>wZ&GKZkG9Akk&nB*9dD7WL6(Rm( T{ZLE~pIZFq-e4gW@2mAM6&QUM delta 1393 zcmZwG?N3`}6aer(w{O4(2yHFhWT=xMh^$=;+h|7%4BFB+mTi&TGB=XLkV-eWWxCCF zAZ+Ya0zQbM)9HNM*7{+&?t?}qn3yFl(`k&^bov(yhcAGUl1C`YG1q0Ebu)^RcwcCq8HkZsYD;NqkizB z9pFO)hgr2>PO|(w`Oo}%E!!>E7H8CKjNd7}Ec~`kK5mGt;pb|NhB3NB`avJ;0e$9~ zw1zL%R`S}q`~pn$V=A_k`l_x#`z-9q?ByjJ4gB5)e`Cl(n3l=0g<*wHo65 ziq*u<^2JI6+s|z_6IOo5%>U)FqgV@Z(1SiHzyZA8An&(Tvmw6QWaa~QQ|a*J@?|6e zr2PyM{9D_TCBws0%Xtv?32>0x>?UsAU?_#>a!Svyln&*T4zHAs#mpGasY+b|N9fGF|L(2Hg+=O2v({E$&V)~ zsKg_D)|p}<+31?l$cE-Rw(1)!OyiMgct8%e*wrk?N88-!LfcW)-5x?;YNvR$mtryN zMQ_*=W0pg@`!%XH51lWcE6=#Uw>WQ=x$Zp?2SC#=#B? zy00UQUhN2=EU+G}40zFaz^hmGmv|`XQ716>Z@`CogXC1!J3(6eNQg4AkUvl9=oa`? z#LT}7)nNLc5M9O`rmdY}-_oXoygBSq4+$}TGwfTdv?YbyCrM%58llde5eIrI(u&@U zSeAC#$!~XFTfIx2?Z2fl-52Ex+nqW#%71yPo*m)Fu7`E>W=b#f#;&!xS16q2(XKk} zZ48^`$*vQEIrw8?yVTpeqdz`4(Cgjhm&$0_bzU2-7@@C9dX+d!yhh9sj}m8yH;8k@ zdE!mtE#htB9pVD STM32_DAC_VREF: + voltage_v = STM32_DAC_VREF + return int(round((voltage_v / STM32_DAC_VREF) * STM32_DAC_MAX_CODE)) + + def initialize_ds1809_position(prt, default_step): default_step = clamp_int(int(default_step), 0, DS1809_MAX_STEP) @@ -154,6 +167,8 @@ def set_initial_params(): params['Ad9833Triangle'] = True params['DS1809Step'] = DS1809_DEFAULT_STEP params['DS1809Status'] = format_ds1809_status(DS1809_DEFAULT_STEP) + params['PA4DacVolt'] = str(PA4_DAC_DEFAULT_VOLT) + params['PA4DacStatus'] = f"0 / {STM32_DAC_MAX_CODE}" return params def update_data_lists(): @@ -570,6 +585,21 @@ if __name__ == "__main__": params['DS1809Step'] = ds1809_step params['DS1809Status'] = format_ds1809_status(ds1809_step) window['-DS1809Status-'].update(params['DS1809Status']) + elif event == '-SetPA4Dac-': + voltage_v = parse_optional_float(values.get('-PA4DacVolt-')) + if voltage_v is None: + print('Invalid PA4 DAC voltage value.') + else: + if voltage_v < 0.0: + voltage_v = 0.0 + if voltage_v > STM32_DAC_VREF: + voltage_v = STM32_DAC_VREF + dac_code = voltage_to_dac_code(voltage_v) + dev.set_stm32_dac(prt, dac_code=dac_code, enable=True) + params['PA4DacVolt'] = f"{voltage_v:.3f}" + params['PA4DacStatus'] = f"{dac_code} / {STM32_DAC_MAX_CODE}" + window['-PA4DacVolt-'].update(params['PA4DacVolt']) + window['-PA4DacStatus-'].update(params['PA4DacStatus']) 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 14a0ffa..db9a6d3 100644 --- a/device_commands.py +++ b/device_commands.py @@ -16,6 +16,8 @@ AD9833_CMD_TOTAL_LENGTH = 10 # Total bytes when sending AD9833 command AD9833_CMD_HEADER = "9999" DS1809_CMD_TOTAL_LENGTH = 10 # Total bytes when sending DS1809 UC/DC pulse command DS1809_CMD_HEADER = "AAAA" +STM32_DAC_CMD_TOTAL_LENGTH = 10 # Total bytes when sending STM32 DAC command +STM32_DAC_CMD_HEADER = "BBBB" AD9102_SAW_STEP_DEFAULT = 1 AD9102_PAT_PERIOD_DEFAULT = 0xFFFF AD9102_PAT_PERIOD_BASE_DEFAULT = 0x02 @@ -31,6 +33,9 @@ AD9833_MCLK_HZ_DEFAULT = 20_000_000 DS1809_FLAG_UC = 0x0001 DS1809_FLAG_DC = 0x0002 DS1809_PULSE_MS_DEFAULT = 2 +STM32_DAC_FLAG_ENABLE = 0x0001 +STM32_DAC_CODE_MAX = 4095 +STM32_DAC_VREF_DEFAULT = 3.3 class TaskType(IntEnum): Manual = 0x00 @@ -203,6 +208,17 @@ def send_DS1809(prt, bytestring): print("Sent: DS1809 pulse command.") +def send_STM32_DAC(prt, bytestring): + ''' Set STM32 internal DAC output on PA4 (0xBBBB + ...). + Expected device answer: STATE. + ''' + if len(bytestring) != STM32_DAC_CMD_TOTAL_LENGTH: + print("Error. Wrong parameter string for STM32 DAC command.") + return None + prt.write(bytestring) + print("Sent: STM32 DAC command.") + + # ---- Getting data @@ -496,6 +512,28 @@ def create_DS1809_pulse_command(uc: bool = False, return bytearray.fromhex(data) +def create_STM32_DAC_command(dac_code: int, enable: bool = True): + if dac_code is None: + dac_code = 0 + if dac_code < 0: + dac_code = 0 + if dac_code > STM32_DAC_CODE_MAX: + dac_code = STM32_DAC_CODE_MAX + + flags = STM32_DAC_FLAG_ENABLE if enable else 0 + param0 = int(dac_code) & 0x0FFF + param1 = 0 + crc_word = flags ^ param0 ^ param1 + + data = flipfour(STM32_DAC_CMD_HEADER) # Word 0 (header) + data += flipfour(int_to_hex(flags)) + data += flipfour(int_to_hex(param0)) + data += flipfour(int_to_hex(param1)) + data += flipfour(int_to_hex(crc_word)) + + return bytearray.fromhex(data) + + def encode_Input(params): if params is None: diff --git a/device_interaction.py b/device_interaction.py index ceb721e..fb570b0 100644 --- a/device_interaction.py +++ b/device_interaction.py @@ -147,6 +147,13 @@ def start_ad9833_ramp(prt, freq_hz=None, mclk_hz=None, triangle=True, enable=Tru return _print_state_reply(cmd.get_STATE(prt)) +def set_stm32_dac(prt, dac_code, enable=True): + hexstring = cmd.create_STM32_DAC_command(dac_code=dac_code, enable=enable) + cmd.send_STM32_DAC(prt, hexstring) + time.sleep(WAIT_AFTER_SEND) + return _print_state_reply(cmd.get_STATE(prt)) + + def _wait_for_min_bytes(prt, expected_len, timeout_s, poll_s=0.01): deadline = time.time() + timeout_s while time.time() < deadline: diff --git a/gui.py b/gui.py index 6bdeddf..05484b5 100644 --- a/gui.py +++ b/gui.py @@ -59,6 +59,10 @@ SET_DS1809_SECTION_TEXT = 'DS1809 (UC/DC)' SET_DS1809_UC_BUTTON_TEXT = 'UC импульс' SET_DS1809_DC_BUTTON_TEXT = 'DC импульс' SET_DS1809_STATUS_TEXT = 'Позиция DS1809:' +SET_STM32_DAC_SECTION_TEXT = 'STM32 DAC (PA4)' +SET_STM32_DAC_VOLT_TEXT = 'Напряжение DAC PA4 (В, 0..2.5):' +SET_STM32_DAC_BUTTON_TEXT = 'Установить DAC' +SET_STM32_DAC_STATUS_TEXT = 'Код DAC PA4:' GRAPH_POINTS_NUMBER = 100 # Number of most recent data points shown on charts @@ -295,6 +299,18 @@ def setup_gui(params): sg.Text(params.get('DS1809Status', '--'), key='-DS1809Status-', size=(20,1))], [sg.HSeparator(pad=H_SEPARATOR_PAD)], + + [sg.Text(SET_STM32_DAC_SECTION_TEXT, size=(SET_TEXT_WIDTH_NEW,1))], + + [sg.Text(SET_STM32_DAC_VOLT_TEXT, size=(SET_TEXT_WIDTH_NEW,1)), + sg.Input(params.get('PA4DacVolt', '0.0'), size=(SET_INPUT_WIDTH,1), key='-PA4DacVolt-')], + + [sg.Button(SET_STM32_DAC_BUTTON_TEXT, key='-SetPA4Dac-', disabled_button_color=("Gray22", "Blue"))], + + [sg.Text(SET_STM32_DAC_STATUS_TEXT, size=(SET_TEXT_WIDTH_NEW,1)), + sg.Text(params.get('PA4DacStatus', '0 / 4095'), key='-PA4DacStatus-', size=(20,1))], + + [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")), sg.Button(SET_AD9833_BUTTON_TEXT, key='-StartRamp9833-', disabled_button_color=("Gray22", "Blue"))]]