mirror of
https://github.com/espruino/Espruino.git
synced 2025-12-08 19:06:15 +00:00
246 lines
10 KiB
JavaScript
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"]
|
|
>
|