Subversion Repositories EDIS_Ignition

Rev

Rev 20 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 20 Rev 21
Line 17... Line 17...
17
 */
17
 */
18
/* USER CODE END Header */
18
/* USER CODE END Header */
19
/* Includes ------------------------------------------------------------------*/
19
/* Includes ------------------------------------------------------------------*/
20
#include "main.h"
20
#include "main.h"
21
 
21
 
-
 
22
// #define TEST_CODE
-
 
23
 
22
/* Private includes ----------------------------------------------------------*/
24
/* Private includes ----------------------------------------------------------*/
23
/* USER CODE BEGIN Includes */
25
/* USER CODE BEGIN Includes */
24
#include "memory.h"
26
#include "memory.h"
25
#include "display.h"
27
#include "display.h"
26
#include "bmp280driver.h"
28
#include "bmp280driver.h"
Line 79... Line 81...
79
// 6 degrees error in timing wheel this time ..
81
// 6 degrees error in timing wheel this time ..
80
int const TIMING_OFFSET = -6 * TIMING_SCALE;
82
int const TIMING_OFFSET = -6 * TIMING_SCALE;
81
 
83
 
82
// Switch over to double sparking
84
// Switch over to double sparking
83
int const DOUBLE_SPARK_RPM = 1200;
85
int const DOUBLE_SPARK_RPM = 1200;
84
// default atmospheric pressure
86
// default atmospheric pressure - should be 1014
85
uint32_t const DEFAULT_ATMOSPHERIC_PRESSURE = 1014 * 100;
87
uint32_t const DEFAULT_ATMOSPHERIC_PRESSURE = 1014 * 100;
86
 
88
 
87
uint32_t const DEFAULT_ATMOSPHERIC_TEMPERATURE = 25 * 100;
89
uint32_t const DEFAULT_ATMOSPHERIC_TEMPERATURE = 25 * 100;
88
 
90
 
89
// Serial buffers
91
// Serial buffers
Line 110... Line 112...
110
void libPLXcallbackRecievedData(PLX_SensorInfo *info)
112
void libPLXcallbackRecievedData(PLX_SensorInfo *info)
111
{
113
{
112
  (void)info;
114
  (void)info;
113
}
115
}
114
 
116
 
115
void libPLXcallbackSendUserData()
117
void libPLXcallbackSendUserData(struct usart_ctl *handle)
116
{
118
{
117
  // send MAP
119
  // send MAP
118
  PLX_SensorInfo info;
120
  PLX_SensorInfo info;
119
  ConvToPLXInstance(libPLXgetNextInstance(PLX_MAP), &info);
121
  ConvToPLXInstance(libPLXgetNextInstance(PLX_MAP), &info);
120
  ConvToPLXAddr(PLX_MAP, &info);
122
  ConvToPLXAddr(PLX_MAP, &info);
121
  ConvToPLXReading(ConveriMFDData2Raw(PLX_MAP, PRESSURE_kPa, (float)(compensatedManifoldPressure) / 100.0), &info);
123
  ConvToPLXReading(ConveriMFDData2Raw(PLX_MAP, PRESSURE_kPa, (float)(compensatedManifoldPressure) / 100.0), &info);
122
  sendInfo(&uc2, &info);
124
  sendInfo(handle, &info);
123
 
125
 
-
 
126
  // send timing
124
  ConvToPLXInstance(libPLXgetNextInstance(PLX_Timing), &info);
127
  ConvToPLXInstance(libPLXgetNextInstance(PLX_Timing), &info);
125
  ConvToPLXAddr(PLX_Timing, &info);
128
  ConvToPLXAddr(PLX_Timing, &info);
126
  ConvToPLXReading(ConveriMFDData2Raw(PLX_Timing, 0, (float)(timing) / TIMING_SCALE), &info);
129
  ConvToPLXReading(ConveriMFDData2Raw(PLX_Timing, 0, (float)(timing) / TIMING_SCALE), &info);
127
  sendInfo(&uc2, &info);
130
  sendInfo(handle, &info);
-
 
131
 
-
 
132
  // send temperature
-
 
133
  ConvToPLXInstance(libPLXgetNextInstance(PLX_AIT), &info);
-
 
134
  ConvToPLXAddr(PLX_AIT, &info);
-
 
135
  ConvToPLXReading(ConveriMFDData2Raw(PLX_AIT, 0, (float)(compensatedTemperature) / 100.0), &info);
-
 
136
  sendInfo(handle, &info);
128
}
137
}
129
 
138
 
130
void triggerSAW()
139
void triggerSAW()
131
{
140
{
132
  // trigger SAW timer, timer 1##pragma endregion
141
  // trigger SAW timer, timer 1##pragma endregion
Line 206... Line 215...
206
 
215
 
207
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 5); // delay of 5 uS
216
  __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 5); // delay of 5 uS
208
 
217
 
209
  // HAL_I2C_ClearBusyFlagErrata_2_14_7(&hi2c1);
218
  // HAL_I2C_ClearBusyFlagErrata_2_14_7(&hi2c1);
210
  MX_I2C1_Init();
219
  MX_I2C1_Init();
211
  init_bmp(&hi2c1, &bmp);
220
  init_bmp(&hi2c1, &bmpManifold, &confManifold);
212
  init_bmp(&hi2c1, &bmpAtm);
221
  init_bmp(&hi2c1, &bmpAtmosphere, &confAtmosphere);
213
 
222
 
214
  uint32_t lastTick = HAL_GetTick();
223
  uint32_t nextTick = HAL_GetTick();
215
 
-
 
216
  uint32_t displayOff = lastTick + 10000;
224
  uint32_t displayOff = nextTick + 10000;
217
  uint32_t displayReinitialise = lastTick + DISPLAY_REINITIALISE; // every minute, reinitialise display because of risk of noise
225
  uint32_t displayReinitialise = nextTick + DISPLAY_REINITIALISE; // every minute, reinitialise display because of risk of noise
218
 
226
 
219
  uint8_t intensity = 2;
227
  uint8_t intensity = 2;
220
 
228
 
221
  ResetRxBuffer(&uc2);
229
  ResetRxBuffer(&uc2);
222
 
230
 
Line 233... Line 241...
233
    int button = HAL_GPIO_ReadPin(PUSHBUTTON_GPIO_Port, PUSHBUTTON_Pin) == GPIO_PIN_RESET;
241
    int button = HAL_GPIO_ReadPin(PUSHBUTTON_GPIO_Port, PUSHBUTTON_Pin) == GPIO_PIN_RESET;
234
 
242
 
235
    if (button)
243
    if (button)
236
    {
244
    {
237
      intensity = 2;
245
      intensity = 2;
238
      displayOff = lastTick + 30000;
246
      displayOff = HAL_GetTick() + 30000;
239
    }
247
    }
240
 
248
 
241
    switch (intensity)
249
    switch (intensity)
242
    {
250
    {
243
    case 2:
251
    case 2:
244
      if (HAL_GetTick() > displayOff)
252
      if (HAL_GetTick() > displayOff)
245
      {
253
      {
246
        intensity = 1;
254
        intensity = 1;
247
        displayOff = lastTick + 60000;
255
        displayOff += 60000;
248
      }
256
      }
249
 
257
 
250
      break;
258
      break;
251
    case 1:
259
    case 1:
252
      if (HAL_GetTick() > displayOff)
260
      if (HAL_GetTick() > displayOff)
Line 263... Line 271...
263
      cc_display(0, intensity, 1);
271
      cc_display(0, intensity, 1);
264
    }
272
    }
265
    else
273
    else
266
      cc_display(0, intensity, 0);
274
      cc_display(0, intensity, 0);
267
 
275
 
268
    if (HAL_GetTick() - lastTick > T100MS)
276
    if (HAL_GetTick() > nextTick)
269
    {
277
    {
270
      lastTick = HAL_GetTick();
278
      nextTick = HAL_GetTick() + T100MS;
271
      /* Reading the raw data from sensor */
-
 
272
      struct bmp280_uncomp_data ucomp_data;
-
 
273
 
-
 
274
      uint8_t rslt = bmp280_get_uncomp_data(&ucomp_data, &bmp);
-
 
275
 
-
 
276
      uint8_t manifoldStatus = 1;
279
      uint8_t manifoldStatus = 1;
277
      uint8_t temperatureStatus = 1;
280
      uint8_t temperatureStatus = 1;
278
      uint8_t atmosphericStatus = 1;
281
      uint8_t atmosphericStatus = 1;
-
 
282
      /* Reading the raw data from manifold sensor */
-
 
283
      struct bmp280_uncomp_data ucomp_data;
-
 
284
 
-
 
285
      uint8_t rslt = bmp280_get_uncomp_data(&ucomp_data, &bmpManifold);
279
 
286
 
280
      if (rslt == BMP280_OK)
287
      if (rslt == BMP280_OK)
281
      {
288
      {
282
        manifoldStatus = bmp280_get_comp_pres_32bit(&compensatedManifoldPressure, ucomp_data.uncomp_press, &bmp);
289
        // always calculate temperature then pressure so the pressure is correctly calibrated
283
 
-
 
284
        temperatureStatus = bmp280_get_comp_temp_32bit(&compensatedTemperature, ucomp_data.uncomp_temp, &bmp);
290
        temperatureStatus = bmp280_get_comp_temp_32bit(&compensatedTemperature, ucomp_data.uncomp_temp, &bmpManifold);
285
 
-
 
286
#if defined TEST_CODE
-
 
287
        compensatedManifoldPressure = 100000;
291
        manifoldStatus = bmp280_get_comp_pres_32bit(&compensatedManifoldPressure, ucomp_data.uncomp_press, &bmpManifold);
288
        compensatedTemperature = 4000;
-
 
289
#endif
-
 
290
      }
292
      }
291
      // get atmospheric data
293
      // get atmospheric data
-
 
294
      rslt = bmp280_get_uncomp_data(&ucomp_data, &bmpAtmosphere);
-
 
295
      // now to read the environmental pressure
292
      if (rslt == BMP280_OK)
296
      if (rslt == BMP280_OK)
293
      {
297
      {
294
        rslt = bmp280_get_uncomp_data(&ucomp_data, &bmpAtm);
298
        // always calculate temperature then pressure so the pressure is correctly calibrated
295
        // now to read the environmental pressure
299
        temperatureStatus = bmp280_get_comp_temp_32bit(&compensatedTemperature, ucomp_data.uncomp_temp, &bmpAtmosphere);
296
        if (rslt == BMP280_OK)
-
 
297
          atmosphericStatus = bmp280_get_comp_pres_32bit(&compensatedAtmosphericPressure, ucomp_data.uncomp_press, &bmpAtm);
300
        atmosphericStatus = bmp280_get_comp_pres_32bit(&compensatedAtmosphericPressure, ucomp_data.uncomp_press, &bmpAtmosphere);
298
      }
301
      }
299
      if (manifoldStatus != BMP280_OK)
302
      if (manifoldStatus != BMP280_OK)
300
        compensatedManifoldPressure = DEFAULT_ATMOSPHERIC_PRESSURE;
303
        compensatedManifoldPressure = DEFAULT_ATMOSPHERIC_PRESSURE;
301
      if (temperatureStatus != BMP280_OK)
304
      if (temperatureStatus != BMP280_OK)
302
        compensatedTemperature = DEFAULT_ATMOSPHERIC_TEMPERATURE;
305
        compensatedTemperature = DEFAULT_ATMOSPHERIC_TEMPERATURE;
303
      if (atmosphericStatus != BMP280_OK)
306
      if (atmosphericStatus != BMP280_OK)
304
        compensatedAtmosphericPressure = DEFAULT_ATMOSPHERIC_PRESSURE;
307
        compensatedAtmosphericPressure = DEFAULT_ATMOSPHERIC_PRESSURE;
-
 
308
#if defined TEST_CODE
-
 
309
      compensatedManifoldPressure = 100000;
-
 
310
      compensatedTemperature = 4000;
-
 
311
#endif
305
 
312
 
306
      uint32_t vacuum = compensatedAtmosphericPressure - compensatedManifoldPressure;
313
      int32_t vacuum = compensatedAtmosphericPressure - compensatedManifoldPressure;
-
 
314
      if (vacuum < 0)
-
 
315
        vacuum = 0;
307
      // if the BMP280 pressure is good, then allow it through, otherwise drop to
316
      // if the BMP280 pressure is good, then allow it through, otherwise drop to
308
      // centrifugal advance only.
317
      // centrifugal advance only.
309
      // feed difference and add default pressure
318
      // feed difference and add default pressure
310
      cc_feed_env(vacuum + DEFAULT_ATMOSPHERIC_PRESSURE, compensatedTemperature);
319
      cc_feed_env(compensatedAtmosphericPressure, 100000 - vacuum, compensatedTemperature);
311
 
320
 
312
      // compute RPM value, feed to display
321
      // compute RPM value, feed to display
313
#if defined TEST_CODE
322
#if defined TEST_CODE
314
      int rpm = 1000;
323
      int rpm = 1000;
315
#else
324
#else
Line 317... Line 326...
317
#endif
326
#endif
318
      if (rpm > 0)
327
      if (rpm > 0)
319
      {
328
      {
320
        cc_feed_rpm(rpm);
329
        cc_feed_rpm(rpm);
321
        // compute timing value, feed to display
330
        // compute timing value, feed to display
322
        timing = mapTiming(rpm, 1000 - vacuum / 100);
331
        timing = mapTiming(rpm, vacuum / 100);
323
        cc_feed_timing(timing);
332
        cc_feed_timing(timing);
324
        // enable double spark below 1200 rpm
333
        // enable double spark below 1200 rpm
325
        int microsecs = mapTimingToMicroseconds(timing + TIMING_OFFSET, rpm > DOUBLE_SPARK_RPM);
334
        int microsecs = mapTimingToMicroseconds(timing + TIMING_OFFSET, rpm < DOUBLE_SPARK_RPM);
326
        __HAL_TIM_SET_AUTORELOAD(&htim1, microsecs + SAW_DELAY);
335
        __HAL_TIM_SET_AUTORELOAD(&htim1, microsecs + SAW_DELAY);
327
      }
336
      }
328
    }
337
    }
329
 
338
 
330
    // Handle PLX
339
    // Handle PLX