Engine & electrical: Major update, more realistic performance
This commit is contained in:
parent
7754cf5589
commit
eb1049c7f4
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue