Subversion Repositories EngineBay2

Rev

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

Rev 48 Rev 49
Line 20... Line 20...
20
/* Includes ------------------------------------------------------------------*/
20
/* Includes ------------------------------------------------------------------*/
21
#include "main.h"
21
#include "main.h"
22
 
22
 
23
/* Private includes ----------------------------------------------------------*/
23
/* Private includes ----------------------------------------------------------*/
24
/* USER CODE BEGIN Includes */
24
/* USER CODE BEGIN Includes */
-
 
25
#include <string.h>
25
#include "libSerial/serial.h"
26
#include "libSerial/serial.h"
26
#include "libPLX/plx.h"
27
#include "libPLX/plx.h"
27
#include "misc.h"
28
#include "misc.h"
28
 
29
 
29
#include "libIgnTiming/rpm.h"
30
#include "libIgnTiming/rpm.h"
Line 76... Line 77...
76
volatile char TimerFlag = 0;
77
volatile char TimerFlag = 0;
77
 
78
 
78
volatile char NoSerialInCTR = 0; // Missing characters coming in on USART1
79
volatile char NoSerialInCTR = 0; // Missing characters coming in on USART1
79
volatile char NoSerialIn = 0;
80
volatile char NoSerialIn = 0;
80
 
81
 
81
 
-
 
-
 
82
// an array containing values being one more than incoming index for all observations or zero
-
 
83
// if no incoming index
-
 
84
char obsIndex[PLX_MAX_OBS];
82
 
85
 
83
// storage for ADC
86
// storage for ADC
84
uint16_t ADC_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0};
87
uint16_t ADC_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0};
85
 
88
 
86
uint32_t FILT_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0}; // filtered ADC samples * Scale
89
uint32_t FILT_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0}; // filtered ADC samples * Scale
Line 150... Line 153...
150
  float adc_vref = STM32REF * (4096.0 * Scale) / adc_val; // the estimate for checking
153
  float adc_vref = STM32REF * (4096.0 * Scale) / adc_val; // the estimate for checking
151
 
154
 
152
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
155
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
153
}
156
}
154
 
157
 
155
void ProcessRPM(int instance)
158
void ProcessRPM(void)
156
{
159
{
157
  static unsigned int Coded_RPM = 0;
160
  static unsigned int Coded_RPM = 0;
158
  int32_t rpm = CalculateRPM();
161
  int32_t rpm = CalculateRPM();
159
  if (rpm >= 0)
162
  if (rpm >= 0)
160
    Coded_RPM = rpm / 19.55;
163
    Coded_RPM = rpm / 19.55;
161
 
164
 
162
  // send the current RPM *calculation
165
  // send the current RPM *calculation
163
  plx_sendword(PLX_RPM);
166
  plx_sendword(PLX_RPM);
164
  PutCharSerial(&uc1, instance);
167
  PutCharSerial(&uc1, obsIndex[PLX_RPM]++);
165
  plx_sendword(Coded_RPM / Scale);
168
  plx_sendword(Coded_RPM / Scale);
166
}
169
}
167
 
170
 
168
// this uses a MAX6675 which is a simple 16 bit read
171
// this uses a MAX6675 which is a simple 16 bit read
169
// SPI is configured for 8 bits so I can use an OLED display if I need it
172
// SPI is configured for 8 bits so I can use an OLED display if I need it
Line 175... Line 178...
175
#define CORR 3
178
#define CORR 3
176
 
179
 
177
uint16_t Temp_Observations[NUM_SPI_TEMP_SENS] = {[0 ... NUM_SPI_TEMP_SENS - 1] = 0};
180
uint16_t Temp_Observations[NUM_SPI_TEMP_SENS] = {[0 ... NUM_SPI_TEMP_SENS - 1] = 0};
178
 
181
 
179
/// \param item The array index to send
182
/// \param item The array index to send
180
/// \param instance The instance to send over the bus
-
 
181
/// \param type the code to use for this observation
183
/// \param type the code to use for this observation
182
void ProcessTemp(char item, int instance, enum PLX_Observations type)
184
void ProcessTemp(char item, enum PLX_Observations type)
183
{
185
{
184
  if (item > NUM_SPI_TEMP_SENS)
186
  if (item > NUM_SPI_TEMP_SENS)
185
    return;
187
    return;
186
  plx_sendword(type);
188
  plx_sendword(type);
187
  PutCharSerial(&uc1, instance);
189
  PutCharSerial(&uc1, obsIndex[type]++);
188
  plx_sendword(Temp_Observations[(int)item]);
190
  plx_sendword(Temp_Observations[(int)item]);
189
}
191
}
190
 
192
 
191
/// \brief Reset the temperature chip select system
193
/// \brief Reset the temperature chip select system
192
void resetTempCS(void)
194
void resetTempCS(void)
Line 254... Line 256...
254
    HAL_GPIO_Init(SPI1_SCK_GPIO_Port, &GPIO_InitStruct);
256
    HAL_GPIO_Init(SPI1_SCK_GPIO_Port, &GPIO_InitStruct);
255
  }
257
  }
256
}
258
}
257
 
259
 
258
// 1023 is 20.00 volts.
260
// 1023 is 20.00 volts.
-
 
261
/// \param item - used to lookup the index of the local reading
259
void ProcessBatteryVoltage(int instance)
262
void ProcessBatteryVoltage(int item)
260
{
263
{
261
  float reading = FILT_Samples[instance] * ADC_Scale;
264
  float reading = FILT_Samples[item] * ADC_Scale;
262
  reading = reading * 7.8125; // real voltage
265
  reading = reading * 7.8125; // real voltage
263
  reading = reading * 51.15;  // PLC scaling =  1023/20
266
  reading = reading * 51.15;  // PLC scaling =  1023/20
264
 
267
 
265
  plx_sendword(PLX_Volts);
268
  plx_sendword(PLX_Volts);
266
  PutCharSerial(&uc1, instance);
269
  PutCharSerial(&uc1, obsIndex[PLX_Volts]++);
267
  plx_sendword((uint16_t)reading);
270
  plx_sendword((uint16_t)reading);
268
}
271
}
269
 
272
 
270
void ProcessCPUTemperature(int instance)
273
void ProcessCPUTemperature(void)
271
{
274
{
272
  // this is defined in the STM32F103 reference manual . #
275
  // this is defined in the STM32F103 reference manual . #
273
  // V25 = 1.43 volts
276
  // V25 = 1.43 volts
274
  // Avg_slope = 4.3mV /degree C
277
  // Avg_slope = 4.3mV /degree C
275
  // temperature = {(V25 - VSENSE) / Avg_Slope} + 25
278
  // temperature = {(V25 - VSENSE) / Avg_Slope} + 25
Line 284... Line 287...
284
 
287
 
285
  //  int32_t result = 800 * ((int32_t) temp_val - TS_CAL30);
288
  //  int32_t result = 800 * ((int32_t) temp_val - TS_CAL30);
286
  //  result = result / (TS_CAL110 - TS_CAL30) + 300;
289
  //  result = result / (TS_CAL110 - TS_CAL30) + 300;
287
 
290
 
288
  plx_sendword(PLX_FluidTemp);
291
  plx_sendword(PLX_FluidTemp);
289
  PutCharSerial(&uc1, instance);
292
  PutCharSerial(&uc1, obsIndex[PLX_FluidTemp]++);
290
  plx_sendword(result);
293
  plx_sendword(result);
291
}
294
}
292
 
295
 
293
// the MAP sensor is giving us a reading of
296
// the MAP sensor is giving us a reading of
294
// 4.6 volts for 1019mB or 2.27 volts at the ADC input (resistive divider by 2.016)
297
// 4.6 volts for 1019mB or 2.27 volts at the ADC input (resistive divider by 2.016)
Line 297... Line 300...
297
// Real   Displayed
300
// Real   Displayed
298
// 989    968
301
// 989    968
299
// 994.1    986
302
// 994.1    986
300
// 992.3  984
303
// 992.3  984
301
 
304
 
302
void ProcessMAP(int instance)
305
void ProcessMAP(void)
303
{
306
{
304
  // Using ADC_Samples[3] as the MAP input
307
  // Using ADC_Samples[3] as the MAP input
305
  float reading = FILT_Samples[ADC_MAP_CHAN] * ADC_Scale;
308
  float reading = FILT_Samples[ADC_MAP_CHAN] * ADC_Scale;
306
  reading = reading * 2.016; // real voltage
309
  reading = reading * 2.016; // real voltage
307
  // values computed from slope / intercept of map.ods
310
  // values computed from slope / intercept of map.ods
308
  // reading = (reading) * 56.23 + 743.2; // do not assume 0.5 volt offset : reading from 0 to 4.5 instead of 0.5 to 4.5
311
  // reading = (reading) * 56.23 + 743.2; // do not assume 0.5 volt offset : reading from 0 to 4.5 instead of 0.5 to 4.5
309
  // using a pressure gauge.
312
  // using a pressure gauge.
310
  reading = (reading)*150 + 326;
313
  reading = (reading)*150 + 326;
311
 
314
 
312
  plx_sendword(PLX_MAP);
315
  plx_sendword(PLX_MAP);
313
  PutCharSerial(&uc1, instance);
316
  PutCharSerial(&uc1, obsIndex[PLX_MAP]++);
314
  plx_sendword((uint16_t)reading);
317
  plx_sendword((uint16_t)reading);
315
}
318
}
316
 
319
 
317
// the Oil pressi sensor is giving us a reading of
320
// the Oil pressi sensor is giving us a reading of
318
// 4.5 volts for 100 PSI or  2.25 volts at the ADC input (resistive divider by 2.016)
321
// 4.5 volts for 100 PSI or  2.25 volts at the ADC input (resistive divider by 2.016)
319
// I believe the sensor reads  4.5V at 100PSI and 0.5V at  0PSI
322
// I believe the sensor reads  4.5V at 100PSI and 0.5V at  0PSI
320
// an observation of 1024 is 200PSI, so observation of 512 is 100 PSI.
323
// an observation of 1024 is 200PSI, so observation of 512 is 100 PSI.
321
 
324
 
322
void ProcessOilPress(int instance)
325
void ProcessOilPress(void)
323
{
326
{
324
  // Using ADC_Samples[2] as the MAP input
327
  // Using ADC_Samples[2] as the MAP input
325
  float reading = FILT_Samples[ADC_PRESSURE_CHAN] * ADC_Scale;
328
  float reading = FILT_Samples[ADC_PRESSURE_CHAN] * ADC_Scale;
326
  reading = reading * 2.00;            // real voltage
329
  reading = reading * 2.00;            // real voltage
327
  reading = (reading - 0.5) * 512 / 4; // this is 1023 * 100/200
330
  reading = (reading - 0.5) * 512 / 4; // this is 1023 * 100/200
328
 
331
 
329
  plx_sendword(PLX_FluidPressure);
332
  plx_sendword(PLX_FluidPressure);
330
  PutCharSerial(&uc1, instance);
333
  PutCharSerial(&uc1, obsIndex[PLX_FluidPressure]++);
331
  plx_sendword((uint16_t)reading);
334
  plx_sendword((uint16_t)reading);
332
}
335
}
333
 
336
 
334
void ProcessTiming(int instance)
337
void ProcessTiming(void)
335
{
338
{
336
  plx_sendword(PLX_Timing);
339
  plx_sendword(PLX_Timing);
337
  PutCharSerial(&uc1, instance);
340
  PutCharSerial(&uc1, obsIndex[PLX_Timing]++);
338
  plx_sendword(64 - 15); // make it negative
341
  plx_sendword(64 - 15); // make it negative
339
}
342
}
340
 
343
 
341
/* USER CODE END 0 */
344
/* USER CODE END 0 */
342
 
345
 
Line 412... Line 415...
412
  int CalCounter = 0;
415
  int CalCounter = 0;
413
 
416
 
414
  PowerTempTimer = HAL_GetTick() + 1000; /* wait 10 seconds before powering up the CHT sensor */
417
  PowerTempTimer = HAL_GetTick() + 1000; /* wait 10 seconds before powering up the CHT sensor */
415
 
418
 
416
  ResetRxBuffer(&uc1);
419
  ResetRxBuffer(&uc1);
-
 
420
 
-
 
421
  PLX_SensorInfo info; ///< sensor info structure for getting idents
-
 
422
 
-
 
423
  memset(obsIndex, 0, PLX_MAX_OBS); // zero incoming obsevation index
-
 
424
  int infoCount = -1;               ///< counting bytes when we are copying them across
417
  /* USER CODE END 2 */
425
  /* USER CODE END 2 */
418
 
426
 
419
  /* Infinite loop */
427
  /* Infinite loop */
420
  /* USER CODE BEGIN WHILE */
428
  /* USER CODE BEGIN WHILE */
421
  while (1)
429
  while (1)
Line 470... Line 478...
470
        PowerTempTimer = 0;
478
        PowerTempTimer = 0;
471
      }
479
      }
472
    }
480
    }
473
 
481
 
474
    // check to see if we have any incoming data, copy and append if so, if no data then create our own frames.
482
    // check to see if we have any incoming data, copy and append if so, if no data then create our own frames.
475
    int c;
-
 
476
    char send = 0;
483
    char send = 0;
477
 
484
 
478
    // poll the  input for a stop bit or timeout
485
    // poll the  input for a stop bit or timeout
479
    if (PollSerial(&uc1))
486
    if (PollSerial(&uc1))
480
    {
487
    {
481
      resetSerialTimeout();
488
      resetSerialTimeout();
482
      c = GetCharSerial(&uc1);
489
      uint8_t c = GetCharSerial(&uc1);
-
 
490
      // code added to read in all data, extract the observation index maximum for each type of data
-
 
491
      if (c == PLX_Start)
-
 
492
      {
-
 
493
        infoCount = 0;
-
 
494
      }
-
 
495
      else
-
 
496
      {
-
 
497
        info.bytes[infoCount++] = c;
-
 
498
        // process the sensor info field : discover maximum observation index
-
 
499
        if (infoCount == sizeof(PLX_SensorInfo))
-
 
500
        {
-
 
501
          infoCount = 0;
-
 
502
          int addr = ConvPLXAddr(&info);
-
 
503
          if (addr < PLX_MAX_OBS && (obsIndex[addr] <= info.Instance))
-
 
504
            obsIndex[addr] = info.Instance + 1;
-
 
505
        }
-
 
506
      }
-
 
507
 
483
      if (c != PLX_Stop)
508
      if (c != PLX_Stop)
484
      {
509
      {
485
        PutCharSerial(&uc1, c); // echo all but the stop bit
510
        PutCharSerial(&uc1, c); // echo all but the stop bit
486
      }
511
      }
487
      else
512
      else
Line 503... Line 528...
503
    if (send)
528
    if (send)
504
    {
529
    {
505
      send = 0;
530
      send = 0;
506
 
531
 
507
      // send the observations
532
      // send the observations
508
      ProcessRPM(0);
533
      ProcessRPM();
509
      ProcessTemp(0, 0, PLX_X_CHT);
534
      ProcessTemp(0, PLX_X_CHT);
510
      ProcessTemp(1, 1, PLX_X_CHT);
535
      ProcessTemp(1, PLX_X_CHT);
511
      ProcessTemp(2, 0, PLX_AIT);
536
      ProcessTemp(2, PLX_AIT);
512
      ProcessTemp(3, 1, PLX_AIT);
537
      ProcessTemp(3, PLX_AIT);
513
      ProcessBatteryVoltage(0); // Batt 1
538
      ProcessBatteryVoltage(0); // Batt 1
514
      ProcessBatteryVoltage(1); // Batt 2
539
      ProcessBatteryVoltage(1); // Batt 2
515
      ProcessCPUTemperature(0); //  built in temperature sensor
540
      ProcessCPUTemperature();  //  built in temperature sensor
516
 
541
 
517
      ProcessMAP(0);
542
      ProcessMAP();
518
      ProcessOilPress(0);
543
      ProcessOilPress();
-
 
544
      memset(obsIndex, 0, PLX_MAX_OBS); // zero incoming obsevation index
519
 
545
 
520
      PutCharSerial(&uc1, PLX_Stop);
546
      PutCharSerial(&uc1, PLX_Stop);
521
    }
547
    }
522
  }
548
  }
523
 
549