Re: [DRIVING] Opel Omega B2 + GS450H (the "EVOmega")
Posted: Sat Mar 09, 2024 2:14 pm
Oh this is interesting, I'd been thinking of fabricating an adapter for mine to match with the 6 bolt flange on my prop shaft.
openinverter Community
https://openinverter.org:443/forum/
Code: Select all
#define SHIFT_UP_RPM 6000
#define SHIFT_DOWN_RPM 2000
#define SHIFT_DELAY_MS 100
enum class ShiftState {
ENGAGED,
TORQUE_ZERO_IDLE,
SHIFT_COMMANDED,
};
struct Shift {
uint8_t target_gear = 0; // 0 = low, 1 = high
uint8_t current_gear = 0;
ShiftState state = ShiftState::ENGAGED;
};
Shift shift;
void set_solenoid_outputs_idle()
{
digitalWrite(TransSL1, LOW);
digitalWrite(TransSL2, HIGH);
digitalWrite(TransSP, LOW);
}
void set_solenoid_outputs_gear(bool high_gear)
{
if(high_gear){
digitalWrite(TransSL1, LOW);
digitalWrite(TransSL2, LOW);
digitalWrite(TransSP, LOW);
} else {
digitalWrite(TransSL1, HIGH);
digitalWrite(TransSL2, HIGH);
digitalWrite(TransSP, HIGH);
}
}
void shift_step()
{
if(shift.state == ShiftState::ENGAGED){
shift.target_gear = [&](){
if(shift.current_gear == 0){
return mg2_speed > SHIFT_UP_RPM ? 1 : 0;
} else {
return mg2_speed < SHIFT_DOWN_RPM ? 0 : 1;
}
}();
if(shift.target_gear != shift.current_gear){
set_solenoid_outputs_idle();
// NOTE: Torque will be set to 0 in control_inverter()
// Start waiting for torque=0 and idle commands to propagate
shift.state = ShiftState::TORQUE_ZERO_IDLE;
} else {
set_solenoid_outputs_gear(shift.current_gear);
}
}
else if(shift.state == ShiftState::TORQUE_ZERO_IDLE){
// Torque=0 and idle commands are assumed to be propagated now
// Now select the new gear
set_solenoid_outputs_gear(shift.target_gear);
// Start waiting for gear selection to propagate
shift.state = ShiftState::SHIFT_COMMANDED;
}
else if(shift.state == ShiftState::SHIFT_COMMANDED){
// Gear selection is assumed to apply now. Switch to engaged state so
// that torque will be applied again
shift.current_gear = shift.target_gear;
shift.state = ShiftState::ENGAGED;
} else {
shift.state = ShiftState::ENGAGED;
}
}
...
EVERY_N_MILLISECONDS(SHIFT_DELAY_MS){
shift_step();
}