📄 main_8c.html
字号:
<td class="md" nowrap><code> [static]</code></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td> <td><p>Initializes arrays for motor driving and AD channel selection. <p>This function initializes the arrays used for motor driving and AD channel selection that changes for each commutation step.<p>Definition at line <a class="el" href="main_8c-source.html#l00262">262</a> of file <a class="el" href="main_8c-source.html">main.c</a>.<p>References <a class="el" href="BLDC_8h-source.html#l00153">ADMUX_U</a>, <a class="el" href="BLDC_8h-source.html#l00156">ADMUX_V</a>, <a class="el" href="BLDC_8h-source.html#l00159">ADMUX_W</a>, <a class="el" href="main_8c-source.html#l00032">ADMUXTable</a>, <a class="el" href="BLDC_8h-source.html#l00071">DRIVE_PATTERN_STEP1_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00090">DRIVE_PATTERN_STEP1_CW</a>, <a class="el" href="BLDC_8h-source.html#l00074">DRIVE_PATTERN_STEP2_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00093">DRIVE_PATTERN_STEP2_CW</a>, <a class="el" href="BLDC_8h-source.html#l00077">DRIVE_PATTERN_STEP3_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00096">DRIVE_PATTERN_STEP3_CW</a>, <a class="el" href="BLDC_8h-source.html#l00080">DRIVE_PATTERN_STEP4_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00099">DRIVE_PATTERN_STEP4_CW</a>, <a class="el" href="BLDC_8h-source.html#l00083">DRIVE_PATTERN_STEP5_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00102">DRIVE_PATTERN_STEP5_CW</a>, <a class="el" href="BLDC_8h-source.html#l00086">DRIVE_PATTERN_STEP6_CCW</a>, <a class="el" href="BLDC_8h-source.html#l00105">DRIVE_PATTERN_STEP6_CW</a>, <a class="el" href="main_8c-source.html#l00029">driveTable</a>, and <a class="el" href="main_8c-source.html#l00035">startupDelays</a>.<div class="fragment"><pre class="fragment"><a name="l00263"></a>00263 {<a name="l00264"></a>00264 <span class="preprocessor">#if DIRECTION_OF_ROTATION == CCW</span><a name="l00265"></a>00265 <span class="preprocessor"></span> <a class="code" href="main_8c.html#a0">driveTable</a>[0] = <a class="code" href="BLDC_8h.html#a14">DRIVE_PATTERN_STEP1_CCW</a>;<a name="l00266"></a>00266 <a class="code" href="main_8c.html#a0">driveTable</a>[1] = <a class="code" href="BLDC_8h.html#a15">DRIVE_PATTERN_STEP2_CCW</a>;<a name="l00267"></a>00267 <a class="code" href="main_8c.html#a0">driveTable</a>[2] = <a class="code" href="BLDC_8h.html#a16">DRIVE_PATTERN_STEP3_CCW</a>;<a name="l00268"></a>00268 <a class="code" href="main_8c.html#a0">driveTable</a>[3] = <a class="code" href="BLDC_8h.html#a17">DRIVE_PATTERN_STEP4_CCW</a>;<a name="l00269"></a>00269 <a class="code" href="main_8c.html#a0">driveTable</a>[4] = <a class="code" href="BLDC_8h.html#a18">DRIVE_PATTERN_STEP5_CCW</a>;<a name="l00270"></a>00270 <a class="code" href="main_8c.html#a0">driveTable</a>[5] = <a class="code" href="BLDC_8h.html#a19">DRIVE_PATTERN_STEP6_CCW</a>;<a name="l00271"></a>00271 <a name="l00272"></a>00272 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[0] = <a class="code" href="BLDC_8h.html#a43">ADMUX_W</a>;<a name="l00273"></a>00273 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[1] = <a class="code" href="BLDC_8h.html#a42">ADMUX_V</a>;<a name="l00274"></a>00274 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[2] = <a class="code" href="BLDC_8h.html#a41">ADMUX_U</a>;<a name="l00275"></a>00275 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[3] = <a class="code" href="BLDC_8h.html#a43">ADMUX_W</a>;<a name="l00276"></a>00276 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[4] = <a class="code" href="BLDC_8h.html#a42">ADMUX_V</a>;<a name="l00277"></a>00277 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[5] = <a class="code" href="BLDC_8h.html#a41">ADMUX_U</a>;<a name="l00278"></a>00278 <span class="preprocessor">#else</span><a name="l00279"></a>00279 <span class="preprocessor"></span> <a class="code" href="main_8c.html#a0">driveTable</a>[0] = <a class="code" href="BLDC_8h.html#a20">DRIVE_PATTERN_STEP1_CW</a>;<a name="l00280"></a>00280 <a class="code" href="main_8c.html#a0">driveTable</a>[1] = <a class="code" href="BLDC_8h.html#a21">DRIVE_PATTERN_STEP2_CW</a>;<a name="l00281"></a>00281 <a class="code" href="main_8c.html#a0">driveTable</a>[2] = <a class="code" href="BLDC_8h.html#a22">DRIVE_PATTERN_STEP3_CW</a>;<a name="l00282"></a>00282 <a class="code" href="main_8c.html#a0">driveTable</a>[3] = <a class="code" href="BLDC_8h.html#a23">DRIVE_PATTERN_STEP4_CW</a>;<a name="l00283"></a>00283 <a class="code" href="main_8c.html#a0">driveTable</a>[4] = <a class="code" href="BLDC_8h.html#a24">DRIVE_PATTERN_STEP5_CW</a>;<a name="l00284"></a>00284 <a class="code" href="main_8c.html#a0">driveTable</a>[5] = <a class="code" href="BLDC_8h.html#a25">DRIVE_PATTERN_STEP6_CW</a>;<a name="l00285"></a>00285 <a name="l00286"></a>00286 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[0] = <a class="code" href="BLDC_8h.html#a41">ADMUX_U</a>;<a name="l00287"></a>00287 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[1] = <a class="code" href="BLDC_8h.html#a42">ADMUX_V</a>;<a name="l00288"></a>00288 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[2] = <a class="code" href="BLDC_8h.html#a43">ADMUX_W</a>;<a name="l00289"></a>00289 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[3] = <a class="code" href="BLDC_8h.html#a41">ADMUX_U</a>;<a name="l00290"></a>00290 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[4] = <a class="code" href="BLDC_8h.html#a42">ADMUX_V</a>;<a name="l00291"></a>00291 <a class="code" href="main_8c.html#a1">ADMUXTable</a>[5] = <a class="code" href="BLDC_8h.html#a43">ADMUX_W</a>;<a name="l00292"></a>00292 <a name="l00293"></a>00293 <span class="preprocessor">#endif</span><a name="l00294"></a>00294 <span class="preprocessor"></span><a name="l00295"></a>00295 <a class="code" href="main_8c.html#a2">startupDelays</a>[0] = 200;<a name="l00296"></a>00296 <a class="code" href="main_8c.html#a2">startupDelays</a>[1] = 150;<a name="l00297"></a>00297 <a class="code" href="main_8c.html#a2">startupDelays</a>[2] = 100;<a name="l00298"></a>00298 <a class="code" href="main_8c.html#a2">startupDelays</a>[3] = 80;<a name="l00299"></a>00299 <a class="code" href="main_8c.html#a2">startupDelays</a>[4] = 70;<a name="l00300"></a>00300 <a class="code" href="main_8c.html#a2">startupDelays</a>[5] = 65;<a name="l00301"></a>00301 <a class="code" href="main_8c.html#a2">startupDelays</a>[6] = 60;<a name="l00302"></a>00302 <a class="code" href="main_8c.html#a2">startupDelays</a>[7] = 55;<a name="l00303"></a>00303 }</pre></div><p> </td> </tr></table><a class="anchor" name="a21"></a><!-- doxytag: member="main.c::MotorPWMBottom" ref="a21" args="()" --><p><table class="mdTable" cellpadding="2" cellspacing="0"> <tr> <td class="mdRow"> <table cellpadding="0" cellspacing="0" border="0"> <tr> <td class="md" nowrap valign="top">__interrupt void MotorPWMBottom </td> <td class="md" valign="top">( </td> <td class="mdname1" valign="top" nowrap> </td> <td class="md" valign="top"> ) </td> <td class="md" nowrap></td> </tr> </table> </td> </tr></table><table cellspacing="5" cellpadding="0" border="0"> <tr> <td> </td> <td><p>Timer/counter0 bottom overflow. Used for zero-cross detection. <p>This interrupt service routine is called every time the up/down counting PWM counter reaches bottom. An ADC reading on the active channel is automatically triggered at the same time as this interrupt is triggered. This is used to detect a zero crossing.<p>In the event of a zero crossing, the time since last commutation is stored and Timer/counter1 compare A is set up to trigger at the next commutation instant.<p>Definition at line <a class="el" href="main_8c-source.html#l00364">364</a> of file <a class="el" href="main_8c-source.html">main.c</a>.<p>References <a class="el" href="BLDC_8h-source.html#l00177">ADC_PRESCALER</a>, <a class="el" href="BLDC_8h-source.html#l00290">ADC_ZC_THRESHOLD</a>, <a class="el" href="BLDC_8h-source.html#l00165">ADMUX_CURRENT</a>, <a class="el" href="BLDC_8h-source.html#l00168">ADMUX_REF_VOLTAGE</a>, <a class="el" href="BLDC_8h-source.html#l00162">ADMUX_SPEED_REF</a>, <a class="el" href="BLDC_8h-source.html#l00216">CLEAR_ALL_TIMER1_INT_FLAGS</a>, <a class="el" href="BLDC_8h-source.html#l00296">COMMUTATION_CORRECTION</a>, <a class="el" href="BLDC_8h-source.html#l00251">COMMUTATION_TIMING_IIR_COEFF_A</a>, <a class="el" href="BLDC_8h-source.html#l00259">COMMUTATION_TIMING_IIR_COEFF_B</a>, <a class="el" href="main_8c-source.html#l00080">currentUpdated</a>, <a class="el" href="BLDC_8h-source.html#l00210">DISABLE_ALL_TIMER0_INTS</a>, <a class="el" href="BLDC_8h-source.html#l00108">EDGE_FALLING</a>, <a class="el" href="BLDC_8h-source.html#l00111">EDGE_RISING</a>, <a class="el" href="main_8c-source.html#l00042">filteredTimeSinceCommutation</a>, <a class="el" href="main_8c-source.html#l00074">referenceVoltageADC</a>, <a class="el" href="BLDC_8h-source.html#l00222">SET_TIMER1_INT_COMMUTATION</a>, <a class="el" href="main_8c-source.html#l00071">shuntVoltageADC</a>, <a class="el" href="main_8c-source.html#l00068">speedReferenceADC</a>, <a class="el" href="main_8c-source.html#l00077">speedUpdated</a>, <a class="el" href="BLDC_8h-source.html#l00039">TRUE</a>, and <a class="el" href="main_8c-source.html#l00057">zcPolarity</a>.<div class="fragment"><pre class="fragment"><a name="l00365"></a>00365 {<a name="l00366"></a>00366 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;<a name="l00367"></a>00367 <a name="l00368"></a>00368 <span class="comment">// Disable ADC auto-triggering. This must be done here to avoid wrong channel being sampled on manual samples later.</span><a name="l00369"></a>00369 ADCSRA &= ~((1 << ADATE) | (1 << ADIE));<a name="l00370"></a>00370 <a name="l00371"></a>00371 <span class="comment">// Wait for auto-triggered ADC sample to complete.</span><a name="l00372"></a>00372 <span class="keywordflow">while</span> (!(ADCSRA & (1 << ADIF)))<a name="l00373"></a>00373 {<a name="l00374"></a>00374 <a name="l00375"></a>00375 }<a name="l00376"></a>00376 temp = ADCH;<a name="l00377"></a>00377 <span class="keywordflow">if</span> (((<a class="code" href="main_8c.html#a5">zcPolarity</a> == <a class="code" href="BLDC_8h.html#a27">EDGE_RISING</a>) && (temp > <a class="code" href="BLDC_8h.html#a78">ADC_ZC_THRESHOLD</a>)) || ((<a class="code" href="main_8c.html#a5">zcPolarity</a> == <a class="code" href="BLDC_8h.html#a26">EDGE_FALLING</a>) && (temp < <a class="code" href="BLDC_8h.html#a78">ADC_ZC_THRESHOLD</a>)))<a name="l00378"></a>00378 {<a name="l00379"></a>00379 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timeSinceCommutation;<a name="l00380"></a>00380 <a name="l00381"></a>00381 <span class="comment">// Find time since last commutation</span><a name="l00382"></a>00382 timeSinceCommutation = TCNT1;<a name="l00383"></a>00383 TCNT1 = <a class="code" href="BLDC_8h.html#a79">COMMUTATION_CORRECTION</a>;<a name="l00384"></a>00384 <a name="l00385"></a>00385 <span class="comment">// Filter the current ZC detection with earlier measurements through an IIR filter.</span><a name="l00386"></a>00386 <a class="code" href="main_8c.html#a3">filteredTimeSinceCommutation</a> = (<a class="code" href="BLDC_8h.html#a69">COMMUTATION_TIMING_IIR_COEFF_A</a> * timeSinceCommutation<a name="l00387"></a>00387 + <a class="code" href="BLDC_8h.html#a70">COMMUTATION_TIMING_IIR_COEFF_B</a> * <a class="code" href="main_8c.html#a3">filteredTimeSinceCommutation</a>)<a name="l00388"></a>00388 / (<a class="code" href="BLDC_8h.html#a69">COMMUTATION_TIMING_IIR_COEFF_A</a> + <a class="code" href="BLDC_8h.html#a70">COMMUTATION_TIMING_IIR_COEFF_B</a>);<a name="l00389"></a>00389 OCR1A = <a class="code" href="main_8c.html#a3">filteredTimeSinceCommutation</a>;<a name="l00390"></a>00390 <a name="l00391"></a>00391 <a class="code" href="main_8c.html#a10">speedUpdated</a> = <a class="code" href="BLDC_8h.html#a4">TRUE</a>;<a name="l00392"></a>00392 <a name="l00393"></a>00393 <a class="code" href="BLDC_8h.html#a62">SET_TIMER1_INT_COMMUTATION</a>;<a name="l00394"></a>00394 <a class="code" href="BLDC_8h.html#a60">CLEAR_ALL_TIMER1_INT_FLAGS</a>;<a name="l00395"></a>00395 <a name="l00396"></a>00396 <span class="comment">// Disable Timer/Counter0 overflow ISR.</span><a name="l00397"></a>00397 <a class="code" href="BLDC_8h.html#a58">DISABLE_ALL_TIMER0_INTS</a>;<a name="l00398"></a>00398 <a name="l00399"></a>00399 <span class="comment">// Read speed reference.</span><a name="l00400"></a>00400 <a name="l00401"></a>00401 <span class="comment">// Make sure that a sample is not in progress.</span><a name="l00402"></a>00402 <span class="keywordflow">while</span> (ADCSRA & (1 << ADSC))<a name="l00403"></a>00403 {<a name="l00404"></a>00404 <a name="l00405"></a>00405 }<a name="l00406"></a>00406 <span class="comment">// Change channel</span><a name="l00407"></a>00407 ADMUX = <a class="code" href="BLDC_8h.html#a44">ADMUX_SPEED_REF</a>;<a name="l00408"></a>00408 <a name="l00409"></a>00409 <span class="comment">// Start conversion manually.</span><a name="l00410"></a>00410 ADCSRA |= (1 << ADSC);<a name="l00411"></a>00411 <a name="l00412"></a>00412 <span class="comment">// Wait for conversion to complete.</span><a name="l00413"></a>00413 <span class="keywordflow">while</span>((ADCSRA & (1 << ADSC)))<a name="l00414"></a>00414 {<a name="l00415"></a>00415 <a name="l00416"></a>00416 }<a name="l00417"></a>00417 <a class="code" href="main_8c.html#a7">speedReferenceADC</a> = ADCH;<a name="l00418"></a>00418 <a name="l00419"></a>00419 <span class="comment">// Read voltage reference.</span><a name="l00420"></a>00420 <span class="comment">// Change ADC channel.</span><a name="l00421"></a>00421 ADMUX = <a class="code" href="BLDC_8h.html#a46">ADMUX_REF_VOLTAGE</a>;<a name="l00422"></a>00422 <span class="comment">// Start conversion manually.</span><a name="l00423"></a>00423 ADCSRA |= (1 << ADSC);<a name="l00424"></a>00424 <span class="comment">// Wait for conversion to complete.</span><a name="l00425"></a>00425 <span class="keywordflow">while</span>((ADCSRA & (1 << ADSC)))<a name="l00426"></a>00426 {<a name="l00427"></a>00427 <a name="l00428"></a>00428 }<a name="l00429"></a>00429 <a class="code" href="main_8c.html#a9">referenceVoltageADC</a> = ADCH;<a name="l00430"></a>00430 <a name="l00431"></a>00431 <span class="comment">// Enable current measurements in ADC ISR.</span><a name="l00432"></a>00432 ADMUX = <a class="code" href="BLDC_8h.html#a45">ADMUX_CURRENT</a>;<a name="l00433"></a>00433 ADCSRA |= (1 << ADATE) | (1 << ADIE) | <a class="code" href="BLDC_8h.html#a49">ADC_PRESCALER</a>;<a name="l00434"></a>00434 }<a name="l00435"></a>00435 <span class="keywordflow">else</span><a name="l00436"></a>00436 {<a name="l00437"></a>00437 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> tempADMUX;<a name="l00438"></a>00438 <a name="l00439"></a>00439 tempADMUX = ADMUX;<a name="l00440"></a>00440 <span class="comment">// Read current</span><a name="l00441"></a>00441 <a name="l00442"></a>00442 <span class="comment">// Make sure that a sample is not in progress</span><a name="l00443"></a>00443 <span class="keywordflow">while</span> (ADCSRA & (1 << ADSC))<a name="l00444"></a>00444 {<a name="l00445"></a>00445 <a name="l00446"></a>00446 }<a name="l00447"></a>00447 <a name="l00448"></a>00448 <span class="comment">// Change channel</span><a name="l00449"></a>00449 ADMUX = <a class="code" href="BLDC_8h.html#a45">ADMUX_CURRENT</a>;<a name="l00450"></a>00450 <a name="l00451"></a>00451 <span class="comment">// Start conversion manually.</span><a name="l00452"></a>00452 ADCSRA |= (1 << ADSC);<a name="l00453"></a>00453 <span class="comment">// Wait for conversion to complete.</span><a name="l00454"></a>00454 <span class="keywordflow">while</span>((ADCSRA & (1 << ADSC)))<a name="l00455"></a>00455 {<a name="l00456"></a>00456 <a name="l00457"></a>00457 }<a name="l00458"></a>00458 <a name="l00459"></a>00459 <a class="code" href="main_8c.html#a8">shuntVoltageADC<
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -