void ETMCanExecuteCMDBoardSpecific(ETMCanMessage* message_ptr) { unsigned int index_word; index_word = message_ptr->word3; switch (index_word) { /* Place all board specific commands here */ #ifdef __A36224_500 case ETM_CAN_REGISTER_HEATER_MAGNET_CMD_OUTPUT_ENABLE: ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE); break; case ETM_CAN_REGISTER_HEATER_MAGNET_CMD_OUTPUT_DISABLE: ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE); break; #endif #ifdef __A36444 case ETM_CAN_REGISTER_HV_LAMBDA_CMD_HV_ON: ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE); break; case ETM_CAN_REGISTER_HV_LAMBDA_CMD_HV_OFF: ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE); break; #endif default: etm_can_can_status.can_status_invalid_index++; break; } }
void DoStateMachine(void) { switch (control_state) { case STATE_STARTUP: InitializeA36224(); control_state = STATE_WAITING_FOR_CONFIG; break; case STATE_WAITING_FOR_CONFIG: ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_BOARD_WAITING_INITIAL_CONFIG); ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE); DisableHeaterMagnetOutputs(); while (control_state == STATE_WAITING_FOR_CONFIG) { DoA36225_500(); ETMCanDoCan(); if (!ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_BOARD_WAITING_INITIAL_CONFIG)) { control_state = STATE_STANDBY; } if (ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SUM_FAULT)) { control_state = STATE_FAULT; } } break; case STATE_STANDBY: DisableHeaterMagnetOutputs(); while (control_state == STATE_STANDBY) { DoA36225_500(); ETMCanDoCan(); if (!ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE)) { control_state = STATE_OPERATE; } if (ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SUM_FAULT)) { control_state = STATE_FAULT; } } break; case STATE_OPERATE: EnableHeaterMagnetOutputs(); while (control_state == STATE_OPERATE) { DoA36225_500(); ETMCanDoCan(); if (ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SOFTWARE_DISABLE)) { control_state = STATE_STANDBY; } if (ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SUM_FAULT)) { control_state = STATE_FAULT; } } break; case STATE_FAULT: DisableHeaterMagnetOutputs(); while (control_state == STATE_FAULT) { DoA36225_500(); ETMCanDoCan(); if (!ETMCanCheckBit(etm_can_status_register.status_word_0, STATUS_BIT_SUM_FAULT)) { // The faults have been cleared control_state = STATE_WAITING_FOR_CONFIG; } } break; default: control_state = STATE_FAULT; break; } }
void DoA36225_500(void) { // Check the status of these pins every time through the loop if (PIN_D_IN_3_HEATER_OVER_VOLT_STATUS == ILL_HEATER_OV) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HW_HEATER_OVER_VOLTAGE); } if (_T5IF) { // 10ms Timer has expired so this code will executre once every 10ms _T5IF = 0; // Flash the operate LED led_divider++; if (led_divider >= 50) { led_divider = 0; if (PIN_LED_POWER) { PIN_LED_POWER = 0; } else { PIN_LED_POWER = 1; } } // Update the error counters that get returned etm_can_system_debug_data.i2c_bus_error_count = 0; // There are no I2C devices on this board etm_can_system_debug_data.spi_bus_error_count = etm_spi1_error_count + etm_spi2_error_count; etm_can_system_debug_data.scale_error_count = etm_scale_saturation_etmscalefactor2_count + etm_scale_saturation_etmscalefactor16_count; etm_can_system_debug_data.self_test_result_register = 0; // DPARKER NEED TO WORK ON THE SELF TEST /* The following are updated by the ETM_CAN module can_bus_error_count reset_count */ // Set the fault LED if (etm_can_status_register.status_word_0 & 0x0003) { // The board is faulted or inhibiting the system PIN_LED_I2_C = 0; } else { PIN_LED_I2_C = 1; } // Update the digital input status pins if (PIN_D_IN_0_ELECTROMAGENT_STATUS == ILL_POWER_SUPPLY_DISABLED) { ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_ELECTROMAGNET_STATUS); } else { ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_ELECTROMAGNET_STATUS); } if (PIN_D_IN_4_TEMPERATURE_STATUS == ILL_TEMP_SWITCH_FAULT) { ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_HW_TEMPERATURE_SWITCH); } else { ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_HW_TEMPERATURE_SWITCH); } if (PIN_D_IN_1_HEATER_STATUS == ILL_POWER_SUPPLY_DISABLED) { ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_HEATER_STATUS); } else { ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_HEATER_STATUS); } if (PIN_D_IN_5_RELAY_STATUS == ILL_RELAY_OPEN) { ETMCanSetBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_RELAY_STATUS); } else { ETMCanClearBit(&etm_can_status_register.status_word_0, STATUS_BIT_READBACK_RELAY_STATUS); } // Flash the Refresh if (PIN_D_OUT_REFRESH) { PIN_D_OUT_REFRESH = 0; } else { PIN_D_OUT_REFRESH = 1; } // Do Math on ADC inputs // Scale the ADC readings to engineering units ETMAnalogScaleCalibrateADCReading(&global_data_A36224_500.analog_input_electromagnet_current); ETMAnalogScaleCalibrateADCReading(&global_data_A36224_500.analog_input_electromagnet_voltage); ETMAnalogScaleCalibrateADCReading(&global_data_A36224_500.analog_input_heater_current); ETMAnalogScaleCalibrateADCReading(&global_data_A36224_500.analog_input_heater_voltage); // -------------------- CHECK FOR FAULTS ------------------- // if (global_reset_faults) { etm_can_system_debug_data.debug_0++; etm_can_status_register.status_word_1 = 0x0000; global_reset_faults = 0; } if (control_state == STATE_OPERATE) { global_data_A36224_500.analog_input_electromagnet_current.target_value = global_data_A36224_500.analog_output_electromagnet_current.set_point; global_data_A36224_500.analog_input_electromagnet_voltage.target_value = ETMScaleFactor16(global_data_A36224_500.analog_output_electromagnet_current.set_point,MACRO_DEC_TO_SCALE_FACTOR_16(NOMINAL_ELECTROMAGNET_RESISTANCE),0); global_data_A36224_500.analog_input_heater_current.target_value = global_data_A36224_500.analog_output_heater_current.set_point; global_data_A36224_500.analog_input_heater_voltage.target_value = ETMScaleFactor16(global_data_A36224_500.analog_output_heater_current.set_point,MACRO_DEC_TO_SCALE_FACTOR_16(NOMINAL_HEATER_RESISTANCE),0); } else { global_data_A36224_500.analog_input_electromagnet_current.target_value = 0; global_data_A36224_500.analog_input_electromagnet_voltage.target_value = 0; global_data_A36224_500.analog_input_heater_current.target_value = 0; global_data_A36224_500.analog_input_heater_voltage.target_value = 0; } if (ETMAnalogCheckOverAbsolute(&global_data_A36224_500.analog_input_heater_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_OVER_CUR_ABSOLUTE); } if (ETMAnalogCheckUnderAbsolute(&global_data_A36224_500.analog_input_heater_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_UNDER_CUR_ABSOLUTE); } if (ETMAnalogCheckOverRelative(&global_data_A36224_500.analog_input_heater_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_OVER_CUR_RELATIVE); } if (ETMAnalogCheckUnderRelative(&global_data_A36224_500.analog_input_heater_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_UNDER_CUR_RELATIVE); } if (ETMAnalogCheckOverAbsolute(&global_data_A36224_500.analog_input_heater_voltage)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_OVER_VOL_ABSOLUTE); } if (ETMAnalogCheckUnderRelative(&global_data_A36224_500.analog_input_heater_voltage)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_HEATER_UNDER_VOL_RELATIVE); } if (ETMAnalogCheckOverAbsolute(&global_data_A36224_500.analog_input_electromagnet_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_OVER_CUR_ABSOLUTE); } if (ETMAnalogCheckUnderAbsolute(&global_data_A36224_500.analog_input_electromagnet_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_UNDER_CUR_ABSOLUTE); } if (ETMAnalogCheckOverRelative(&global_data_A36224_500.analog_input_electromagnet_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_OVER_CUR_RELATIVE); } if (ETMAnalogCheckUnderRelative(&global_data_A36224_500.analog_input_electromagnet_current)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_UNDER_CUR_RELATIVE); } if (ETMAnalogCheckOverAbsolute(&global_data_A36224_500.analog_input_electromagnet_voltage)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_OVER_VOL_ABSOLUTE); } if (ETMAnalogCheckUnderRelative(&global_data_A36224_500.analog_input_electromagnet_voltage)) { ETMCanSetBit(&etm_can_status_register.status_word_1, FAULT_BIT_MAGNET_UNDER_VOL_RELATIVE); } // Set DAC outputs if (control_state == STATE_OPERATE) { ETMAnalogScaleCalibrateDACSetting(&global_data_A36224_500.analog_output_heater_current); WriteMCP4822(&U42_MCP4822, MCP4822_OUTPUT_A_4096, global_data_A36224_500.analog_output_electromagnet_current.dac_setting_scaled_and_calibrated>>4); ETMAnalogScaleCalibrateDACSetting(&global_data_A36224_500.analog_output_electromagnet_current); WriteMCP4822(&U42_MCP4822, MCP4822_OUTPUT_B_4096, global_data_A36224_500.analog_output_heater_current.dac_setting_scaled_and_calibrated>>4); } else {