Engine Variable Advance Timing successfull code implementation

Dependencies:   mbed C12832_lcd

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?

UserRevisionLine numberNew 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