bugfix: 修正 cycle iv mode, OUT1 電壓不會動的問題
1) 原本的 p->mV_output += p->dir * p->step; 因為整數跟浮點數混合運算, 會發生錯誤!所以導致 OUT1 電壓固定
This commit is contained in:
+39
-41
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user