📄 main_8c-source.html
字号:
<a name="l00610"></a>00610 <a name="l00611"></a>00611 <a name="l00612"></a>00612 <span class="preprocessor">#ifdef SPEED_CONTROL_CLOSED_LOOP</span><a name="l00613"></a>00613 <span class="preprocessor"></span><a name="l00619"></a>00619 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="BLDC_8h.html#a94">PWMControl</a>(<span class="keywordtype">void</span>)<a name="l00620"></a>00620 {<a name="l00621"></a>00621 <span class="keywordtype">signed</span> <span class="keywordtype">int</span> speedCompensation;<a name="l00622"></a>00622 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> currentCompensation = 0;<a name="l00623"></a>00623 <span class="keyword">static</span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> duty = <a class="code" href="BLDC_8h.html#a77">STARTUP_PWM_COMPARE_VALUE</a>;<a name="l00624"></a>00624 <a name="l00625"></a>00625 <span class="comment">// Run speed control only if a new speed measurement is available.</span><a name="l00626"></a>00626 <span class="keywordflow">if</span> (<a class="code" href="main_8c.html#a10">speedUpdated</a>)<a name="l00627"></a>00627 {<a name="l00628"></a>00628 speedCompensation = <a class="code" href="BLDC_8h.html#a99">SpeedControl</a>();<a name="l00629"></a>00629 <a class="code" href="main_8c.html#a10">speedUpdated</a> = <a class="code" href="BLDC_8h.html#a3">FALSE</a>;<a name="l00630"></a>00630 duty += speedCompensation;<a name="l00631"></a>00631 }<a name="l00632"></a>00632 <a name="l00633"></a>00633 <span class="comment">// Run current control only if a new current measurement is available.</span><a name="l00634"></a>00634 <span class="keywordflow">if</span> (<a class="code" href="main_8c.html#a11">currentUpdated</a>)<a name="l00635"></a>00635 {<a name="l00636"></a>00636 currentCompensation = <a class="code" href="BLDC_8h.html#a100">CurrentControl</a>();<a name="l00637"></a>00637 <a class="code" href="main_8c.html#a11">currentUpdated</a> = <a class="code" href="BLDC_8h.html#a3">FALSE</a>;<a name="l00638"></a>00638 }<a name="l00639"></a>00639 <a name="l00640"></a>00640 <span class="comment">// Keep duty cycle within limits.</span><a name="l00641"></a>00641 <span class="keywordflow">if</span> (duty < <a class="code" href="BLDC_8h.html#a80">MIN_PWM_COMPARE_VALUE</a>)<a name="l00642"></a>00642 {<a name="l00643"></a>00643 duty = <a class="code" href="BLDC_8h.html#a80">MIN_PWM_COMPARE_VALUE</a>;<a name="l00644"></a>00644 }<a name="l00645"></a>00645 <span class="keywordflow">if</span> (duty > (<a class="code" href="BLDC_8h.html#a81">MAX_PWM_COMPARE_VALUE</a> - currentCompensation))<a name="l00646"></a>00646 {<a name="l00647"></a>00647 duty = <a class="code" href="BLDC_8h.html#a81">MAX_PWM_COMPARE_VALUE</a> - currentCompensation;<a name="l00648"></a>00648 }<a name="l00649"></a>00649 <a name="l00650"></a>00650 <a class="code" href="BLDC_8h.html#a56">SET_PWM_COMPARE_VALUE</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)duty);<a name="l00651"></a>00651 }<a name="l00652"></a>00652 <span class="preprocessor">#endif</span><a name="l00653"></a>00653 <span class="preprocessor"></span><a name="l00654"></a>00654 <span class="preprocessor">#ifdef SPEED_CONTROL_OPEN_LOOP</span><a name="l00655"></a><a class="code" href="main_8c.html#a28">00655</a> <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="BLDC_8h.html#a94">PWMControl</a>(<span class="keywordtype">void</span>)<a name="l00656"></a>00656 {<a name="l00657"></a>00657 <span class="comment">// Only update duty cycle if a new speed reference measurement has been made. (Done right after speed measurement is ready)</span><a name="l00658"></a>00658 <span class="keywordflow">if</span> (<a class="code" href="main_8c.html#a10">speedUpdated</a>)<a name="l00659"></a>00659 {<a name="l00660"></a>00660 <span class="comment">// Calculate duty cycle from speed reference value.</span><a name="l00661"></a>00661 <a class="code" href="BLDC_8h.html#a56">SET_PWM_COMPARE_VALUE</a>(<a class="code" href="BLDC_8h.html#a80">MIN_PWM_COMPARE_VALUE</a> + <a class="code" href="main_8c.html#a7">speedReferenceADC</a> * (<a class="code" href="BLDC_8h.html#a81">MAX_PWM_COMPARE_VALUE</a> - <a class="code" href="BLDC_8h.html#a80">MIN_PWM_COMPARE_VALUE</a>) / <a class="code" href="BLDC_8h.html#a66">ADC_RESOLUTION</a>);<a name="l00662"></a>00662 }<a name="l00663"></a>00663 }<a name="l00664"></a>00664 <span class="preprocessor">#endif</span><a name="l00665"></a>00665 <span class="preprocessor"></span><a name="l00666"></a>00666 <a name="l00672"></a><a class="code" href="main_8c.html#a29">00672</a> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="BLDC_8h.html#a96">CalculateSpeed</a>()<a name="l00673"></a>00673 {<a name="l00674"></a>00674 <span class="comment">// Copy used to minimize period where interrupts are disabled.</span><a name="l00675"></a>00675 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> filteredTimeSinceCommutationCopy;<a name="l00676"></a>00676 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rotationPeriod;<a name="l00677"></a>00677 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> speed;<a name="l00678"></a>00678 <a name="l00679"></a>00679 <span class="comment">/*</span><a name="l00680"></a>00680 <span class="comment"> Disable interrupts to ensure that \ref filteredTimeSinceCommutation is accessed in</span><a name="l00681"></a>00681 <span class="comment"> an atomic operation.</span><a name="l00682"></a>00682 <span class="comment"> */</span><a name="l00683"></a>00683 __disable_interrupt();<a name="l00684"></a>00684 filteredTimeSinceCommutationCopy = <a class="code" href="main_8c.html#a3">filteredTimeSinceCommutation</a>;<a name="l00685"></a>00685 __enable_interrupt();<a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="comment">/*</span><a name="l00688"></a>00688 <span class="comment"> filteredTimeSinceCommutation is one half commutation time. Must be multiplied by 12 to get</span><a name="l00689"></a>00689 <span class="comment"> one full rotation.</span><a name="l00690"></a>00690 <span class="comment"> */</span><a name="l00691"></a>00691 rotationPeriod = (<span class="keywordtype">unsigned</span> long)filteredTimeSinceCommutationCopy * 12;<a name="l00692"></a>00692 speed = (<a class="code" href="BLDC_8h.html#a68">TICKS_PER_MINUTE</a> / rotationPeriod);<a name="l00693"></a>00693 <a name="l00694"></a>00694 <span class="keywordflow">return</span> speed;<a name="l00695"></a>00695 }<a name="l00696"></a>00696 <a name="l00697"></a>00697 <a name="l00707"></a><a class="code" href="main_8c.html#a30">00707</a> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="BLDC_8h.html#a97">CalculateSpeedSetpoint</a>()<a name="l00708"></a>00708 {<a name="l00709"></a>00709 <span class="keywordflow">return</span> (<a class="code" href="BLDC_8h.html#a82">MIN_SPEED</a> + ((<a class="code" href="BLDC_8h.html#a83">MAX_SPEED</a> - <a class="code" href="BLDC_8h.html#a82">MIN_SPEED</a>) * (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)<a class="code" href="main_8c.html#a7">speedReferenceADC</a>) / <a class="code" href="BLDC_8h.html#a66">ADC_RESOLUTION</a>);<a name="l00710"></a>00710 }<a name="l00711"></a>00711 <a name="l00712"></a>00712 <a name="l00719"></a><a class="code" href="main_8c.html#a31">00719</a> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="BLDC_8h.html#a98">CalculateCurrent</a>()<a name="l00720"></a>00720 {<a name="l00721"></a>00721 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ADCref;<a name="l00722"></a>00722 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> current;<a name="l00723"></a>00723 <a name="l00724"></a>00724 <span class="comment">// Calculate the voltage at AREF pin (scaled down motor supply voltage),</span><a name="l00725"></a>00725 <span class="comment">// using the known reference voltage. (In milliVolts)</span><a name="l00726"></a>00726 ADCref = <a class="code" href="BLDC_8h.html#a64">EXTERNAL_REF_VOLTAGE</a> * 256<a class="code" href="BLDC_8h.html#a5">UL</a> / <a class="code" href="main_8c.html#a9">referenceVoltageADC</a>;<a name="l00727"></a>00727 <a name="l00728"></a>00728 <span class="comment">// Calculate the current through the shunt. (In milliAmperes)</span><a name="l00729"></a>00729 current = (<span class="keywordtype">unsigned</span> int)((<a class="code" href="main_8c.html#a8">shuntVoltageADC</a> * ADCref * 1000<a class="code" href="BLDC_8h.html#a5">UL</a> / 256<a class="code" href="BLDC_8h.html#a5">UL</a>) / <a class="code" href="BLDC_8h.html#a65">SHUNT_RESISTANCE</a>);<a name="l00730"></a>00730 <a name="l00731"></a>00731 <span class="keywordflow">return</span> current;<a name="l00732"></a>00732 }<a name="l00733"></a>00733 <a name="l00734"></a>00734 <a name="l00742"></a><a class="code" href="main_8c.html#a32">00742</a> <span class="keyword">static</span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> <a class="code" href="BLDC_8h.html#a99">SpeedControl</a>(<span class="keywordtype">void</span>)<a name="l00743"></a>00743 {<a name="l00744"></a>00744 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> speedSetpoint;<a name="l00745"></a>00745 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> currentSpeed;<a name="l00746"></a>00746 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> speedError;<a name="l00747"></a>00747 <span class="keywordtype">signed</span> <span class="keywordtype">long</span> dutyChange;<a name="l00748"></a>00748 <a name="l00749"></a>00749 <a name="l00750"></a>00750 <a name="l00751"></a>00751 speedSetpoint = <a class="code" href="BLDC_8h.html#a97">CalculateSpeedSetpoint</a>();<a name="l00752"></a>00752 currentSpeed = <a class="code" href="BLDC_8h.html#a96">CalculateSpeed</a>();<a name="l00753"></a>00753 speedError = (speedSetpoint - currentSpeed);<a name="l00754"></a>00754 dutyChange = speedError * <a class="code" href="BLDC_8h.html#a84">P_REG_K_P</a> / <a class="code" href="BLDC_8h.html#a85">P_REG_SCALING</a>;<a name="l00755"></a>00755 <a name="l00756"></a>00756 <span class="keywordflow">return</span> dutyChange;<a name="l00757"></a>00757 }<a name="l00758"></a>00758 <a name="l00759"></a>00759 <a name="l00767"></a><a class="code" href="main_8c.html#a33">00767</a> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="BLDC_8h.html#a100">CurrentControl</a>(<span class="keywordtype">void</span>)<a name="l00768"></a>00768 {<a name="l00769"></a>00769 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> current;<a name="l00770"></a>00770 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> overCurrentCorrection = 0;<a name="l00771"></a>00771 <a name="l00772"></a>00772 current = <a class="code" href="BLDC_8h.html#a98">CalculateCurrent</a>();<a name="l00773"></a>00773 <a name="l00774"></a>00774 <span class="comment">// Cut power to motor if current is critically high.</span><a name="l00775"></a>00775 <span class="keywordflow">if</span> (current > <a class="code" href="BLDC_8h.html#a73">CURRENT_LIMITER_CRITICAL</a>)<a name="l00776"></a>00776 {<a name="l00777"></a>00777 <a class="code" href="BLDC_8h.html#a28">DRIVE_PORT</a> = 0x00;<a name="l00778"></a>00778 <span class="keywordflow">for</span> (;;)<a name="l00779"></a>00779 {<a name="l00780"></a>00780 <span class="comment">// Stop and let watchdog timer reset part.</span><a name="l00781"></a>00781 }<a name="l00782"></a>00782 }<a name="l00783"></a>00783 <a name="l00784"></a>00784 <span class="keywordflow">if</span> (current > <a class="code" href="BLDC_8h.html#a72">CURRENT_LIMITER_START</a>)<a name="l00785"></a>00785 {<a name="l00786"></a>00786 overCurrentCorrection = (current - <a class="code" href="BLDC_8h.html#a72">CURRENT_LIMITER_START</a>) * <a class="code" href="BLDC_8h.html#a75">CURRENT_LIMITER_FACTOR</a>;<a name="l00787"></a>00787 }<a name="l00788"></a>00788 <a name="l00789"></a>00789 <span class="keywordflow">if</span> (overCurrentCorrection > 255)<a name="l00790"></a>00790 {<a name="l00791"></a>00791 <span class="keywordflow">return</span> 255;<a name="l00792"></a>00792 }<a name="l00793"></a>00793 <a name="l00794"></a>00794 <span class="keywordflow">return</span> overCurrentCorrection;<a name="l00795"></a>00795 }<a name="l00796"></a>00796 </pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Oct 11 10:57:02 2005 for Sensorless control of 3-phase brushless DC motors by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -