static THD_FUNCTION(timer_thread, arg) { (void)arg; chRegSetThreadName("mcif timer"); for(;;) { // Check if the DRV8302 indicates any fault if (IS_DRV_FAULT()) { mc_interface_fault_stop(FAULT_CODE_DRV8302); } // Decrease fault iterations if (m_ignore_iterations > 0) { m_ignore_iterations--; } else { if (!IS_DRV_FAULT()) { m_fault_now = FAULT_CODE_NONE; } } update_override_limits(&m_conf); chThdSleepMilliseconds(1); } }
static void do_dc_cal(void) { DCCAL_ON(); // Wait max 5 seconds int cnt = 0; while(IS_DRV_FAULT()){ chThdSleepMilliseconds(1); cnt++; if (cnt > 5000) { break; } }; chThdSleepMilliseconds(1000); m_curr0_sum = 0; m_curr1_sum = 0; #ifdef HW_HAS_3_SHUNTS m_curr2_sum = 0; #endif m_curr_samples = 0; while(m_curr_samples < 4000) {}; m_curr0_offset = m_curr0_sum / m_curr_samples; m_curr1_offset = m_curr1_sum / m_curr_samples; #ifdef HW_HAS_3_SHUNTS m_curr2_offset = m_curr2_sum / m_curr_samples; #endif DCCAL_OFF(); m_dccal_done = true; }