Initial work on settable tacho pulse duration (See #210)
This commit is contained in:
parent
c392cb8f5d
commit
c671a4102f
|
@ -213,7 +213,8 @@ page = 1
|
|||
pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
|
||||
tachoPin = bits, U08, 16, [0:5], "Board Default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
|
||||
tachoDiv = bits, U08, 16, [6:7], "Normal", "Half", "INVALID", "INVALID"
|
||||
unused2-17 = scalar, U08, 17, "ms", 0.1, 0.0, 0.0, 25.5, 1
|
||||
tachoDuration = bits, U08, 17, [0:2], "ms", 1.0, 0.0, 1.0, 6.0, 0
|
||||
unused2-17d = bits, U08, 17, [3:7], "ms", 0.1, 0.0, 0.0, 25.5, 1
|
||||
unused2-18 = scalar, U08, 18, "ms", 0.1, 0.0, 0.0, 25.5, 1
|
||||
tpsThresh = scalar, U08, 19, "%/s", 1.0, 0.0, 0.0, 255, 0
|
||||
taeTime = scalar, U08, 20, "ms", 10, 0.0, 0.0, 2550, 0
|
||||
|
@ -1130,6 +1131,7 @@ page = 10
|
|||
defaultValue = boostPin, 0
|
||||
defaultValue = fuelPumpPin, 0
|
||||
defaultValue = tachoPin, 0
|
||||
defaultValue = tachoDuration, 2
|
||||
defaultValue = perToothIgn, 0
|
||||
defaultValue = resetControlPin, 0
|
||||
|
||||
|
@ -1641,6 +1643,7 @@ menuDialog = main
|
|||
dialog = tacho, "Tacho"
|
||||
field = "Output pin", tachoPin
|
||||
field = "Output speed", tachoDiv
|
||||
field = "Pulse duration", tachoDuration
|
||||
|
||||
dialog = accelEnrichments_center, ""
|
||||
field = "TPSdot Threshold", tpsThresh
|
||||
|
|
|
@ -460,7 +460,8 @@ struct config2 {
|
|||
byte pinMapping; // The board / ping mapping to be used
|
||||
byte tachoPin : 6; //Custom pin setting for tacho output
|
||||
byte tachoDiv : 2; //Whether to change the tacho speed
|
||||
byte unused2_17;
|
||||
byte tachoDuration : 3; //The duration of the tacho pulse in mS
|
||||
byte unused2_17d : 5;
|
||||
byte unused2_18;
|
||||
byte tpsThresh;
|
||||
byte taeTime;
|
||||
|
|
|
@ -1,45 +1,40 @@
|
|||
#include "scheduledIO.h"
|
||||
#include "scheduler.h"
|
||||
#include "globals.h"
|
||||
#include "timers.h"
|
||||
|
||||
volatile bool tachoAlt = true;
|
||||
#define TACH_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask)
|
||||
#define TACH_PULSE_LOW() if( (configPage2.tachoDiv == 0) || tachoAlt ) { *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt; }
|
||||
inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); }
|
||||
|
||||
inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); }
|
||||
|
||||
inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); }
|
||||
|
||||
inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); TACH_PULSE_HIGH(); }
|
||||
inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); }
|
||||
|
||||
inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); TACH_PULSE_HIGH(); }
|
||||
inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); }
|
||||
|
||||
inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); TACH_PULSE_HIGH(); }
|
||||
inline void beginCoil6Charge() { digitalWrite(pinCoil6, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil6Charge() { digitalWrite(pinCoil6, coilLOW); }
|
||||
|
||||
inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); TACH_PULSE_HIGH(); }
|
||||
inline void beginCoil7Charge() { digitalWrite(pinCoil7, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); }
|
||||
|
||||
inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); TACH_PULSE_HIGH(); }
|
||||
inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); tachoOutputFlag = READY; }
|
||||
inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); }
|
||||
|
||||
inline void beginCoil6Charge() { digitalWrite(pinCoil6, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil6Charge() { digitalWrite(pinCoil6, coilLOW); TACH_PULSE_HIGH(); }
|
||||
|
||||
inline void beginCoil7Charge() { digitalWrite(pinCoil7, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); TACH_PULSE_HIGH(); }
|
||||
|
||||
inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); TACH_PULSE_LOW(); }
|
||||
inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); TACH_PULSE_HIGH(); }
|
||||
|
||||
inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); }
|
||||
inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high
|
||||
inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low
|
||||
inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); }
|
||||
inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high
|
||||
inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low
|
||||
|
||||
//As above but for ignition (Wasted COP mode)
|
||||
void beginCoil1and3Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinCoil3, coilHIGH); TACH_PULSE_LOW(); }
|
||||
void endCoil1and3Charge() { digitalWrite(pinCoil1, coilLOW); digitalWrite(pinCoil3, coilLOW); TACH_PULSE_HIGH(); }
|
||||
void beginCoil2and4Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinCoil4, coilHIGH); TACH_PULSE_LOW(); }
|
||||
void endCoil2and4Charge() { digitalWrite(pinCoil2, coilLOW); digitalWrite(pinCoil4, coilLOW); TACH_PULSE_HIGH(); }
|
||||
void beginCoil1and3Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinCoil3, coilHIGH); tachoOutputFlag = READY; }
|
||||
void endCoil1and3Charge() { digitalWrite(pinCoil1, coilLOW); digitalWrite(pinCoil3, coilLOW); }
|
||||
void beginCoil2and4Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinCoil4, coilHIGH); tachoOutputFlag = READY; }
|
||||
void endCoil2and4Charge() { digitalWrite(pinCoil2, coilLOW); digitalWrite(pinCoil4, coilLOW); }
|
||||
|
||||
void nullCallback() { return; }
|
||||
|
|
|
@ -19,6 +19,13 @@ Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms
|
|||
#ifndef TIMERS_H
|
||||
#define TIMERS_H
|
||||
|
||||
volatile bool tachoAlt = true;
|
||||
#define TACHO_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask)
|
||||
#define TACHO_PULSE_LOW() if( (configPage2.tachoDiv == 0) || tachoAlt ) { *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt; }
|
||||
enum TachoOutputStatus {DEACTIVE, READY, ACTIVE}; //The 3 statuses that the tacho output pulse can have
|
||||
volatile uint8_t tachoEndTime; //The time (in ms) that the tacho pulse needs to end at
|
||||
volatile TachoOutputStatus tachoOutputFlag;
|
||||
|
||||
volatile byte loop33ms;
|
||||
volatile byte loop66ms;
|
||||
volatile byte loop100ms;
|
||||
|
|
|
@ -62,6 +62,24 @@ void oneMSInterval() //Most ARM chips can simply call a function
|
|||
if(ignitionSchedule4.Status == RUNNING) { if( (ignitionSchedule4.startTime < targetOverdwellTime) && (configPage4.useDwellLim) && (isCrankLocked != true) ) { endCoil4Charge(); ignitionSchedule4.Status = OFF; } }
|
||||
if(ignitionSchedule5.Status == RUNNING) { if( (ignitionSchedule5.startTime < targetOverdwellTime) && (configPage4.useDwellLim) && (isCrankLocked != true) ) { endCoil5Charge(); ignitionSchedule5.Status = OFF; } }
|
||||
|
||||
//Tacho output check
|
||||
if(tachoOutputFlag == READY)
|
||||
{
|
||||
TACHO_PULSE_LOW();
|
||||
//ms_counter is cast down to a byte as the tacho duration can only be in the range of 0-5, so no extra
|
||||
tachoEndTime = (uint8_t)ms_counter + configPage2.tachoDuration;
|
||||
tachoOutputFlag = ACTIVE;
|
||||
}
|
||||
else if(tachoOutputFlag == ACTIVE)
|
||||
{
|
||||
//
|
||||
if((uint8_t)ms_counter > tachoEndTime)
|
||||
{
|
||||
TACHO_PULSE_HIGH();
|
||||
tachoOutputFlag = DEACTIVE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//30Hz loop
|
||||
|
|
Loading…
Reference in New Issue