
Engine Variable Advance Timing successfull code implementation
main.cpp@0:1fe3a53ac109, 2020-12-02 (annotated)
- Committer:
- kwstasfane1
- Date:
- Wed Dec 02 12:27:03 2020 +0000
- Revision:
- 0:1fe3a53ac109
- Child:
- 1:e86fb31f7e95
Successfull implementation for the Engine timing management code. Lab was completed successfully
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kwstasfane1 | 0:1fe3a53ac109 | 1 | |
kwstasfane1 | 0:1fe3a53ac109 | 2 | /* timing.cpp api verion 1.01 */ |
kwstasfane1 | 0:1fe3a53ac109 | 3 | /* wajw 21/03/18 */ |
kwstasfane1 | 0:1fe3a53ac109 | 4 | //V 1.02 mod to just do period measurement edh 24/03/18 |
kwstasfane1 | 0:1fe3a53ac109 | 5 | /* Prog to measure period of rotation of flywheel */ |
kwstasfane1 | 0:1fe3a53ac109 | 6 | |
kwstasfane1 | 0:1fe3a53ac109 | 7 | |
kwstasfane1 | 0:1fe3a53ac109 | 8 | /* Software uses Pin 9 as an interrupt to determine rotation period */ |
kwstasfane1 | 0:1fe3a53ac109 | 9 | /* A ticker is used to give a count of elapsed time */ |
kwstasfane1 | 0:1fe3a53ac109 | 10 | |
kwstasfane1 | 0:1fe3a53ac109 | 11 | /* Interrupt occurs on +ve edge of TDC Pulse on pin10 */ |
kwstasfane1 | 0:1fe3a53ac109 | 12 | /* ISR Stores ticker count value as 'period', resets 'count' and sets flag */ |
kwstasfane1 | 0:1fe3a53ac109 | 13 | |
kwstasfane1 | 0:1fe3a53ac109 | 14 | #include "mbed.h" |
kwstasfane1 | 0:1fe3a53ac109 | 15 | #include "C12832_lcd.h" |
kwstasfane1 | 0:1fe3a53ac109 | 16 | #define counts_per_min 600000 // .1ms clock = 600k pulses minute |
kwstasfane1 | 0:1fe3a53ac109 | 17 | |
kwstasfane1 | 0:1fe3a53ac109 | 18 | //advance degree and RPM data arrays |
kwstasfane1 | 0:1fe3a53ac109 | 19 | static int map[] = {5,5,6,10,15,15,21,25,27,34,38}; // advance angles in degrees BTDC |
kwstasfane1 | 0:1fe3a53ac109 | 20 | static int rpm_range[] = {500,600,700,800,900,1000,1100,1200,1300,1400,1500}; //rpm range for which the advance angle should change |
kwstasfane1 | 0:1fe3a53ac109 | 21 | |
kwstasfane1 | 0:1fe3a53ac109 | 22 | //Global Variables: |
kwstasfane1 | 0:1fe3a53ac109 | 23 | |
kwstasfane1 | 0:1fe3a53ac109 | 24 | volatile int period = 0, count1 = 0; //this was changed to float to display the period more precisely |
kwstasfane1 | 0:1fe3a53ac109 | 25 | |
kwstasfane1 | 0:1fe3a53ac109 | 26 | volatile int pflag = 0, rpm = 0; |
kwstasfane1 | 0:1fe3a53ac109 | 27 | |
kwstasfane1 | 0:1fe3a53ac109 | 28 | int lag; |
kwstasfane1 | 0:1fe3a53ac109 | 29 | int spark_advance; //to be used for the advance degree input |
kwstasfane1 | 0:1fe3a53ac109 | 30 | |
kwstasfane1 | 0:1fe3a53ac109 | 31 | C12832_LCD lcd; |
kwstasfane1 | 0:1fe3a53ac109 | 32 | |
kwstasfane1 | 0:1fe3a53ac109 | 33 | // Function Prototypes: |
kwstasfane1 | 0:1fe3a53ac109 | 34 | |
kwstasfane1 | 0:1fe3a53ac109 | 35 | void Tick1_isr (void); |
kwstasfane1 | 0:1fe3a53ac109 | 36 | void TDC_isr (void); |
kwstasfane1 | 0:1fe3a53ac109 | 37 | void Spark_on (void); // set the output Spark (p10) high |
kwstasfane1 | 0:1fe3a53ac109 | 38 | void Spark_off (void); // set it low |
kwstasfane1 | 0:1fe3a53ac109 | 39 | void Ignition(int); |
kwstasfane1 | 0:1fe3a53ac109 | 40 | |
kwstasfane1 | 0:1fe3a53ac109 | 41 | //custom function prototypes |
kwstasfane1 | 0:1fe3a53ac109 | 42 | void advance_calculator(int); |
kwstasfane1 | 0:1fe3a53ac109 | 43 | |
kwstasfane1 | 0:1fe3a53ac109 | 44 | |
kwstasfane1 | 0:1fe3a53ac109 | 45 | // Hardware Definitions: |
kwstasfane1 | 0:1fe3a53ac109 | 46 | |
kwstasfane1 | 0:1fe3a53ac109 | 47 | Ticker Tick; //Tick produces a periodic interrupt |
kwstasfane1 | 0:1fe3a53ac109 | 48 | DigitalOut Spark(p10); //Spark Output to Flywheel Board |
kwstasfane1 | 0:1fe3a53ac109 | 49 | InterruptIn tdc(p9); //Pulse from TDC Sensor on Flywheel Board |
kwstasfane1 | 0:1fe3a53ac109 | 50 | |
kwstasfane1 | 0:1fe3a53ac109 | 51 | Timeout StartSpark; //one-off interrupt to set spark o/p high |
kwstasfane1 | 0:1fe3a53ac109 | 52 | Timeout EndSpark; // and this one sets spark low |
kwstasfane1 | 0:1fe3a53ac109 | 53 | |
kwstasfane1 | 0:1fe3a53ac109 | 54 | //Function Declarations: |
kwstasfane1 | 0:1fe3a53ac109 | 55 | void Ignition(int lag) |
kwstasfane1 | 0:1fe3a53ac109 | 56 | { |
kwstasfane1 | 0:1fe3a53ac109 | 57 | StartSpark.attach_us(&Spark_on, lag) ; // set time of Spark |
kwstasfane1 | 0:1fe3a53ac109 | 58 | EndSpark.attach_us(&Spark_off, lag + 200); //and duration of spark at 200usec |
kwstasfane1 | 0:1fe3a53ac109 | 59 | } |
kwstasfane1 | 0:1fe3a53ac109 | 60 | |
kwstasfane1 | 0:1fe3a53ac109 | 61 | void Spark_on() |
kwstasfane1 | 0:1fe3a53ac109 | 62 | { |
kwstasfane1 | 0:1fe3a53ac109 | 63 | Spark = 1; |
kwstasfane1 | 0:1fe3a53ac109 | 64 | } |
kwstasfane1 | 0:1fe3a53ac109 | 65 | |
kwstasfane1 | 0:1fe3a53ac109 | 66 | void Spark_off() |
kwstasfane1 | 0:1fe3a53ac109 | 67 | { |
kwstasfane1 | 0:1fe3a53ac109 | 68 | Spark = 0; |
kwstasfane1 | 0:1fe3a53ac109 | 69 | } |
kwstasfane1 | 0:1fe3a53ac109 | 70 | |
kwstasfane1 | 0:1fe3a53ac109 | 71 | |
kwstasfane1 | 0:1fe3a53ac109 | 72 | void Tick1_isr() |
kwstasfane1 | 0:1fe3a53ac109 | 73 | //Interrupt cause by Ticker |
kwstasfane1 | 0:1fe3a53ac109 | 74 | //Increments count every 100usec |
kwstasfane1 | 0:1fe3a53ac109 | 75 | { |
kwstasfane1 | 0:1fe3a53ac109 | 76 | count1++; |
kwstasfane1 | 0:1fe3a53ac109 | 77 | } |
kwstasfane1 | 0:1fe3a53ac109 | 78 | |
kwstasfane1 | 0:1fe3a53ac109 | 79 | void TDC_isr() |
kwstasfane1 | 0:1fe3a53ac109 | 80 | //Interrupt caused by +ve edge on TDC |
kwstasfane1 | 0:1fe3a53ac109 | 81 | //Captured value = period |
kwstasfane1 | 0:1fe3a53ac109 | 82 | { |
kwstasfane1 | 0:1fe3a53ac109 | 83 | period = count1; //Capture time since last TDC |
kwstasfane1 | 0:1fe3a53ac109 | 84 | count1 = 0; |
kwstasfane1 | 0:1fe3a53ac109 | 85 | pflag = 1; // New value of period available |
kwstasfane1 | 0:1fe3a53ac109 | 86 | } |
kwstasfane1 | 0:1fe3a53ac109 | 87 | |
kwstasfane1 | 0:1fe3a53ac109 | 88 | //custom functions declaration |
kwstasfane1 | 0:1fe3a53ac109 | 89 | void advance_calculator(int rpm) |
kwstasfane1 | 0:1fe3a53ac109 | 90 | { |
kwstasfane1 | 0:1fe3a53ac109 | 91 | if(rpm < rpm_range[0]) |
kwstasfane1 | 0:1fe3a53ac109 | 92 | { |
kwstasfane1 | 0:1fe3a53ac109 | 93 | spark_advance = 360 - map[0]; |
kwstasfane1 | 0:1fe3a53ac109 | 94 | } |
kwstasfane1 | 0:1fe3a53ac109 | 95 | else if(rpm >= rpm_range[0] && rpm < rpm_range[1]) |
kwstasfane1 | 0:1fe3a53ac109 | 96 | { |
kwstasfane1 | 0:1fe3a53ac109 | 97 | spark_advance = 360 - map[0]; |
kwstasfane1 | 0:1fe3a53ac109 | 98 | } |
kwstasfane1 | 0:1fe3a53ac109 | 99 | else if(rpm >= rpm_range[1] && rpm < rpm_range[2]) |
kwstasfane1 | 0:1fe3a53ac109 | 100 | { |
kwstasfane1 | 0:1fe3a53ac109 | 101 | spark_advance = 360 - map[1]; |
kwstasfane1 | 0:1fe3a53ac109 | 102 | } |
kwstasfane1 | 0:1fe3a53ac109 | 103 | else if(rpm >= rpm_range[2] && rpm < rpm_range[3]) |
kwstasfane1 | 0:1fe3a53ac109 | 104 | { |
kwstasfane1 | 0:1fe3a53ac109 | 105 | spark_advance = 360 - map[2]; |
kwstasfane1 | 0:1fe3a53ac109 | 106 | } |
kwstasfane1 | 0:1fe3a53ac109 | 107 | else if(rpm >= rpm_range[3] && rpm < rpm_range[4]) |
kwstasfane1 | 0:1fe3a53ac109 | 108 | { |
kwstasfane1 | 0:1fe3a53ac109 | 109 | spark_advance = 360 - map[3]; |
kwstasfane1 | 0:1fe3a53ac109 | 110 | } |
kwstasfane1 | 0:1fe3a53ac109 | 111 | else if(rpm >= rpm_range[4] && rpm < rpm_range[5]) |
kwstasfane1 | 0:1fe3a53ac109 | 112 | { |
kwstasfane1 | 0:1fe3a53ac109 | 113 | spark_advance = 360 - map[4]; |
kwstasfane1 | 0:1fe3a53ac109 | 114 | } |
kwstasfane1 | 0:1fe3a53ac109 | 115 | else if(rpm >= rpm_range[5] && rpm < rpm_range[6]) |
kwstasfane1 | 0:1fe3a53ac109 | 116 | { |
kwstasfane1 | 0:1fe3a53ac109 | 117 | spark_advance = 360 - map[5]; |
kwstasfane1 | 0:1fe3a53ac109 | 118 | } |
kwstasfane1 | 0:1fe3a53ac109 | 119 | else if(rpm >= rpm_range[6] && rpm < rpm_range[7]) |
kwstasfane1 | 0:1fe3a53ac109 | 120 | { |
kwstasfane1 | 0:1fe3a53ac109 | 121 | spark_advance = 360 - map[6]; |
kwstasfane1 | 0:1fe3a53ac109 | 122 | } |
kwstasfane1 | 0:1fe3a53ac109 | 123 | else if(rpm >= rpm_range[7] && rpm < rpm_range[8]) |
kwstasfane1 | 0:1fe3a53ac109 | 124 | { |
kwstasfane1 | 0:1fe3a53ac109 | 125 | spark_advance = 360 - map[7]; |
kwstasfane1 | 0:1fe3a53ac109 | 126 | } |
kwstasfane1 | 0:1fe3a53ac109 | 127 | else if(rpm >= rpm_range[8] && rpm < rpm_range[9]) |
kwstasfane1 | 0:1fe3a53ac109 | 128 | { |
kwstasfane1 | 0:1fe3a53ac109 | 129 | spark_advance = 360 - map[8]; |
kwstasfane1 | 0:1fe3a53ac109 | 130 | } |
kwstasfane1 | 0:1fe3a53ac109 | 131 | else if(rpm >= rpm_range[9] && rpm < rpm_range[10]) |
kwstasfane1 | 0:1fe3a53ac109 | 132 | { |
kwstasfane1 | 0:1fe3a53ac109 | 133 | spark_advance = 360 - map[9]; |
kwstasfane1 | 0:1fe3a53ac109 | 134 | } |
kwstasfane1 | 0:1fe3a53ac109 | 135 | else //this computes the angle for any speeds higher than 1500RPM (still same angle as 1500RPM) |
kwstasfane1 | 0:1fe3a53ac109 | 136 | { |
kwstasfane1 | 0:1fe3a53ac109 | 137 | spark_advance = 360 - map[10]; |
kwstasfane1 | 0:1fe3a53ac109 | 138 | } |
kwstasfane1 | 0:1fe3a53ac109 | 139 | } |
kwstasfane1 | 0:1fe3a53ac109 | 140 | |
kwstasfane1 | 0:1fe3a53ac109 | 141 | |
kwstasfane1 | 0:1fe3a53ac109 | 142 | int main() |
kwstasfane1 | 0:1fe3a53ac109 | 143 | { |
kwstasfane1 | 0:1fe3a53ac109 | 144 | |
kwstasfane1 | 0:1fe3a53ac109 | 145 | //Produce regular clock tick for timing period: |
kwstasfane1 | 0:1fe3a53ac109 | 146 | Tick.attach_us(&Tick1_isr, 100); //initializes the ticker with period of 100usec |
kwstasfane1 | 0:1fe3a53ac109 | 147 | //and attaches it to Tick1 ISR |
kwstasfane1 | 0:1fe3a53ac109 | 148 | |
kwstasfane1 | 0:1fe3a53ac109 | 149 | tdc.rise(&TDC_isr); // Generate Interrupt on each TDC pulse |
kwstasfane1 | 0:1fe3a53ac109 | 150 | |
kwstasfane1 | 0:1fe3a53ac109 | 151 | lcd.cls(); |
kwstasfane1 | 0:1fe3a53ac109 | 152 | //advance_calculator(rpm); //called for the first time, since rpm is 0, 5 will be assigned to advance angle |
kwstasfane1 | 0:1fe3a53ac109 | 153 | |
kwstasfane1 | 0:1fe3a53ac109 | 154 | while(1) { |
kwstasfane1 | 0:1fe3a53ac109 | 155 | |
kwstasfane1 | 0:1fe3a53ac109 | 156 | |
kwstasfane1 | 0:1fe3a53ac109 | 157 | //spark_advance = 360 - 15; //360(TDC point) - advance angle = spark_advance |
kwstasfane1 | 0:1fe3a53ac109 | 158 | advance_calculator(rpm); |
kwstasfane1 | 0:1fe3a53ac109 | 159 | |
kwstasfane1 | 0:1fe3a53ac109 | 160 | if (pflag == 1) // new timing data? |
kwstasfane1 | 0:1fe3a53ac109 | 161 | { |
kwstasfane1 | 0:1fe3a53ac109 | 162 | //lag = (period*100)*180/360; // Period is in units of 100usec |
kwstasfane1 | 0:1fe3a53ac109 | 163 | lag = (period*100)*spark_advance/360; // Period is in units of 100usec |
kwstasfane1 | 0:1fe3a53ac109 | 164 | Ignition(lag); |
kwstasfane1 | 0:1fe3a53ac109 | 165 | |
kwstasfane1 | 0:1fe3a53ac109 | 166 | //your code here to calculate rpm |
kwstasfane1 | 0:1fe3a53ac109 | 167 | rpm = (1/(period*100e-6))*60; //1 period = 1*100us(period counter incrments every 100us, this conversion is needed to get the Hz frequency |
kwstasfane1 | 0:1fe3a53ac109 | 168 | |
kwstasfane1 | 0:1fe3a53ac109 | 169 | lcd.locate(0,0); |
kwstasfane1 | 0:1fe3a53ac109 | 170 | lcd.printf("Period(T): %4.2d ms", period/10); // display captured data in ms to match the osciloscope reading |
kwstasfane1 | 0:1fe3a53ac109 | 171 | lcd.locate(0,11); |
kwstasfane1 | 0:1fe3a53ac109 | 172 | lcd.printf("Speed(RPM): %4.2d ", rpm); // display captured data |
kwstasfane1 | 0:1fe3a53ac109 | 173 | |
kwstasfane1 | 0:1fe3a53ac109 | 174 | //this is used to print the advance angle for troubleshooting purposes |
kwstasfane1 | 0:1fe3a53ac109 | 175 | lcd.locate(0,22); |
kwstasfane1 | 0:1fe3a53ac109 | 176 | lcd.printf("Advance(deg): %4.2d ", 360-spark_advance); // display captured data |
kwstasfane1 | 0:1fe3a53ac109 | 177 | pflag = 0; //reset flag |
kwstasfane1 | 0:1fe3a53ac109 | 178 | } |
kwstasfane1 | 0:1fe3a53ac109 | 179 | |
kwstasfane1 | 0:1fe3a53ac109 | 180 | } |
kwstasfane1 | 0:1fe3a53ac109 | 181 | } |
kwstasfane1 | 0:1fe3a53ac109 | 182 |