Espruino/code/ecu.js
Gordon Williams f3d6e0bc83 First commit
2013-09-26 14:39:04 +01:00

246 lines
10 KiB
JavaScript

// ctrl-c crashes it!
var PINS = {
iCrank:C8,
iInl:C10,
iExh:C9,
iSpare:C11,
oInl:E8,
oExh:E10,
oDashECU:E9,
oDashOil:E11,
oDashTemp:E12,
oDashRPM:E13,
aBat:C5,
aTPS:A3,
aMAP:B0,
aWater:C1,
aAir:B1,
aLambdaM:A2,
aLambdaP:A1,
oCoil1:D6,
oCoil2:D7,
oCoil3:D10,
oCoil4:D11,
oInj1:E3,
oInj2:E4,
oInj3:E5,
oInj4:E6,
};
var ECU = {
"pInl":2.598771,
"pExh":43.764055,
"RPM":125.030327,
"TPS":0.260746,
"mapx":0.12503,
"mapy":1.607461,
"spk":10,
"spkStart":8.499636,
"vBat":16.765931,
"spkLen":2,
"expInl":20,
"expExh":20};
var MAPS = {
spk : new Float32Array( [
// 0, 1, 2, 3, 4, 5, 6, 7, RPM
5, 13, 13, 13, 18, 24, 27, 27,
5, 13, 13, 13, 18, 24, 27, 27,
5, 13, 13, 13, 20, 24, 27, 27,
5, 14, 13, 20, 25, 26, 25, 25,
5, 16, 20, 24, 24, 25, 25, 25,
5, 15, 20, 23, 24, 24, 24, 24,
5, 6, 18, 20, 21, 21, 21, 21,
5, 6, 18, 20, 21, 21, 21, 21,
] ),
fuel : new Float32Array( [
0x1C, 0x0F, 0x0E, 0x0B, 0x0C, 0x0C, 0x13, 0x12,
0x1C, 0x10, 0x0E, 0x0C, 0x16, 0x17, 0x23, 0x2A,
0x1C, 0x1F, 0x1B, 0x1E, 0x1D, 0x26, 0x32, 0x33,
0x2E, 0x31, 0x27, 0x24, 0x24, 0x30, 0x3F, 0x3D,
0x37, 0x3E, 0x2F, 0x35, 0x39, 0x49, 0x48, 0x46,
0x43, 0x45, 0x45, 0x4F, 0x55, 0x52, 0x4C, 0x44,
0x4D, 0x45, 0x51, 0x55, 0x58, 0x53, 0x4F, 0x48,
0x4D, 0x4C, 0x5A, 0x56, 0x55, 0x52, 0x4E, 0x48,
] ),
inl : new Int8Array( [
0, 0, 0, 0, 0, -3, -3, -3, // le5
-4, -4, -13, -19, -9, -3, -3, -3,
-2, -2, -13, -17, -6, -2, -2, -2,
-2, -2, -13, -17, -6, -2, -2, -2,
-24, -24, -24, -24, -24, -13, -7, -7,
-24, -24, -24, -24, -24, -13, -7, -7,
-24, -24, -24, -24, -24, -13, -7, -7,
-24, -24, -24, -24, -24, -13, -7, -7,
] ),
exh : new Int8Array( [
0, 0, 5, 9, 9, 14, 14, 14, // le5
0, 13, 24, 24, 19, 15, 15, 17,
0, 13, 22, 18, 15, 12, 14, 16,
0, 8, 22, 14, 10, 10, 12, 14,
0, 7, 10, 12, 17, 11, 10, 10,
0, 7, 10, 12, 17, 11, 10, 10,
0, 7, 10, 12, 17, 11, 10, 10,
0, 7, 10, 12, 17, 11, 10, 10,
] )
};
function watchInlet(e) {
ECU.pInl = Math.wrap(Trig.getPosAtTime(e.time),180);
var diff = ECU.pInl - ECU.expInl;
ECU.drvInl = 0.8 + (diff / 10);
analogWrite(PINS.oInl, ECU.drvInl);
}
function watchExhaust(e) {
ECU.pExh = Math.wrap(Trig.getPosAtTime(e.time)+90,180)-90;
var diff = ECU.expExh - ECU.pExh;
ECU.drvExh = 0.8 + (diff / 10);
analogWrite(PINS.oExh, ECU.drvExh);
}
// inl = 46 .. 96 (on)
// exh = -2.5(off) .. 47(on)
// NOTE: a degree value of -7.75*6 will occur on the first tooth after
function onTimer() {
ECU.RPM = Trig.getRPM();
ECU.TPS = analogRead(PINS.aTPS);
ECU.MAP = Math.clip((0.1449 / (1.125-analogRead(PINS.aMAP))) - 0.125,0,1);
ECU.vBat = analogRead(PINS.aBat)*18.804;
ECU.mapx = Math.clip(ECU.RPM/1000, 0, 7);
ECU.mapy = Math.clip(ECU.TPS*10-1,0,8);
ECU.spk = -MAPS.spk.interpolate2d(8,ECU.mapx, ECU.mapy);
ECU.spkLen = 1.5 + Math.clip((13.5-ECU.vBat)*0.1,0,0.5);
ECU.expInl = 90+MAPS.inl.interpolate2d(8,ECU.mapx, ECU.mapy);
ECU.expExh = MAPS.exh.interpolate2d(8,ECU.mapx, ECU.mapy);
ECU.spkStart = ECU.spk - (ECU.RPM*ECU.spkLen*6/1000);
ECU.fuel = MAPS.fuel.interpolate2d(8,ECU.mapx, ECU.mapy) * ECU.trim;
Trig.setTrigger(0,ECU.spkStart,[LED1,PINS.oCoil1,PINS.oCoil4],ECU.spkLen);
Trig.setTrigger(1,180+ECU.spkStart,[LED3,PINS.oCoil2,PINS.oCoil3],ECU.spkLen);
Trig.setTrigger(2,0,[PINS.oInj1,PINS.oInj2,PINS.oInj3,PINS.oInj4],ECU.fuel);
Trig.setTrigger(3,180,[PINS.oInj1,PINS.oInj2,PINS.oInj3,PINS.oInj4],ECU.fuel);
ECU.lambda = 7+15.25*(analogRead(PINS.aLambdaP) - analogRead(PINS.aLambdaM));
if (ECU.RPM>500 && ECU.lambda>7.5)
ECU.trim = (ECU.trim*0.99) + (0.01*Math.clip(ECU.trim*ECU.lambda/15,0.05,0.2));
var a = Trig.getErrorArray();
if (a.length>0) print(JSON.stringify(a));
}
function onInit() {
Serial1.setup(9600, {"rx":B7,"tx":B6});
Serial1.setConsole();
clearInterval();
setInterval(onTimer,25);
clearWatch();
Trig.setup(PINS.iCrank, { teethTotal:60, teethMissing:2, minRPM:30, keyPosition: -7.75*360/60 });
setWatch(watchInlet, PINS.iInl, {repeat:true, edge:'falling'});
setWatch(watchExhaust, PINS.iExh, {repeat:true, edge:'falling'});
PINS.oCoil1.reset();
PINS.oCoil2.reset();
PINS.oCoil3.reset();
PINS.oCoil4.reset();
LED1.reset();
LED2.reset();
LED3.reset();
LED4.reset();
Trig.setTrigger(0,0,[LED1,PINS.oCoil1,PINS.oCoil4],5);
Trig.setTrigger(1,180,[LED3,PINS.oCoil2,PINS.oCoil3],5);
Trig.setTrigger(2,90,[LED2],5);
Trig.setTrigger(3,270,[LED4],5);
}
onInit();
// 1.808 at 3000rpm idle
digitalPulse(PINS.oInj1,1,10);digitalPulse(PINS.oInj2,1,10);digitalPulse(PINS.oInj3,1,10);digitalPulse(PINS.oInj4,1,10);
// lambda
//0.183596 9.8
//0.354009 12.4
//(12.4-9.8)/(0.354009-0.183596)
E8.reset();Trig.setTrigger(0,10,[E8],100);
setInterval("print(JSON.stringify(ECU))",1000);
PINS.oCoil1.reset();
PINS.oCoil3.reset();
Trig.setTrigger(0,1,[PINS.oCoil1,PINS.oCoil3],5);
//---------------------------------------------------------
//E8.reset();Trig.setTrigger(0,10,[E8],100);
E8.reset();setInterval("var t=getTime();E8.writeAtTime(1,t+0.005);E8.writeAtTime(0,t+0.006);",100);
LED3.reset();setInterval("var t=getTime();LED3.writeAtTime(1,t);LED3.writeAtTime(1,t+1);LED3.writeAtTime(0,t+2);",1500);
LED4.reset();setInterval("var t=getTime();LED4.writeAtTime(1,t+1);LED4.writeAtTime(0,t+2);",1600);
LED3.reset();var t=getTime();LED3.writeAtTime(1,t+10);LED3.writeAtTime(0,t+11);LED3.writeAtTime(1,t+12);LED3.writeAtTime(0,t+13);
var t=getTime();LED3.writeAtTime(1,t+2);LED3.writeAtTime(0,t+3);
LED1.reset();LED2.reset();E8.reset();
var t=getTime();for (i=0;i<8;i++) E8.writeAtTime(i&1,t+i);
LED1.reset();LED2.reset();E8.reset();
var t=getTime();E8.writeAtTime(i&1,t+0);E8.writeAtTime(i&1,t+1);
LED1.reset();LED2.reset();
var t=getTime();LED3.write(1);for (i=0;i<8;i++) LED3.writeAtTime(i&1,t+i+1);
//---------------------------------------------------------
function step() {
// print([C8.read(),C9.read(),C10.read(),C11.read()]);
}
setInterval(step,500);
Trig.setup(BTN2);
var x=0;
function step() {
var t = Trig.getPosAtTime(getTime());
LCD.drawString(t+" ",0,0,0,0xFFFF);
LCD.setPixel(x, 240-t*3, 0xFFFF);
x++;
if (x>319) { x=0; LCD.clear(); }
}
setInterval(step, 50);
["MISSED_TRIG_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","SHORT_TOOTH"]
["SHORT_TOOTH"]
["WHEEL_MISSED_TOOTH","TRIG_TOOTH_CHANGED"]
["MISSED_TOOTH"]
["TRIG_IN_PAST","MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","SHORT_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TRIG_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TRIG_TOOTH"]
["WHEEL_MISSED_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["WHEEL_MISSED_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","SHORT_TOOTH"]
["TRIG_IN_PAST","WHEEL_MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","SHORT_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","WHEEL_MISSED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_FUTURE","TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_FUTURE","TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
["TRIG_IN_FUTURE","TRIG_IN_PAST","MISSED_TRIG_TOOTH","WHEEL_MISSED_TOOTH","WHEEL_GAINED_TOOTH","WHEEL_MISSED_TRIG_TOOTH","TRIG_TOOTH_CHANGED"]
>