Subversion Repositories EngineBay2

Rev

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

Rev 47 Rev 48
Line 24... Line 24...
24
/* USER CODE BEGIN Includes */
24
/* USER CODE BEGIN Includes */
25
#include "libSerial/serial.h"
25
#include "libSerial/serial.h"
26
#include "libPLX/plx.h"
26
#include "libPLX/plx.h"
27
#include "misc.h"
27
#include "misc.h"
28
 
28
 
-
 
29
#include "libIgnTiming/rpm.h"
-
 
30
 
29
/* USER CODE END Includes */
31
/* USER CODE END Includes */
30
 
32
 
31
/* Private typedef -----------------------------------------------------------*/
33
/* Private typedef -----------------------------------------------------------*/
32
/* USER CODE BEGIN PTD */
34
/* USER CODE BEGIN PTD */
33
 
35
 
Line 47... Line 49...
47
 
49
 
48
#define ADC_REF_CHAN 5
50
#define ADC_REF_CHAN 5
49
 
51
 
50
#define ADC_TEMP_CHAN 6
52
#define ADC_TEMP_CHAN 6
51
 
53
 
52
// with a dwell angle of 45 degrees , 4 cylinders and a maximum RPM of 5000
-
 
53
// freq = 5000/60 * 2 = 166Hz.
-
 
54
// the TIM2 counter counts in 10uS increments,
-
 
55
// Need to accumulate low level for a 400th of a second before accepting it as a pulse
-
 
56
#define ACCUM_MAX (RPM_COUNT_RATE / 400)
-
 
57
 
-
 
58
#define GLITCH_MAX (RPM_COUNT_RATE / 2000)
-
 
59
 
-
 
60
#define RPM_AVERAGE 4
-
 
61
 
-
 
62
// wait for about 1 second to decide whether or not starter is on
54
// wait for about 1 second to decide whether or not starter is on
63
 
55
 
64
#define STARTER_LIMIT 10
56
#define STARTER_LIMIT 10
65
 
57
 
66
/* USER CODE END PM */
58
/* USER CODE END PM */
Line 84... Line 76...
84
volatile char TimerFlag = 0;
76
volatile char TimerFlag = 0;
85
 
77
 
86
volatile char NoSerialInCTR = 0; // Missing characters coming in on USART1
78
volatile char NoSerialInCTR = 0; // Missing characters coming in on USART1
87
volatile char NoSerialIn = 0;
79
volatile char NoSerialIn = 0;
88
 
80
 
89
// scale for filtered samples
-
 
90
#define Scale 1024.0
-
 
-
 
81
 
91
 
82
 
92
// storage for ADC
83
// storage for ADC
93
uint16_t ADC_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0};
84
uint16_t ADC_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0};
94
 
85
 
95
uint32_t FILT_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0}; // filtered ADC samples * Scale
86
uint32_t FILT_Samples[ADC_CHANNELS] = {[0 ... ADC_CHANNELS - 1] = 0}; // filtered ADC samples * Scale
Line 102... Line 93...
102
const float STM32REF = 1.2; // 1.2V typical
93
const float STM32REF = 1.2; // 1.2V typical
103
 
94
 
104
// scale factor initially assuming
95
// scale factor initially assuming
105
float ADC_Scale = 1 / (Scale * 4096) * NOM_VREF;
96
float ADC_Scale = 1 / (Scale * 4096) * NOM_VREF;
106
 
97
 
107
// Rev counter processing from original RevCounter Project
-
 
108
uint16_t RPM_Diff = 0;
-
 
109
uint16_t RPM_Count_Latch = 0;
-
 
110
// accumulators
-
 
111
uint16_t RPM_Pulsecount = 0;
-
 
112
unsigned int RPM_FilteredWidth = 0;
-
 
113
 
-
 
114
// last time we detected end of dwell i.e. ignition pulse
-
 
115
uint16_t last_dwell_end = 0;
-
 
116
uint16_t RPM_Period[RPM_AVERAGE];
-
 
117
unsigned int RPM_Period_Ptr = 0;
-
 
118
 
-
 
119
unsigned int Coded_RPM = 0;
98
unsigned int Coded_RPM = 0;
120
unsigned int Coded_CHT = 0;
99
unsigned int Coded_CHT = 0;
121
 
100
 
122
uint32_t PowerTempTimer;
101
uint32_t PowerTempTimer;
123
 
102
 
Line 173... Line 152...
173
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
152
  ADC_Scale = 1 / (Scale * 4096) * adc_vref;
174
}
153
}
175
 
154
 
176
void ProcessRPM(int instance)
155
void ProcessRPM(int instance)
177
{
156
{
178
  // compute the timer values
-
 
179
  // snapshot timers
-
 
180
  unsigned short RPM_Pulsewidth;
-
 
181
  // current RPM pulse next slot index
-
 
182
  unsigned short RPM_Count_Val;
-
 
183
 
-
 
184
  // accumulator for pulse widths 
-
 
185
  static unsigned short RPM_Accumulator = ACCUM_MAX;
-
 
186
  // Next state of pulse high/low
-
 
187
  static unsigned char RPM_State = 1;
157
  static unsigned int Coded_RPM = 0;
188
  // Current state of pulse high/low
-
 
189
  static unsigned char RPM_State_Curr = 1;
-
 
190
 
-
 
191
  __disable_irq(); // copy the counter value
-
 
192
  RPM_Count_Val = RPM_Count;
-
 
193
  __enable_irq();
-
 
194
  // do calculations
158
  int32_t rpm = CalculateRPM();
195
 
-
 
196
  // if there is only one entry, cannot get difference
-
 
197
  if (RPM_Count_Latch != RPM_Count_Val)
-
 
198
  {
-
 
199
    while (1)
159
  if (rpm >= 0)
200
    {
-
 
201
      unsigned int base_time;
-
 
202
      unsigned int new_time;
-
 
203
      // if we are at N-1, stop.
-
 
204
      unsigned int next_count = (RPM_Count_Latch + 1) % RPM_SAMPLES;
-
 
205
      if (next_count == RPM_Count_Val)
-
 
206
      {
-
 
207
        break; // completed loop
-
 
208
      }
-
 
209
      char pulse_level = (RPM_Time[RPM_Count_Latch] & RPM_FLAG) ? 1 : 0;
-
 
210
      base_time = RPM_Time[RPM_Count_Latch] & ~RPM_FLAG;
-
 
211
      new_time = RPM_Time[next_count] & ~RPM_FLAG;
-
 
212
      RPM_Count_Latch = next_count;
-
 
213
 
-
 
214
      RPM_Pulsewidth = new_time - base_time;
-
 
215
 
-
 
216
      if (pulse_level == 0 && (RPM_Pulsewidth > ACCUM_MAX))
-
 
217
        RPM_State = 1;
-
 
218
      if (pulse_level == 1)
-
 
219
        RPM_State = 0;  
-
 
220
#if 0
-
 
221
      RPM_State_Curr = RPM_State;
-
 
222
      // Count up/down
-
 
223
      if (pulse_level == 0)
-
 
224
      {
-
 
225
        if (RPM_Pulsewidth > RPM_Accumulator) // going to cross zero
-
 
226
        {
-
 
227
          RPM_State = 0;
-
 
228
          RPM_Accumulator = 0;
-
 
229
        }
-
 
230
        else
-
 
231
        {
-
 
232
          RPM_Accumulator -=  RPM_Pulsewidth;
-
 
233
        }
-
 
234
      }
-
 
235
      else
-
 
236
      {
-
 
237
        if (RPM_Accumulator + RPM_Pulsewidth > ACCUM_MAX)
-
 
238
        {
-
 
239
          RPM_State = 1;
160
    Coded_RPM = rpm / 19.55;
240
          RPM_Accumulator = ACCUM_MAX;
-
 
241
        }
-
 
242
        else
-
 
243
        {
-
 
244
          RPM_Accumulator += RPM_Pulsewidth;
-
 
245
        }
-
 
246
      }
-
 
247
#endif
-
 
248
      // low pulse has reached at least minimum width, count it.
-
 
249
      if ((RPM_State == 1) && (RPM_State_Curr == 0))
-
 
250
      {
-
 
251
        RPM_Diff = new_time - last_dwell_end;
-
 
252
 
-
 
253
        RPM_Period[RPM_Period_Ptr] = RPM_Diff;
-
 
254
        RPM_Period_Ptr = (RPM_Period_Ptr + 1) % RPM_AVERAGE;
-
 
255
        if (RPM_Pulsecount < RPM_AVERAGE)
-
 
256
          RPM_Pulsecount++; // count one pulse
-
 
257
        last_dwell_end = new_time;
-
 
258
      }
-
 
259
      RPM_State_Curr = RPM_State;
-
 
260
    }
-
 
261
  }
-
 
262
 
-
 
263
  if (RPM_Pulsecount == RPM_AVERAGE)
-
 
264
  {
-
 
265
    // now have time for N pulses in clocks
-
 
266
    // need to scale by 19.55: one unit is 19.55 RPM
-
 
267
    // 1Hz is 30 RPM
-
 
268
    int i;
-
 
269
    RPM_FilteredWidth = 0;
-
 
270
    for (i = 0; i < RPM_AVERAGE; i++)
-
 
271
      RPM_FilteredWidth += RPM_Period[i];
-
 
272
 
-
 
273
    Coded_RPM = (Scale * 30.0 * RPM_AVERAGE * RPM_COUNT_RATE) / (19.55 * RPM_FilteredWidth);
-
 
274
 
-
 
275
#if !defined MY_DEBUG
-
 
276
    // reset here unless we want to debug
-
 
277
    RPM_Pulsecount = 0;
-
 
278
#endif
-
 
279
  }
-
 
280
 
161
 
281
  // send the current RPM *calculation
162
  // send the current RPM *calculation
282
  plx_sendword(PLX_RPM);
163
  plx_sendword(PLX_RPM);
283
  PutCharSerial(&uc1, instance);
164
  PutCharSerial(&uc1, instance);
284
  plx_sendword(Coded_RPM / Scale);
165
  plx_sendword(Coded_RPM / Scale);