Subversion Repositories EngineBay2

Rev

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

Rev 53 Rev 54
Line 154... Line 154...
154
  float adc_vref = STM32REF * (4096.0 * Scale) / adc_val; // the estimate for checking
154
  float adc_vref = STM32REF * (4096.0 * Scale) / adc_val; // the estimate for checking
155
 
155
 
156
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
156
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
157
}
157
}
158
 
158
 
159
void ProcessRPM(void)
159
void ProcessRPM(struct usart_ctl * handle)
160
{
160
{
161
  static unsigned int Coded_RPM = 0;
161
  static unsigned int Coded_RPM = 0;
162
  int32_t rpm = CalculateRPM();
162
  int32_t rpm = CalculateRPM();
163
  // suppress the EDIS "heartbeat" 90 RPM
163
  // suppress the EDIS "heartbeat" 90 RPM
164
  if (rpm >= 100)
164
  if (rpm >= 100)
165
    Coded_RPM = rpm / 19.55;
165
    Coded_RPM = rpm / 19.55;
166
 
166
 
167
  // send the current RPM *calculation
167
  // send the current RPM *calculation
168
 
-
 
169
  sendPlxInfo(& uc1, PLX_RPM, Coded_RPM/ Scale);
168
  sendPlxInfo(handle, PLX_RPM, Coded_RPM/ Scale);
170
 
-
 
171
 
-
 
172
}
169
}
173
 
170
 
174
// this uses a MAX6675 which is a simple 16 bit read
171
// this uses a MAX6675 which is a simple 16 bit read
175
// 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
176
// must wait > 0.22 seconds between conversion attempts as this is the measurement time
173
// must wait > 0.22 seconds between conversion attempts as this is the measurement time
Line 182... Line 179...
182
 
179
 
183
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};
184
 
181
 
185
/// \param item The array index to send
182
/// \param item The array index to send
186
/// \param type the code to use for this observation
183
/// \param type the code to use for this observation
187
void ProcessTemp(char item, enum PLX_Observations type)
184
void ProcessTemp(struct usart_ctl * handle,char item, enum PLX_Observations type)
188
{
185
{
189
  if (item > NUM_SPI_TEMP_SENS)
186
  if (item > NUM_SPI_TEMP_SENS)
190
    return;
187
    return;
191
 
188
 
192
  sendPlxInfo(& uc1, type , Temp_Observations[(int)item]);
189
  sendPlxInfo(handle, type , Temp_Observations[(int)item]);
193
 
190
 
194
}
191
}
195
 
192
 
196
/// \brief Reset the temperature chip select system
193
/// \brief Reset the temperature chip select system
197
void resetTempCS(void)
194
void resetTempCS(void)
Line 260... Line 257...
260
  }
257
  }
261
}
258
}
262
 
259
 
263
// 1023 is 20.00 volts.
260
// 1023 is 20.00 volts.
264
/// \param item - used to lookup the index of the local reading
261
/// \param item - used to lookup the index of the local reading
265
void ProcessBatteryVoltage(int item)
262
void ProcessBatteryVoltage(struct usart_ctl * handle, int item)
266
{
263
{
267
  float reading = FILT_Samples[item] * ADC_Scale;
264
  float reading = FILT_Samples[item] * ADC_Scale;
268
  reading = reading * 7.8125; // real voltage
265
  reading = reading * 7.8125; // real voltage
269
  reading = reading * 51.15;  // PLC scaling =  1023/20
266
  reading = reading * 51.15;  // PLC scaling =  1023/20
270
 
267
 
271
  sendPlxInfo(& uc1, PLX_Volts, reading);
268
  sendPlxInfo(handle, PLX_Volts, reading);
272
 
269
 
273
}
270
}
274
 
271
 
275
void ProcessCPUTemperature(void)
272
void ProcessCPUTemperature(struct usart_ctl * handle)
276
{
273
{
277
  // this is defined in the STM32F103 reference manual . #
274
  // this is defined in the STM32F103 reference manual . #
278
  // V25 = 1.43 volts
275
  // V25 = 1.43 volts
279
  // Avg_slope = 4.3mV /degree C
276
  // Avg_slope = 4.3mV /degree C
280
  // temperature = {(V25 - VSENSE) / Avg_Slope} + 25
277
  // temperature = {(V25 - VSENSE) / Avg_Slope} + 25
Line 285... Line 282...
285
  /* renormalise temperature value to account for different ADC Vref  : normalise to that which we would get for a 3000mV reference */
282
  /* renormalise temperature value to account for different ADC Vref  : normalise to that which we would get for a 3000mV reference */
286
  temp_val = (1.43 - temp_val) / 4.3e-3 + 25;
283
  temp_val = (1.43 - temp_val) / 4.3e-3 + 25;
287
 
284
 
288
  int32_t result = temp_val;
285
  int32_t result = temp_val;
289
 
286
 
290
  sendPlxInfo(& uc1, PLX_FluidTemp, result);
287
  sendPlxInfo(handle, PLX_FluidTemp, result);
291
 
288
 
292
}
289
}
293
 
290
 
294
// the MAP sensor is giving us a reading of
291
// the MAP sensor is giving us a reading of
295
// 4.6 volts for 1019mB or 2.27 volts at the ADC input (resistive divider by 2.016)
292
// 4.6 volts for 1019mB or 2.27 volts at the ADC input (resistive divider by 2.016)
Line 298... Line 295...
298
// Real   Displayed
295
// Real   Displayed
299
// 989    968
296
// 989    968
300
// 994.1    986
297
// 994.1    986
301
// 992.3  984
298
// 992.3  984
302
 
299
 
303
void ProcessMAP(void)
300
void ProcessMAP(struct usart_ctl * handle)
304
{
301
{
305
  // Using ADC_Samples[3] as the MAP input
302
  // Using ADC_Samples[3] as the MAP input
306
  float reading = FILT_Samples[ADC_MAP_CHAN] * ADC_Scale;
303
  float reading = FILT_Samples[ADC_MAP_CHAN] * ADC_Scale;
307
  reading = reading * 2.016; // real voltage
304
  reading = reading * 2.016; // real voltage
308
  // values computed from slope / intercept of map.ods
305
  // values computed from slope / intercept of map.ods
309
  // 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
306
  // 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
310
  // using a pressure gauge.
307
  // using a pressure gauge.
311
  reading = (reading) * 150 + 326;
308
  reading = (reading) * 150 + 326;
312
 
309
 
313
  sendPlxInfo(& uc1, PLX_MAP, reading);
310
  sendPlxInfo(handle, PLX_MAP, reading);
314
 
311
 
315
}
312
}
316
 
313
 
317
// the Oil pressi sensor is giving us a reading of
314
// 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)
315
// 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
316
// 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.
317
// an observation of 1024 is 200PSI, so observation of 512 is 100 PSI.
321
 
318
 
322
void ProcessOilPress(void)
319
void ProcessOilPress(struct usart_ctl * handle)
323
{
320
{
324
  // Using ADC_Samples[2] as the MAP input
321
  // Using ADC_Samples[2] as the MAP input
325
  float reading = FILT_Samples[ADC_PRESSURE_CHAN] * ADC_Scale;
322
  float reading = FILT_Samples[ADC_PRESSURE_CHAN] * ADC_Scale;
326
  reading = reading * 2.00;            // real voltage
323
  reading = reading * 2.00;            // real voltage
327
  reading = (reading - 0.5) * 512 / 4; // this is 1023 * 100/200
324
  reading = (reading - 0.5) * 512 / 4; // this is 1023 * 100/200
328
 
325
 
329
  sendPlxInfo(& uc1, PLX_FluidPressure, reading);
326
  sendPlxInfo(handle, PLX_FluidPressure, reading);
330
 
327
 
331
}
328
}
332
 
329
 
333
 
330
 
334
void libPLXcallbackSendUserData()
331
void libPLXcallbackSendUserData(struct usart_ctl * handle)
335
{
332
{
336
  // send the observations
333
  // send the observations
337
  ProcessRPM();
334
  ProcessRPM(handle);
338
  ProcessTemp(0, PLX_X_CHT);
335
  ProcessTemp(handle,0, PLX_X_CHT);
339
  ProcessTemp(1, PLX_X_CHT);
336
  ProcessTemp(handle,1, PLX_X_CHT);
340
  ProcessTemp(2, PLX_AIT);
337
  ProcessTemp(handle,2, PLX_AIT);
341
  ProcessTemp(3, PLX_AIT);
338
  ProcessTemp(handle,3, PLX_AIT);
342
  ProcessBatteryVoltage(0); // Batt 1
339
  ProcessBatteryVoltage(handle,0); // Batt 1
343
  ProcessBatteryVoltage(1); // Batt 2
340
  ProcessBatteryVoltage(handle,1); // Batt 2
344
  ProcessCPUTemperature();  //  built in temperature sensor
341
  ProcessCPUTemperature(handle);  //  built in temperature sensor
345
 
-
 
346
  ProcessMAP();
-
 
347
  ProcessOilPress();
-
 
348
 
342
 
-
 
343
  ProcessMAP(handle);
349
  PutCharSerial(&uc1, PLX_Stop);
344
  ProcessOilPress(handle);
350
}
345
}
351
/* USER CODE END 0 */
346
/* USER CODE END 0 */
352
 
347
 
353
/**
348
/**
354
 * @brief  The application entry point.
349
 * @brief  The application entry point.