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

📄 main_8c-source.html

📁 一个用GCC做的atmel芯片控制的无刷无传感器的程序.包括各种参考文档!
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<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 &lt; <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 &gt; (<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 &gt; <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 &gt; <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 &gt; 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&nbsp;<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 + -