bugfix: 修正 cycle iv mode, OUT1 電壓不會動的問題

1) 原本的 p->mV_output += p->dir * p->step; 因為整數跟浮點數混合運算, 會發生錯誤!所以導致 OUT1 電壓固定
This commit is contained in:
chain40
2024-06-25 00:45:12 +08:00
parent 4d4ac8576f
commit e18befa26d
+39 -41
View File
@@ -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)
{