⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_8c-source.html

📁 一个用GCC做的atmel芯片控制的无刷无传感器的程序.包括各种参考文档!
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<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 &lt;&lt; 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 &amp; (1 &lt;&lt; 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 &lt;&lt; ADATE) | (1 &lt;&lt; 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 &amp; (1 &lt;&lt; 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 &lt;&lt; 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 &amp; (1 &lt;&lt; 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</a> = ADCH;<a name="l00460"></a>00460     <a class="code" href="main_8c.html#a11">currentUpdated</a> = <a class="code" href="BLDC_8h.html#a4">TRUE</a>;<a name="l00461"></a>00461 <a name="l00462"></a>00462     <span class="comment">// Restore ADC channel.</span><a name="l00463"></a>00463     ADMUX = tempADMUX;<a name="l00464"></a>00464     ADCSRA |= (1 &lt;&lt; ADATE) | (1 &lt;&lt; ADIE) | <a class="code" href="BLDC_8h.html#a49">ADC_PRESCALER</a>;<a name="l00465"></a>00465   }<a name="l00466"></a>00466 }<a name="l00467"></a>00467 <a name="l00468"></a>00468 <a name="l00481"></a>00481 <span class="preprocessor">#pragma vector=TIMER1_COMPA_vect</span><a name="l00482"></a><a class="code" href="main_8c.html#a22">00482</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a22">Commutate</a>()<a name="l00483"></a>00483 {<a name="l00484"></a>00484   <span class="comment">// Commutate and clear commutation timer.</span><a name="l00485"></a>00485   <a class="code" href="BLDC_8h.html#a28">DRIVE_PORT</a> = <a class="code" href="main_8c.html#a4">nextDrivePattern</a>;<a name="l00486"></a>00486   TCNT1 = 0;<a name="l00487"></a>00487 <a name="l00488"></a>00488   <a class="code" href="main_8c.html#a5">zcPolarity</a> = <a class="code" href="main_8c.html#a6">nextCommutationStep</a> &amp; 0x01;<a name="l00489"></a>00489 <a name="l00490"></a>00490   <span class="comment">// Set zero-cross detection holdoff time.</span><a name="l00491"></a>00491   <a class="code" href="BLDC_8h.html#a60">CLEAR_ALL_TIMER1_INT_FLAGS</a>;<a name="l00492"></a>00492   OCR1B = <a class="code" href="BLDC_8h.html#a55">ZC_DETECTION_HOLDOFF_TIME_US</a>;<a name="l00493"></a>00493   <a class="code" href="BLDC_8h.html#a63">SET_TIMER1_INT_HOLDOFF</a>;<a name="l00494"></a>00494 <a name="l00495"></a>00495   __watchdog_reset();<a name="l00496"></a>00496 }<a name="l00497"></a>00497 <a name="l00498"></a>00498 <a name="l00506"></a>00506 <span class="preprocessor">#pragma vector=TIMER1_COMPB_vect</span><a name="l00507"></a><a class="code" href="main_8c.html#a23">00507</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a23">EnableZCDetection</a>()<a name="l00508"></a>00508 {<a name="l00509"></a>00509   <span class="comment">// Enable TCNT0 overflow ISR.</span><a name="l00510"></a>00510   <a class="code" href="BLDC_8h.html#a57">CLEAR_ALL_TIMER0_INT_FLAGS</a>;<a name="l00511"></a>00511   <a class="code" href="BLDC_8h.html#a60">CLEAR_ALL_TIMER1_INT_FLAGS</a>;<a name="l00512"></a>00512   <a class="code" href="BLDC_8h.html#a59">SET_TIMER0_INT_ZC_DETECTION</a>;<a name="l00513"></a>00513   <a class="code" href="BLDC_8h.html#a61">DISABLE_ALL_TIMER1_INTS</a>;<a name="l00514"></a>00514 <a name="l00515"></a>00515   <span class="comment">// Set up ADC for zero-cross detection</span><a name="l00516"></a>00516   ADMUX = <a class="code" href="main_8c.html#a1">ADMUXTable</a>[<a class="code" href="main_8c.html#a6">nextCommutationStep</a>];<a name="l00517"></a>00517 <a name="l00518"></a>00518   <span class="comment">// Wait for ADC to complete</span><a name="l00519"></a>00519   <span class="keywordflow">while</span> (!(ADCSRA &amp; (1 &lt;&lt; ADIF)))<a name="l00520"></a>00520   {<a name="l00521"></a>00521 <a name="l00522"></a>00522   }<a name="l00523"></a>00523   ADCSRA &amp;= ~(1 &lt;&lt; ADIE);<a name="l00524"></a>00524   ADCSRA |= (1 &lt;&lt; ADSC) | (1 &lt;&lt; ADATE);<a name="l00525"></a>00525 <a name="l00526"></a>00526   <span class="comment">// Rotate commutation step counter.</span><a name="l00527"></a>00527   <a class="code" href="main_8c.html#a6">nextCommutationStep</a>++;<a name="l00528"></a>00528   <span class="keywordflow">if</span> (<a class="code" href="main_8c.html#a6">nextCommutationStep</a> &gt;= 6)<a name="l00529"></a>00529   {<a name="l00530"></a>00530     <a class="code" href="main_8c.html#a6">nextCommutationStep</a> = 0;<a name="l00531"></a>00531   }<a name="l00532"></a>00532   <a class="code" href="main_8c.html#a4">nextDrivePattern</a> = <a class="code" href="main_8c.html#a0">driveTable</a>[<a class="code" href="main_8c.html#a6">nextCommutationStep</a>];<a name="l00533"></a>00533 }<a name="l00534"></a>00534 <a name="l00535"></a>00535 <a name="l00536"></a>00536 <span class="comment">/* \brief ADC complete interrupt service routine, used for current measurements.</span><a name="l00537"></a>00537 <span class="comment"> *</span><a name="l00538"></a>00538 <span class="comment"> *  This interrupt service routine is only enabled when current measurements are</span><a name="l00539"></a>00539 <span class="comment"> *  auto-triggered by the PWM counter overflow. The measured value is simply</span><a name="l00540"></a>00540 <span class="comment"> *  copied to \ref shuntVoltageADC, the \ref currentUpdated flag is set and</span><a name="l00541"></a>00541 <span class="comment"> *  Timer0 (PWM timer) interrupt flags are cleared.</span><a name="l00542"></a>00542 <span class="comment"> */</span><a name="l00543"></a>00543 <span class="preprocessor">#pragma vector=ADC_vect</span><a name="l00544"></a><a class="code" href="main_8c.html#a24">00544</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a24">CurrentMeasurementComplete</a>()<a name="l00545"></a>00545 {<a name="l00546"></a>00546   <a class="code" href="main_8c.html#a8">shuntVoltageADC</a> = ADCH;<a name="l00547"></a>00547   <a class="code" href="main_8c.html#a11">currentUpdated</a> = <a class="code" href="BLDC_8h.html#a4">TRUE</a>;<a name="l00548"></a>00548   <a class="code" href="BLDC_8h.html#a57">CLEAR_ALL_TIMER0_INT_FLAGS</a>;<a name="l00549"></a>00549 }<a name="l00550"></a>00550 <a name="l00551"></a>00551 <a name="l00558"></a>00558 <span class="preprocessor">#pragma vector=WDT_vect</span><a name="l00559"></a><a class="code" href="main_8c.html#a25">00559</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a25">WatchdogISR</a>()<a name="l00560"></a>00560 {<a name="l00561"></a>00561   <a class="code" href="BLDC_8h.html#a76">DISABLE_DRIVING</a>;<a name="l00562"></a>00562   <span class="keywordflow">for</span>(;;)<a name="l00563"></a>00563   {<a name="l00564"></a>00564     ;<a name="l00565"></a>00565   }<a name="l00566"></a>00566 }<a name="l00567"></a>00567 <a name="l00573"></a>00573 <span class="preprocessor">#ifdef ANALOG_COMPARATOR_ENABLE</span><a name="l00574"></a>00574 <span class="preprocessor"></span><span class="preprocessor">#pragma vector=ANA_COMP_vect</span><a name="l00575"></a><a class="code" href="main_8c.html#a26">00575</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a26">OverCurrentISR</a>()<a name="l00576"></a>00576 {<a name="l00577"></a>00577   <a class="code" href="BLDC_8h.html#a76">DISABLE_DRIVING</a>;<a name="l00578"></a>00578   <span class="keywordflow">for</span>(;;)<a name="l00579"></a>00579   {<a name="l00580"></a>00580     ;<a name="l00581"></a>00581   }<a name="l00582"></a>00582 }<a name="l00583"></a>00583 <span class="preprocessor">#endif</span><a name="l00584"></a>00584 <span class="preprocessor"></span><a name="l00585"></a>00585 <a name="l00593"></a><a class="code" href="main_8c.html#a27">00593</a> <span class="keywordtype">void</span> <a class="code" href="BLDC_8h.html#a95">StartupDelay</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> delay)<a name="l00594"></a>00594 {<a name="l00595"></a>00595   <a class="code" href="BLDC_8h.html#a60">CLEAR_ALL_TIMER1_INT_FLAGS</a>;<a name="l00596"></a>00596   <span class="keywordflow">do</span><a name="l00597"></a>00597   {<a name="l00598"></a>00598     TCNT1 = 0xffff - <a class="code" href="BLDC_8h.html#a52">STARTUP_DELAY_MULTIPLIER</a>;<a name="l00599"></a>00599     <span class="comment">// Wait for timer to overflow.</span><a name="l00600"></a>00600     <span class="keywordflow">while</span> (!(TIFR1 &amp; (1 &lt;&lt; TOV1)))<a name="l00601"></a>00601     {<a name="l00602"></a>00602 <a name="l00603"></a>00603     }<a name="l00604"></a>00604 <a name="l00605"></a>00605     <a class="code" href="BLDC_8h.html#a60">CLEAR_ALL_TIMER1_INT_FLAGS</a>;<a name="l00606"></a>00606     delay--;<a name="l00607"></a>00607   } <span class="keywordflow">while</span> (delay);<a name="l00608"></a>00608 }<a name="l00609"></a>00609 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -