Rev 8 | Rev 12 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8 | Rev 11 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | 10 | ||
11 | #include "timer2.h" |
11 | #include "timer2.h" |
12 | #define MICROSECS_PULSE 10 |
12 | #define MICROSECS_PULSE 10 |
13 | 13 | ||
14 | 14 | ||
15 | - | ||
16 | - | ||
17 | - | ||
18 | - | ||
19 | // with a dwell angle of 45 degrees , 4 cylinders and a maximum RPM of 5000 |
15 | // with a dwell angle of 45 degrees , 4 cylinders and a maximum RPM of 5000 |
20 | // freq = 5000/60 * 2 = 166Hz. Because the breaker might bounce , we accept the |
16 | // freq = 5000/60 * 2 = 166Hz. Because the breaker might bounce , we accept the |
21 | // first pulse longer than 1/300 of a second as being a proper closure . |
17 | // first pulse longer than 1/300 of a second as being a proper closure . |
22 | // the TIM2 counter counts in 10uS increments, |
18 | // the TIM2 counter counts in 10uS increments, |
23 | #define BREAKER_COUNT_MIN (1E6/(MICROSECS_PULSE * 300)) |
19 | #define BREAKER_COUNT_MIN (1E6/(MICROSECS_PULSE * 300)) |
Line 27... | Line 23... | ||
27 | uint16_t nominal = 0; |
23 | uint16_t nominal = 0; |
28 | uint16_t phase10 = 100; // 10 degrees |
24 | uint16_t phase10 = 100; // 10 degrees |
29 | volatile uint16_t sampleCount = 0; |
25 | volatile uint16_t sampleCount = 0; |
30 | uint16_t outSampleCount = 0; |
26 | uint16_t outSampleCount = 0; |
31 | volatile uint16_t sampleBuff[SAMPLE_BUFF_SIZE]; |
27 | volatile uint16_t sampleBuff[SAMPLE_BUFF_SIZE]; |
32 | typedef enum { WAIT_GAP, SKIP_BOUNCE } sampleState_t ; |
28 | typedef enum { WAIT_GAP, SKIP_BOUNCE, HAVE_SAMPLE } sampleState_t ; |
33 | sampleState_t sampleState = WAIT_GAP; |
29 | sampleState_t sampleState = WAIT_GAP; |
- | 30 | // difference between samples |
|
- | 31 | volatile uint16_t deltaTime; |
|
34 | 32 | ||
35 | 33 | ||
36 | uint16_t rpm; |
34 | uint16_t rpm; |
37 | 35 | ||
38 | void initTimer2() |
36 | void initTimer2() |
Line 46... | Line 44... | ||
46 | TIM_CR1_ARPE ); |
44 | TIM_CR1_ARPE ); |
47 | 45 | ||
48 | /// pulse width 200 uS |
46 | /// pulse width 200 uS |
49 | TIM2->CCR1 = 200/MICROSECS_PULSE; |
47 | TIM2->CCR1 = 200/MICROSECS_PULSE; |
50 | 48 | ||
51 | TIM2->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P ; //enabled and low |
49 | TIM2->CCER = TIM_CCER_CC1E | TIM_CCER_CC1P ; //enabled and active high |
52 | 50 | ||
53 | TIM2->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | |
51 | TIM2->CCMR1 = TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | |
54 | TIM_CCMR1_OC1PE ; |
52 | TIM_CCMR1_OC1PE ; |
55 | 53 | ||
56 | 54 | ||
57 | TIM2->CR2 = TIM_CR2_MMS_1 ; // trigger out is 010 = update |
55 | TIM2->CR2 = TIM_CR2_MMS_1 ; // trigger out is 010 = update |
58 | 56 | ||
Line 122... | Line 120... | ||
122 | uint16_t getRPM(void) |
120 | uint16_t getRPM(void) |
123 | { |
121 | { |
124 | return rpm; |
122 | return rpm; |
125 | } |
123 | } |
126 | 124 | ||
- | 125 | uint16_t getDelta(void) |
|
- | 126 | { |
|
- | 127 | return deltaTime; |
|
- | 128 | } |
|
- | 129 | ||
127 | uint16_t wrapIndex(uint16_t index) |
130 | uint16_t wrapIndex(uint16_t index) |
128 | { |
131 | { |
129 | if (index > SAMPLE_BUFF_SIZE) |
132 | if (index >= SAMPLE_BUFF_SIZE) |
130 | index -= SAMPLE_BUFF_SIZE; |
133 | index -= SAMPLE_BUFF_SIZE; |
131 | return index; |
134 | return index; |
132 | } |
135 | } |
133 | 136 | ||
134 | 137 | ||
135 | // allows for wrapping |
138 | // allows for wrapping |
136 | uint16_t getSampleBuff(uint16_t index) |
139 | uint16_t getSampleBuff(uint16_t index) |
137 | { |
140 | { |
- | 141 | chSysLock(); |
|
138 | return sampleBuff[wrapIndex(index)]; |
142 | return sampleBuff[wrapIndex(index)]; |
- | 143 | chSysUnlock(); |
|
139 | } |
144 | } |
140 | 145 | ||
- | 146 | ||
141 | // waits for ignition pulse , debounces readings |
147 | // waits for ignition pulse , debounces readings, |
- | 148 | // returns the pulse time, skips debounce time |
|
142 | uint16_t getNextPulse(void) |
149 | uint16_t getNextPulse(void) |
143 | { |
150 | { |
144 | static uint16_t lastVal = 0; |
151 | static uint16_t lastSampleIndex = 0; |
145 | uint16_t retVal ; |
- | |
146 | uint8_t done = 0; |
- | |
147 | while(done == 0) |
152 | while(1) |
148 | { |
153 | { |
149 | uint16_t diff; |
- | |
150 | // wait until there are enough samples |
- | |
151 | while(1) |
- | |
152 | { |
- | |
153 | - | ||
154 | diff = sampleCount - outSampleCount; |
- | |
155 | if(outSampleCount >= sampleCount) |
154 | while (outSampleCount == sampleCount) |
156 | diff = sampleCount - outSampleCount; |
- | |
157 | else |
- | |
158 | diff = SAMPLE_BUFF_SIZE + sampleCount - outSampleCount; |
- | |
159 | - | ||
160 | if(diff > 1) |
- | |
161 | break; |
- | |
162 | chThdSleep(10); |
155 | chThdSleep(10); |
163 | } |
- | |
164 | 156 | ||
165 | // pick the next out of gap sample |
- | |
166 | if(sampleState == WAIT_GAP) |
- | |
167 | { |
- | |
168 | done = 1; |
- | |
169 | retVal = getSampleBuff(outSampleCount); |
- | |
170 | } |
- | |
171 | // see how many samples are too close together |
- | |
172 | sampleState = SKIP_BOUNCE; |
- | |
173 | uint16_t endCount = sampleCount; |
- | |
174 | while((sampleState == SKIP_BOUNCE) && (outSampleCount != endCount)) |
- | |
175 | { |
- | |
176 | uint16_t thisTime = getSampleBuff(outSampleCount); |
157 | uint16_t thisTime = getSampleBuff(outSampleCount); |
- | 158 | ||
177 | outSampleCount = wrapIndex(outSampleCount + 1); |
159 | outSampleCount = wrapIndex(outSampleCount + 1); |
178 | uint16_t nextTime = getSampleBuff(outSampleCount); |
160 | while (outSampleCount == sampleCount) |
- | 161 | chThdSleep(10); |
|
179 | 162 | ||
180 | uint16_t deltaTime; |
163 | uint16_t nextTime = getSampleBuff(outSampleCount); |
181 | 164 | ||
182 | // calculate wrapped time delta : should be > than bounce time to allow |
165 | // calculate wrapped time delta : should be > than bounce time to allow |
183 | if(nextTime > thisTime) |
- | |
184 | deltaTime = nextTime - thisTime; |
166 | uint16_t diffTime = nextTime - thisTime; |
185 | else |
- | |
186 | deltaTime = 65536 + nextTime - thisTime; |
- | |
187 | 167 | ||
188 | if(deltaTime > BREAKER_COUNT_MIN) |
168 | if(diffTime > BREAKER_COUNT_MIN) |
189 | { |
169 | { |
190 | sampleState = WAIT_GAP; |
170 | lastSampleIndex = outSampleCount; |
191 | break; |
171 | return nextTime; |
192 | } |
172 | } |
193 | 173 | ||
194 | } |
- | |
195 | } |
174 | } |
- | 175 | return 0; |
|
- | 176 | } |
|
196 | 177 | ||
- | 178 | ||
- | 179 | void processNextPulse(uint16_t retVal) |
|
- | 180 | { |
|
- | 181 | ||
- | 182 | static uint16_t lastVal = 0; |
|
197 | // at this point we should try to phase lock |
183 | // at this point we should try to phase lock |
198 | uint32_t period; |
- | |
199 | if(retVal > lastVal) |
184 | deltaTime = retVal - lastVal; |
- | 185 | ||
- | 186 | ||
- | 187 | ||
200 | period = retVal - lastVal; |
188 | if(deltaTime > 10000) |
201 | else |
189 | { |
202 | period = 65536 + retVal - lastVal; |
190 | __asm(" BKPT #0"); |
- | 191 | } |
|
203 | 192 | ||
204 | lastVal = retVal; |
193 | lastVal = retVal; |
205 | 194 | ||
- | 195 | ||
- | 196 | ||
- | 197 | ||
- | 198 | ||
206 | float nomRPM = 30E6 / (MICROSECS_PULSE * period) ; |
199 | float nomRPM = 30E6 / (MICROSECS_PULSE * deltaTime) ; |
207 | 200 | ||
208 | rpm = rpm + (nomRPM -rpm)/10; |
201 | rpm = rpm + (nomRPM -rpm)/10; |
209 | 202 | ||
210 | 203 | ||
211 | 204 | ||
Line 220... | Line 213... | ||
220 | rpm = rpm + 1; |
213 | rpm = rpm + 1; |
221 | 214 | ||
222 | // rpm += delta / 256; |
215 | // rpm += delta / 256; |
223 | 216 | ||
224 | adjustRPM(); |
217 | adjustRPM(); |
- | 218 | } |
|
- | 219 | ||
225 | 220 | ||
226 | return retVal; |
- | |
227 | } |
- | |
228 | 221 | ||
229 | 222 | ||
230 | // set the timing advance from reference to |
223 | // set the timing advance from reference to |
231 | void setAdvance(int16_t deg10) |
224 | void setAdvance(int16_t deg10) |
232 | { |
225 | { |
Line 242... | Line 235... | ||
242 | if(stat & TIM_SR_CC1IF) |
235 | if(stat & TIM_SR_CC1IF) |
243 | { |
236 | { |
244 | TIM3->SR &= ~TIM_SR_CC1IF; |
237 | TIM3->SR &= ~TIM_SR_CC1IF; |
245 | uint16_t sample = TIM3->CCR1; |
238 | uint16_t sample = TIM3->CCR1; |
246 | sampleBuff[sampleCount++] = sample; |
239 | sampleBuff[sampleCount++] = sample; |
247 | if (sampleCount > SAMPLE_BUFF_SIZE) |
240 | if (sampleCount >= SAMPLE_BUFF_SIZE) |
248 | sampleCount = 0; |
241 | sampleCount = 0; |
249 | } |
242 | } |
250 | } |
243 | } |
251 | 244 | ||
252 | 245 |