Engine & electrical: Major update, more realistic performance

This commit is contained in:
Sidi Liang 2021-02-02 16:41:15 +08:00
parent 7754cf5589
commit eb1049c7f4
2 changed files with 64 additions and 32 deletions

View File

@ -1,6 +1,8 @@
#//Followme EV electrical system by Sidi Liang
#//Contact: sidi.liang@gmail.com
#//Notes: switch should be changed to a (very very) large resistant
var kWh2kWs = func(kWh){
return kWh * 3600;
}
@ -60,16 +62,22 @@ var Series = {
#//Calculated by solving the equation UI = I^2*R + Power output
var a = me.totalResistance();
var b = me.voltage;
if(me.voltage == 0) return 0;#//No voltage, no current Trying to solve the floating point error at the next line
#print(me.voltage * me.voltage - 4 * me.totalResistance() * me.totalActivePower());
var c = math.sqrt(me.voltage * me.voltage - 4 * me.totalResistance() * me.totalActivePower());
var d = b - c;
var d = b + c; #//used to be minus, but adding it seems to be correct
return d / (2 * a); #//Ampere
},
calculateTotalCounterElectromotiveForce: func(){
#//Total counterElectromotiveForce, calculated from UI = I^R + Power output
return me.voltage - me.current() * me.totalResistance();
},
calculateSeriesVoltage: func(){
var tR = me.totalResistance();
cElectromotiveForce = me.voltage - me.current() * tR; #Total counterElectromotiveForce, calculated from UI = I^R + Power output
me.voltage = me.voltage - cElectromotiveForce; #//Voltage with counterElectromotiveForce in consideration
cElectromotiveForce = me.calculateTotalCounterElectromotiveForce();
#//me.voltage = me.voltage - cElectromotiveForce; #//Voltage with counterElectromotiveForce in consideration
totalTmp = 0;
foreach(elem; me.units){
totalTmp += elem.current * elem.current * elem.resistance + elem.activePower + elem.activePower_kW * 1000;
@ -129,10 +137,17 @@ var Circuit = {
current: 0, #//Ampere
voltage: func(){
var v = 0;
voltage: func(){ #//Terminal voltage
var v = me.parallelConnection[0].units[0].electromotiveForce - me.calculateTotalParallelCurrent()*me.parallelConnection[0].units[0].resistance;
foreach(elem; me.parallelConnection){
if(elem.isSwitch()){
continue;
}
v -= elem.calculateTotalCounterElectromotiveForce();#//All counterElectromotiveForce is substracted
}
#if(me.calculateTotalParallelCurrent()){
v = me.parallelConnection[0].units[0].electromotiveForce - me.calculateTotalParallelCurrent()*me.parallelConnection[0].units[0].resistance;
# v = me.parallelConnection[0].units[0].electromotiveForce - me.calculateTotalParallelCurrent()*me.parallelConnection[0].units[0].resistance;
#}
#foreach(elem; me.parallelConnection){
# if(elem.voltage != v){
@ -145,7 +160,7 @@ var Circuit = {
calculateParallelVoltage: func(){
var setVoltage = me.voltage();
var totalCounterElecMotiveForce = 0;
#//var totalCounterElecMotiveForce = 0;
foreach(elem; me.parallelConnection){
if(elem.isSwitch()){
if(!elem.isConnected()){
@ -406,6 +421,7 @@ cSource_small.resetRemainingToZero();
var electricTimer1 = maketimer(circuit_1.updateInterval, func circuit_1.update());
electricTimer1.simulatedTime = 1;
var L = setlistener("/sim/signals/fdm-initialized", func{
electricTimer1.start();

View File

@ -86,8 +86,6 @@ var Engine = {
#print(angularAcceleration);
#print("de"~angularDecelaeration);
angularDecelaeration = math.abs(angularDecelaeration) * me.getDirection() * -1;
@ -95,23 +93,35 @@ var Engine = {
var totalAcceleration = angularAcceleration + angularDecelaeration;
if(me.getDirection() == 1){
if(angularSpeed + totalAcceleration * 0.1 > 10){
if(angularSpeed + totalAcceleration * 0.1 > 5){
angularSpeed = angularSpeed + totalAcceleration * 0.1;
}else if(angularSpeed + totalAcceleration * 0.1 < 10){
}else if(angularSpeed + totalAcceleration * 0.1 < 5){
#print("angularSpeed + totalAcceleration * 0.1 < 10");
angularSpeed = angularSpeed + angularAcceleration * 0.1;
}
}else if(me.getDirection() == -1){
if(angularSpeed + totalAcceleration * 0.1 < -10){
if(angularSpeed + totalAcceleration * 0.1 < -5){
angularSpeed = angularSpeed + totalAcceleration * 0.1;
}else if(angularSpeed + totalAcceleration * 0.1 > -10){
}else if(angularSpeed + totalAcceleration * 0.1 > -5){
angularSpeed = angularSpeed + angularAcceleration * 0.1;
}
}
var wheelSpeed_ms = math.abs(props.getNode("/",1).getValue("gear/gear/rollspeed-ms"));
var wheelAngularSpeed = wheelSpeed_ms / me.wheel_radius;
var targetAngularSpeed = wheelAngularSpeed * me.gear;
#print("WheelAngularSpeed x gear " ~ wheelAngularSpeed * me.gear);
if(angularSpeed < targetAngularSpeed) angularSpeed = targetAngularSpeed;
#print("AngularSpeed " ~ angularSpeed);
#//rps = angularSpeed / 6.2831853;
rpm = angularSpeed * 9.5492966; #//rps * 60
me.rpm = rpm;
props.getNode("/",1).setValue("/controls/engines/engine/rpma",rpm);
me.angularSpeed = angularSpeed;
@ -143,28 +153,34 @@ var Engine = {
var cmdRpm = throttle * me.rpmAtMaxPower;
#print("cmdRpm: "~cmdRpm);
var cmdPower = throttle * me.ratedPower;
#var cmdPower = throttle * me.ratedPower;
#print("cmdPower: "~cmdPower);
me.cmdTorque = throttle * me.maxTorque * direction;
me.cmdPower = math.abs(me.rpm * me.cmdTorque / 9549);
if(me.cmdPower >= me.ratedPower){
me.cmdPower = me.ratedPower;
}
var angularAcceleration = me.cmdTorque / me.rotor_moi; #rad/s^2
me.rpm = me.rpm_calculate(angularAcceleration);
if(me.rpm) me.torque = direction * math.abs((9549 * me.cmdPower) / me.rpm);
me.activePower_kW = math.abs(me.rpm * me.torque / 9549);
if(math.abs(me.rpm) < cmdRpm){
#if(math.abs(me.rpm) < cmdRpm){
#print("me.rpm < cmdRpm");
#//me.torque = throttle * actualMaxTorque * direction;
me.torque = throttle * me.maxTorque * direction;
print("torque: "~me.torque);
var angularAcceleration = me.torque / me.rotor_moi; #rad/s^2
me.rpm = me.rpm_calculate(angularAcceleration);
}else if(throttle == 0){
me.activePower_kW = 0;
me.torque = 0;
var angularAcceleration = direction * math.abs(me.torque) / me.rotor_moi; #rad/s^2
me.rpm = me.rpm_calculate(angularAcceleration);
}else{
me.activePower_kW = cmdPower;
var angularAcceleration = direction * math.abs(me.torque) / me.rotor_moi; #rad/s^2
me.rpm = me.rpm_calculate(angularAcceleration);
me.torque = direction * math.abs((9549 * me.activePower_kW) / me.rpm);
}
#}else if(throttle == 0){
# me.activePower_kW = 0;
# me.torque = 0;
# var angularAcceleration = direction * math.abs(me.torque) / me.rotor_moi; #rad/s^2
# me.rpm = me.rpm_calculate(angularAcceleration);
#}else{
# var angularAcceleration = direction * math.abs(me.torque) / me.rotor_moi; #rad/s^2
# me.rpm = me.rpm_calculate(angularAcceleration);
# me.torque = throttle * direction * math.abs((9549 * me.activePower_kW) / me.rpm);
#}
var force = (1/me.wheel_radius) * me.torque * me.gear;#//unit: N
@ -215,7 +231,7 @@ var Engine = {
};
var engine_1 = Engine.new(460, 375, 6150);
var engine_1 = Engine.new(460, 375, 7750);
followme.circuit_1.addUnitToSeries(0, followme.Cable.new(5, 0.008));
followme.circuit_1.addUnitToSeries(0, engine_1);
followme.circuit_1.addUnitToSeries(0, engine_1.engineSwitch);