Rev 16 | Rev 18 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 16 | Rev 17 | ||
---|---|---|---|
Line 68... | Line 68... | ||
68 | volatile char NoSerialIn = 0; |
68 | volatile char NoSerialIn = 0; |
69 | 69 | ||
70 | // storage for ADC |
70 | // storage for ADC |
71 | uint16_t ADC_Samples[6]; |
71 | uint16_t ADC_Samples[6]; |
72 | 72 | ||
- | 73 | #define Scale 1024.0 |
|
- | 74 | const float ADC_Scale = 3.3 / (Scale * 4096.0); // convert to a voltage |
|
- | 75 | ||
- | 76 | uint32_t FILT_Samples[6]; // filtered ADC samples * 1024 |
|
73 | // Rev counter processing from original RevCounter Project |
77 | // Rev counter processing from original RevCounter Project |
74 | unsigned int RPM_Diff = 0; |
78 | unsigned int RPM_Diff = 0; |
75 | unsigned int RPM_Count_Latch = 0; |
79 | unsigned int RPM_Count_Latch = 0; |
76 | // accumulators |
80 | // accumulators |
77 | unsigned int RPM_Pulsecount = 0; |
81 | unsigned int RPM_Pulsecount = 0; |
Line 104... | Line 108... | ||
104 | void plx_sendword(int x) { |
108 | void plx_sendword(int x) { |
105 | PutCharSerial(&uc1, ((x) >> 6) & 0x3F); |
109 | PutCharSerial(&uc1, ((x) >> 6) & 0x3F); |
106 | PutCharSerial(&uc1, (x) & 0x3F); |
110 | PutCharSerial(&uc1, (x) & 0x3F); |
107 | } |
111 | } |
108 | 112 | ||
- | 113 | void init_ADC_filter() |
|
- | 114 | { |
|
- | 115 | int i; |
|
- | 116 | for(i=0;i<6;i++) |
|
- | 117 | { |
|
- | 118 | FILT_Samples[i] = 0; |
|
- | 119 | } |
|
- | 120 | } |
|
- | 121 | ||
- | 122 | void filter_ADC_samples() |
|
- | 123 | { |
|
- | 124 | int i; |
|
- | 125 | for(i=0;i<6;i++) |
|
- | 126 | { |
|
- | 127 | FILT_Samples[i] += (ADC_Samples[i] * Scale - FILT_Samples[i]) / 2; |
|
- | 128 | } |
|
- | 129 | ||
- | 130 | ||
- | 131 | ||
- | 132 | } |
|
- | 133 | ||
- | 134 | ||
109 | void ProcessRPM(int instance) { |
135 | void ProcessRPM(int instance) { |
110 | // compute the timer values |
136 | // compute the timer values |
111 | // snapshot timers |
137 | // snapshot timers |
112 | unsigned long RPM_Pulsewidth; |
138 | unsigned long RPM_Pulsewidth; |
113 | unsigned long RPM_Count_Val; |
139 | unsigned long RPM_Count_Val; |
Line 148... | Line 174... | ||
148 | 174 | ||
149 | } |
175 | } |
150 | 176 | ||
151 | if (RPM_Pulsecount > 0) { |
177 | if (RPM_Pulsecount > 0) { |
152 | 178 | ||
- | 179 | ||
- | 180 | ||
- | 181 | ||
153 | // now have time for N pulses in clocks |
182 | // now have time for N pulses in clocks |
154 | // need to scale by 19.55: one unit is 19.55 RPM |
183 | // need to scale by 19.55: one unit is 19.55 RPM |
155 | // 1Hz is 60 RPM |
184 | // 1Hz is 60 RPM |
156 | Coded_RPM = (30.0 / 19.55 * RPM_Pulsecount * RPM_COUNT_RATE) |
185 | float new_RPM = (30.0 / 19.55 * RPM_Pulsecount * RPM_COUNT_RATE) |
157 | / (RPM_FilteredWidth) + 0.5; |
186 | / (RPM_FilteredWidth) + 0.5; |
- | 187 | ||
- | 188 | Coded_RPM += (new_RPM * Scale - Coded_RPM)/4; |
|
- | 189 | ||
158 | #if !defined MY_DEBUG |
190 | #if !defined MY_DEBUG |
159 | // reset here unless we want to debug |
191 | // reset here unless we want to debug |
160 | RPM_Pulsecount = 0; |
192 | RPM_Pulsecount = 0; |
161 | RPM_FilteredWidth = 0; |
193 | RPM_FilteredWidth = 0; |
162 | #endif |
194 | #endif |
163 | } |
195 | } |
164 | 196 | ||
165 | // send the current RPM calculation |
197 | // send the current RPM *calculation |
166 | plx_sendword(PLX_RPM); |
198 | plx_sendword(PLX_RPM); |
167 | PutCharSerial(&uc1, instance); |
199 | PutCharSerial(&uc1, instance); |
168 | plx_sendword(Coded_RPM); |
200 | plx_sendword(Coded_RPM/Scale); |
169 | } |
201 | } |
170 | 202 | ||
171 | uint8_t CHT_Timer = 0; |
203 | uint8_t CHT_Timer = 0; |
172 | 204 | ||
173 | // this uses a MAX6675 which is a simple 16 bit read |
205 | // this uses a MAX6675 which is a simple 16 bit read |
Line 183... | Line 215... | ||
183 | { |
215 | { |
184 | CHT_Timer=0; |
216 | CHT_Timer=0; |
185 | 217 | ||
186 | HAL_GPIO_WritePin(SPI_NS_Temp_GPIO_Port, SPI_NS_Temp_Pin, GPIO_PIN_RESET); |
218 | HAL_GPIO_WritePin(SPI_NS_Temp_GPIO_Port, SPI_NS_Temp_Pin, GPIO_PIN_RESET); |
187 | 219 | ||
188 | - | ||
189 | HAL_Delay(1); |
- | |
190 | - | ||
191 | HAL_SPI_Receive(&hspi1, buffer, 2, 2); |
220 | HAL_SPI_Receive(&hspi1, buffer, 2, 2); |
192 | 221 | ||
- | 222 | HAL_GPIO_WritePin(SPI_NS_Temp_GPIO_Port, SPI_NS_Temp_Pin, GPIO_PIN_SET); |
|
193 | 223 | ||
194 | 224 | ||
195 | uint16_t obs = (buffer[0]<<8)| buffer[1]; |
225 | uint16_t obs = (buffer[0]<<8)| buffer[1]; |
196 | 226 | ||
197 | uint8_t good = (obs & 4)==0; |
227 | uint8_t good = (obs & 4)==0; |
Line 199... | Line 229... | ||
199 | { |
229 | { |
200 | Coded_CHT = obs>>5; |
230 | Coded_CHT = obs>>5; |
201 | } |
231 | } |
202 | else |
232 | else |
203 | { |
233 | { |
204 | Coded_CHT= 1000; // signal fail |
234 | Coded_CHT= 1024; // signal fail |
205 | } |
235 | } |
206 | } |
236 | } |
207 | 237 | ||
208 | plx_sendword(PLX_X_CHT); |
238 | plx_sendword(PLX_X_CHT); |
209 | PutCharSerial(&uc1, instance); |
239 | PutCharSerial(&uc1, instance); |
210 | plx_sendword(Coded_CHT); |
240 | plx_sendword(Coded_CHT); |
211 | HAL_GPIO_WritePin(SPI_NS_Temp_GPIO_Port, SPI_NS_Temp_Pin, GPIO_PIN_SET); |
- | |
212 | 241 | ||
213 | } |
242 | } |
214 | 243 | ||
- | 244 | // 1023 is 20.00 volts. |
|
215 | void ProcessBatteryVoltage(int instance) |
245 | void ProcessBatteryVoltage(int instance) |
216 | { |
246 | { |
- | 247 | float reading = FILT_Samples[instance] * ADC_Scale ; |
|
- | 248 | reading = reading * 7.8125; // real voltage |
|
- | 249 | reading = reading * 51.15 ; // 1023/20 |
|
- | 250 | ||
- | 251 | ||
217 | plx_sendword(PLX_Volts); |
252 | plx_sendword(PLX_Volts); |
218 | PutCharSerial(&uc1, instance); |
253 | PutCharSerial(&uc1, instance); |
219 | plx_sendword(ADC_Samples[instance]); |
254 | plx_sendword((uint16_t)reading); |
- | 255 | ||
- | 256 | ||
- | 257 | ||
- | 258 | } |
|
- | 259 | ||
- | 260 | // the MAP sensor is giving us a reading of |
|
- | 261 | // 4.6 volts for 1019mB or 2.27 volts at the ADC input (resistive divider by 2.016) |
|
- | 262 | // I believe the sensor reads 4.5V at 1000kPa and 0.5V at 0kPa |
|
- | 263 | ||
- | 264 | void ProcessMAP(int instance) |
|
- | 265 | { |
|
- | 266 | // Using ADC_Samples[3] as the MAP input |
|
- | 267 | float reading = FILT_Samples[3] * ADC_Scale; |
|
- | 268 | reading = reading * 2.016; // real voltage |
|
- | 269 | reading = (reading-0.5) * 1000/ 4; |
|
- | 270 | ||
- | 271 | plx_sendword(PLX_MAP); |
|
- | 272 | PutCharSerial(&uc1, instance); |
|
- | 273 | plx_sendword((uint16_t)reading); |
|
220 | 274 | ||
221 | 275 | ||
222 | 276 | ||
223 | } |
277 | } |
224 | 278 | ||
- | 279 | // the Oil pressi sensor is giving us a reading of |
|
- | 280 | // 4.5 volts for 100 PSI or 2.25 volts at the ADC input (resistive divider by 2.016) |
|
- | 281 | // I believe the sensor reads 4.5V at 100PSI and 0.5V at 0PSI |
|
- | 282 | // an observation of 1024 is 200PSI, so observation of 512 is 100 PSI. |
|
- | 283 | ||
- | 284 | void ProcessOilPress(int instance) |
|
- | 285 | { |
|
- | 286 | // Using ADC_Samples[2] as the MAP input |
|
- | 287 | float reading = FILT_Samples[2] * ADC_Scale ; |
|
- | 288 | reading = reading * 2.00 ; // real voltage |
|
- | 289 | reading = (reading-0.5) * 512 / 4; // this is 1023 * 100/200 |
|
- | 290 | ||
- | 291 | plx_sendword(PLX_FluidPressure); |
|
- | 292 | PutCharSerial(&uc1, instance); |
|
- | 293 | plx_sendword((uint16_t)reading); |
|
- | 294 | ||
- | 295 | ||
- | 296 | ||
- | 297 | } |
|
- | 298 | ||
- | 299 | ||
225 | 300 | ||
226 | void ProcessTiming(int instance) |
301 | void ProcessTiming(int instance) |
227 | { |
302 | { |
228 | plx_sendword(PLX_Timing); |
303 | plx_sendword(PLX_Timing); |
229 | PutCharSerial(&uc1, instance); |
304 | PutCharSerial(&uc1, instance); |
230 | plx_sendword(64-15); // make it negative |
305 | plx_sendword(64-15); // make it negative |
231 | } |
306 | } |
232 | 307 | ||
- | 308 | ||
- | 309 | ||
233 | /* USER CODE END 0 */ |
310 | /* USER CODE END 0 */ |
234 | 311 | ||
235 | int main(void) |
312 | int main(void) |
236 | { |
313 | { |
237 | 314 | ||
Line 289... | Line 366... | ||
289 | // Start the counter |
366 | // Start the counter |
290 | HAL_TIM_Base_Start(&htim2); |
367 | HAL_TIM_Base_Start(&htim2); |
291 | // Start the input capture and the interrupt |
368 | // Start the input capture and the interrupt |
292 | HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); |
369 | HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); |
293 | 370 | ||
- | 371 | init_ADC_filter(); |
|
294 | 372 | ||
295 | /* USER CODE END 2 */ |
373 | /* USER CODE END 2 */ |
296 | 374 | ||
297 | /* Infinite loop */ |
375 | /* Infinite loop */ |
298 | /* USER CODE BEGIN WHILE */ |
376 | /* USER CODE BEGIN WHILE */ |
Line 335... | Line 413... | ||
335 | PutCharSerial(&uc2,(val&31) + 32); |
413 | PutCharSerial(&uc2,(val&31) + 32); |
336 | 414 | ||
337 | 415 | ||
338 | 416 | ||
339 | // send the observations |
417 | // send the observations |
- | 418 | filter_ADC_samples(); |
|
340 | ProcessRPM(0); |
419 | ProcessRPM(0); |
341 | ProcessCHT(0); |
420 | ProcessCHT(0); |
342 | ProcessBatteryVoltage(3); |
421 | ProcessBatteryVoltage(0); // Batt 1 |
343 | ProcessBatteryVoltage(1); |
422 | ProcessBatteryVoltage(1); // Batt 2 |
344 | - | ||
- | 423 | // ProcessBatteryVoltage(2); // oil pressure |
|
- | 424 | // ProcessBatteryVoltage(3); // MAP |
|
- | 425 | ProcessBatteryVoltage(4); // temperature sensor |
|
- | 426 | // ProcessBatteryVoltage(5); // vrefint |
|
- | 427 | ProcessMAP(0); |
|
- | 428 | ProcessOilPress(0); |
|
345 | ProcessTiming(0); |
429 | ProcessTiming(0); |
346 | 430 | ||
347 | PutCharSerial(&uc1,PLX_Stop); |
431 | PutCharSerial(&uc1,PLX_Stop); |
348 | } |
432 | } |
349 | 433 | ||
Line 425... | Line 509... | ||
425 | 509 | ||
426 | /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. |
510 | /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. |
427 | */ |
511 | */ |
428 | sConfig.Channel = ADC_CHANNEL_10; |
512 | sConfig.Channel = ADC_CHANNEL_10; |
429 | sConfig.Rank = 1; |
513 | sConfig.Rank = 1; |
430 | sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES; |
514 | sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES; |
431 | if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) |
515 | if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) |
432 | { |
516 | { |
433 | Error_Handler(); |
517 | Error_Handler(); |
434 | } |
518 | } |
435 | 519 |