From db2f76771ae5c86c52a6e422ec91ab716dfe305c Mon Sep 17 00:00:00 2001 From: linuswck Date: Fri, 21 Jun 2024 16:52:43 +0800 Subject: [PATCH] Update Kirdy Driver Example Code --- pykirdy/asyncio_exmaple.py | 175 +++++++++++++++++++++++++++------- pykirdy/driver/kirdy_async.py | 5 - 2 files changed, 139 insertions(+), 41 deletions(-) diff --git a/pykirdy/asyncio_exmaple.py b/pykirdy/asyncio_exmaple.py index 9d61366..58cd27a 100644 --- a/pykirdy/asyncio_exmaple.py +++ b/pykirdy/asyncio_exmaple.py @@ -1,45 +1,148 @@ -from driver.kirdy_async import Kirdy +from pprint import pp +from driver.kirdy_async import Kirdy, FilterConfig import asyncio +import signal + +""" + Enter Device Firmware Upgrade(Dfu) mode + Please see README.md for flash instructions. +""" +async def enter_dfu_mode(kirdy: Kirdy): + print(await kirdy.device.dfu()) + await kirdy.end_session() + exit() + +""" + Configure Kirdy to actively report status + Press Ctrl + C to exit active report mode +""" +async def active_report(kirdy: Kirdy): + class SignalHandler: + def __init__(self): + signal.signal(signal.SIGINT, self.exit_gracefully) + signal.signal(signal.SIGTERM, self.exit_gracefully) + def exit_gracefully(self, signum, frame): + kirdy.stop_report_mode() + + signal_handler = SignalHandler() + + async for data in kirdy.report_mode(): + pp(data) + +""" + Configure Kirdy network and board specific transconductance settings. + These configs are saved to flash immediately after command is processed. +""" +async def device_cfg(kirdy: Kirdy): + # Kirdy rev0_3's gain and transconductance varies between boards to maximize the + # PD current range resolution. + await kirdy.device.set_pd_mon_fin_gain(1.0) + await kirdy.device.set_pd_mon_transconductance(1/1000.0) + + # Network Settings will be updated on next reboot. + await kirdy.device.set_ip_settings( + addr="192.168.1.128", + port=1337, + prefix_len=24, + gateway="192.168.1.1" + ) + # Hard reset Kirdy. + await kirdy.device.hard_reset() + await kirdy.end_session() + exit() + +""" + Control and config laser diode and thermostat parameters. +""" +async def ld_thermostat_cfg(kirdy: Kirdy): + # Load the laser diode and thermostat settings from flash + await kirdy.device.restore_settings_from_flash() + + # Power off the laser diode and thermostat and clear alarm (if any) + await kirdy.laser.set_power_on(False) + await kirdy.laser.clear_alarm() + await kirdy.thermostat.set_power_on(False) + await kirdy.thermostat.clear_alarm() + + # Set the laser diode terminals not to be shorted + await kirdy.laser.set_ld_terms_short(False) + + # Do not power up the laser & thermostat during initial startup + await kirdy.laser.set_default_pwr_on(False) + await kirdy.thermostat.set_default_pwr_on(False) + + # The laser diode output current range is bounded by this software limit setting + await kirdy.laser.set_i(0) + await kirdy.laser.set_i_soft_limit(30.0 / 1000) + + # Configure the laser diode output power limit and photodiode parameters + # Exceeding the measured power limit triggers overpower protection alarm. + # The laser diode power will be turned off while the thermostat power remains unchanged. + await kirdy.laser.set_ld_pwr_limit(0.0) + await kirdy.laser.set_pd_mon_dark_current(0.0) + await kirdy.laser.set_pd_mon_responsitivity(0.0) + + # Configure the thermostat NTC thermistor parameters. + await kirdy.thermostat.set_sh_r0(10.0 * 1000) + await kirdy.thermostat.set_sh_t0(25) + await kirdy.thermostat.set_sh_beta(3900) + + # Configure the thermostat output limits. + # The actual output current is limited by the hardware limit set below. + await kirdy.thermostat.set_tec_max_cooling_i(1.0) + await kirdy.thermostat.set_tec_max_heating_i(1.0) + await kirdy.thermostat.set_tec_max_v(4.0) + + # Configure the thermostat temperature monitor limit. + # Exceeding the limit will trigger over temperature protection alarm. + # The laser diode and thermostat power will be turned off. + await kirdy.thermostat.set_temp_mon_upper_limit(70) + await kirdy.thermostat.set_temp_mon_lower_limit(0) + + # Configure the thermostat PID related parameter. + # You can configure the PID parameter with the autotune tool. + # Here provides an example if it is configured manually. + await kirdy.thermostat.set_temperature_setpoint(25) + await kirdy.thermostat.set_pid_kp(0.15668282198105507) + await kirdy.thermostat.set_pid_ki(0.002135962407793784) + await kirdy.thermostat.set_pid_kd(0.829254515277143) + await kirdy.thermostat.set_pid_output_max(1.0) + await kirdy.thermostat.set_pid_output_min(-1.0) + + # Configure the thermostat ADC Filter Setting / PID Update Rate / Report Rate. + # The ADC sampling rate determines the report and pid update rate. + # The chosen filter and sampling rate affects the noise of the readings. + # For details, please refer to the AD7172 datasheet. + await kirdy.thermostat.config_temp_adc_filter(FilterConfig.Sinc5Sinc1With50hz60HzRejection.f16sps) + + # Configure thermostat to run in PID control mode + await kirdy.thermostat.set_pid_control_mode() + + # When control mode is switched from PID to constant current(CC) control mode, + # the thermostat keeps its instantaneous output current unchanged. + # Thermostat output current should only be set if it is in CC control mode + # or the value set will not be overwritten by PID output. + await kirdy.thermostat.set_constant_current_control_mode() + await kirdy.thermostat.set_tec_i_out(0.0) + + # Save the above settings configured into the flash + await kirdy.device.save_current_settings_to_flash() + + # Power on the laser diode and thermostat + await kirdy.laser.set_power_on(True) + await kirdy.thermostat.set_power_on(True) + + pp(await kirdy.device.get_settings_summary()) + pp(await kirdy.device.get_status_report()) async def main(): kirdy = Kirdy() await kirdy.start_session(host='192.168.1.128', port=1337, timeout=0.25) - await kirdy.device.set_active_report_mode(False) - await kirdy.laser.set_power_on(False) - await kirdy.laser.clear_alarm() - await kirdy.laser.set_i(0) - await kirdy.laser.set_i_soft_limit(0.25) - await kirdy.laser.set_power_on(True) - - await kirdy.thermostat.set_power_on(False) - await kirdy.thermostat.clear_alarm() - - await kirdy.thermostat.set_sh_r0(10.0*1000) - await kirdy.thermostat.set_sh_t0(25) - await kirdy.thermostat.set_sh_beta(3900) - - await kirdy.thermostat.set_temperature_setpoint(25) - await kirdy.thermostat.set_temp_mon_upper_limit(40) - await kirdy.thermostat.set_temp_mon_lower_limit(10) - - await kirdy.thermostat.set_pid_kp(0.15668282198105507) - await kirdy.thermostat.set_pid_ki(0.002135962407793784) - await kirdy.thermostat.set_pid_kd(0.829254515277143) - - await kirdy.thermostat.set_pid_output_max(1.0) - await kirdy.thermostat.set_pid_output_min(-1.0) - - await kirdy.thermostat.config_temp_adc_filter("Sinc5Sinc1With50hz60HzRejection", "F16SPS") - await kirdy.thermostat.set_power_on(True) - await kirdy.thermostat.set_pid_control_mode() - - await kirdy.laser.set_default_pwr_on(False) - await kirdy.thermostat.set_default_pwr_on(True) - await kirdy.device.save_current_settings_to_flash() - - async for data in kirdy.report_mode(): - print(data) + # await ld_thermostat_cfg(kirdy) + # await active_report(kirdy) + # await device_cfg(kirdy) + await enter_dfu_mode(kirdy) await kirdy.end_session() diff --git a/pykirdy/driver/kirdy_async.py b/pykirdy/driver/kirdy_async.py index d6f3e60..aba9b94 100644 --- a/pykirdy/driver/kirdy_async.py +++ b/pykirdy/driver/kirdy_async.py @@ -129,16 +129,11 @@ class FilterConfig: def _filter_type(self): return "Sinc3" - ############## Rewrite class Sinc3WithFineODR(): def __init__(self, rate): assert rate >= 1.907465 and rate <= 31250 self.rate = float(rate) - # def rate(self, rate): - # assert rate >= 1.907465 and rate <= 31250 - # return float(rate) - def _odr_type(self): return "sinc3fineodr"