From e18befa26da6032e883f94f7a0ab73d4fbb50a40 Mon Sep 17 00:00:00 2001 From: chain40 Date: Tue, 25 Jun 2024 00:45:12 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E4=BF=AE=E6=AD=A3=20cycle=20iv=20mod?= =?UTF-8?q?e,=20OUT1=20=E9=9B=BB=E5=A3=93=E4=B8=8D=E6=9C=83=E5=8B=95?= =?UTF-8?q?=E7=9A=84=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) 原本的 p->mV_output += p->dir * p->step; 因為整數跟浮點數混合運算, 會發生錯誤!所以導致 OUT1 電壓固定 --- edc20_cycle_iv_mode.c | 80 +++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/edc20_cycle_iv_mode.c b/edc20_cycle_iv_mode.c index d1a4fa1..330b0d9 100644 --- a/edc20_cycle_iv_mode.c +++ b/edc20_cycle_iv_mode.c @@ -114,13 +114,13 @@ static ret_code_t _send_data_packet(elite_notify_packet_t *p_notify_buf, bool is typedef struct { - int32_t dir; + float dir; float mV_output; float mV_max; float mV_min; float mV_start; float mV_stop; - uint32_t step; + float step; uint32_t cycle_cnt; uint32_t cycle_max; uint32_t fullscale; @@ -168,13 +168,12 @@ static uint32_t mV_out_1(cycle_iv_dac_t *p) static uint32_t cal_dac_timer_interval(elite_dac_config_t *p_config, cycle_iv_dac_t *p_cycle_iv_dac) { - const float STEP_TIME_FACTOR = 2.0f; uint32_t intvl; - uint32_t step_time = p_config->uS_step * STEP_TIME_FACTOR; - for (uint32_t intvl = 100; intvl < 1000000; intvl *= 10) + float step_time = p_config->uS_step; + for (intvl = 100; intvl < 1000000; intvl *= 10) { p_cycle_iv_dac->step = (p_config->mV_step * intvl) / step_time; - if (p_cycle_iv_dac->step) + if (p_cycle_iv_dac->step >= 0.001) { return intvl; } @@ -295,45 +294,44 @@ static void edc20_cycle_iv_mode_task(void *p_arg) NRF_LOG_INFO("%s", info); } - dac_write_through(OUT_0, mV_out_0(&dac_param)); - dac_write_through(OUT_1, mV_out_1(&dac_param)); - circuit_selection_dac_fune_tune_f0(); + dac_write_through(OUT_0, mV_out_0(&dac_param)); + dac_param.mV_output = dac_param.mV_start; + dac_write_through(OUT_1, mV_out_1(&dac_param)); + circuit_selection_dac_fune_tune_f0(); + /* start DAC timer */ + edc20_dac_tim_start(cal_dac_timer_interval(&mode_param.config, &dac_param), _callback, &dac_param); - - /* start DAC timer */ - edc20_dac_tim_start(cal_dac_timer_interval(&mode_param.config, &dac_param), _callback, &dac_param); - - /* start ADC timer */ - edc20_adc_tim_start(&mode_param.config); - - /* get current tick */ - TickType_t tick = xTaskGetTickCount(); - - uint32_t notify_delay = pdMS_TO_TICKS(mode_param.mS_period); - - /* start data update process */ - running = true; - - while (running) - { - ret_code_t ret = _send_data_packet(&packet_buf, false); - switch (ret) - { - case NRF_SUCCESS: - case NRF_ERROR_RESOURCES: - vTaskDelayUntil(&tick, notify_delay); - break; - default: - running = false; - break; - } - } - - edc20_dac_tim_stop(); - edc20_adc_tim_stop(); + /* start ADC timer */ + edc20_adc_tim_start(&mode_param.config); + + /* get current tick */ + TickType_t tick = xTaskGetTickCount(); + + uint32_t notify_delay = pdMS_TO_TICKS(mode_param.mS_period); + + /* start data update process */ + running = true; + + while (running) + { + ret_code_t ret = _send_data_packet(&packet_buf, false); + switch (ret) + { + case NRF_SUCCESS: + case NRF_ERROR_RESOURCES: + vTaskDelayUntil(&tick, notify_delay); + break; + default: + running = false; + break; + } + } + + edc20_dac_tim_stop(); + edc20_adc_tim_stop(); if (1) {