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

📄 main_8c-source.html

📁 Atmel算法(pid)-步进电机驱动源码 HOWTO,不好用你找我,绝对ok!
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00959"></a>00959 <a name="l00960"></a>00960     <span class="comment">//Adjust next sector start index. It might be set to a value larger than</span><a name="l00961"></a>00961     <span class="comment">//SINE_TABLE_LENGTH at this point. This is adjusted in AdjustSineTableIndex</span><a name="l00962"></a>00962     <span class="comment">//and should not be done here, as it will cause problems when advance</span><a name="l00963"></a>00963     <span class="comment">//commutation is used.</span><a name="l00964"></a>00964     <a class="code" href="main_8c.html#a6">sineTableNextSectorStart</a> = (tempIndex &gt;&gt; 8) + <a class="code" href="PMSM_8h.html#a4">TABLE_ELEMENTS_PER_COMMUTATION_SECTOR</a>;<a name="l00965"></a>00965   }<a name="l00966"></a>00966 <a name="l00967"></a>00967   <span class="comment">//If block commutation is used. Commutate according to hall signal.</span><a name="l00968"></a>00968   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fastFlags.driveWaveform == <a class="code" href="PMSM_8h.html#a30">WAVEFORM_BLOCK_COMMUTATION</a>)<a name="l00969"></a>00969   {<a name="l00970"></a>00970     <a class="code" href="main_8c.html#a24">BlockCommutate</a>(<a class="code" href="main_8c.html#a22">GetDesiredDirection</a>(), hall);<a name="l00971"></a>00971   }<a name="l00972"></a>00972 <a name="l00973"></a>00973   <span class="comment">//Update internal and external signals that depend on hall sensor value.</span><a name="l00974"></a>00974   <a class="code" href="main_8c.html#a33">TachoOutputUpdate</a>(hall);<a name="l00975"></a>00975   <a class="code" href="main_8c.html#a27">ActualDirectionUpdate</a>(lastHall, hall);<a name="l00976"></a>00976   <a class="code" href="main_8c.html#a28">ReverseRotationSignalUpdate</a>();<a name="l00977"></a>00977 <a name="l00978"></a>00978   lastHall = hall;<a name="l00979"></a>00979 <a name="l00980"></a>00980   <span class="comment">//Calculate new increment for sine wave generation and reset commutation</span><a name="l00981"></a>00981   <span class="comment">//timer.</span><a name="l00982"></a>00982   <a class="code" href="main_8c.html#a1">sineTableIncrement</a> = <a class="code" href="main_8c.html#a30">SineTableIncrementCalculate</a>(<a class="code" href="main_8c.html#a3">commutationTicks</a>);<a name="l00983"></a>00983   <a class="code" href="main_8c.html#a3">commutationTicks</a> = 0;<a name="l00984"></a>00984 <a name="l00985"></a>00985   <span class="comment">//Since the hall sensors are changing, the motor can not be stopped.</span><a name="l00986"></a>00986   fastFlags.motorStopped = <a class="code" href="pid_8h.html#a4">FALSE</a>;<a name="l00987"></a>00987 }<a name="l00988"></a>00988 <a name="l00989"></a>00989 <a name="l00998"></a>00998 <span class="preprocessor">#pragma vector=PCINT2_vect</span><a name="l00999"></a><a class="code" href="PMSM_8h.html#a83">00999</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a41">DirectionInputChangeISR</a>(<span class="keywordtype">void</span>)<a name="l01000"></a>01000 {<a name="l01001"></a>01001   <span class="comment">//Update desired direction flag.</span><a name="l01002"></a>01002   <a class="code" href="main_8c.html#a26">DesiredDirectionUpdate</a>();<a name="l01003"></a>01003 <a name="l01004"></a>01004 <span class="preprocessor">#if (TURN_MODE == TURN_MODE_COAST)</span><a name="l01005"></a>01005 <span class="preprocessor"></span>  <span class="comment">//Disable driver signals to let motor coast. The motor will automatically</span><a name="l01006"></a>01006   <span class="comment">//start once it is synchronized or stopped.</span><a name="l01007"></a>01007   <a class="code" href="main_8c.html#a35">DisablePWMOutputs</a>();<a name="l01008"></a>01008   fastFlags.motorSynchronized = <a class="code" href="pid_8h.html#a4">FALSE</a>;<a name="l01009"></a>01009   fastFlags.motorStopped = <a class="code" href="pid_8h.html#a4">FALSE</a>;<a name="l01010"></a>01010   fastFlags.driveWaveform = <a class="code" href="PMSM_8h.html#a33">WAVEFORM_UNDEFINED</a>;<a name="l01011"></a>01011 <span class="preprocessor">#endif</span><a name="l01012"></a>01012 <span class="preprocessor"></span><a name="l01013"></a>01013 <span class="preprocessor">#if (TURN_MODE == TURN_MODE_BRAKE)</span><a name="l01014"></a>01014 <span class="preprocessor"></span>  <span class="comment">//Set motor in brake mode. The motor will automatically start once it is</span><a name="l01015"></a>01015   <span class="comment">//synchronized or stopped.</span><a name="l01016"></a>01016   fastFlags.motorSynchronized = <a class="code" href="pid_8h.html#a4">FALSE</a>;<a name="l01017"></a>01017   fastFlags.motorStopped = <a class="code" href="pid_8h.html#a4">FALSE</a>;<a name="l01018"></a>01018   <a class="code" href="main_8c.html#a19">TimersSetModeBrake</a>(); <span class="comment">// Automatically sets driveWaveform.</span><a name="l01019"></a>01019 <span class="preprocessor">#endif</span><a name="l01020"></a>01020 <span class="preprocessor"></span>}<a name="l01021"></a>01021 <a name="l01022"></a>01022 <a name="l01029"></a>01029 <span class="preprocessor">#pragma vector=TIMER1_CAPT_vect</span><a name="l01030"></a><a class="code" href="PMSM_8h.html#a84">01030</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a42">Timer1CaptureISR</a>(<span class="keywordtype">void</span>)<a name="l01031"></a>01031 {<a name="l01032"></a>01032   <span class="keywordflow">if</span> (fastFlags.driveWaveform == <a class="code" href="PMSM_8h.html#a31">WAVEFORM_SINUSOIDAL</a>)<a name="l01033"></a>01033   {<a name="l01034"></a>01034     <a class="code" href="stdint_8h.html#a56">uint8_t</a> tempU, tempV, tempW;<a name="l01035"></a>01035     {<a name="l01036"></a>01036       <a class="code" href="stdint_8h.html#a56">uint8_t</a> <span class="keyword">const</span> __flash * sineTablePtr = <a class="code" href="PMSMtables_8h.html#a0">sineTable</a>;<a name="l01037"></a>01037 <a name="l01038"></a>01038       <a class="code" href="main_8c.html#a31">AdjustSineTableIndex</a>(<a class="code" href="main_8c.html#a1">sineTableIncrement</a>);<a name="l01039"></a>01039 <a name="l01040"></a>01040       <span class="comment">//Add sine table offset to pointer. Must be multiplied by 3, since one</span><a name="l01041"></a>01041       <span class="comment">//value for each phase is stored in the table.</span><a name="l01042"></a>01042       sineTablePtr += (<a class="code" href="main_8c.html#a2">sineTableIndex</a> &gt;&gt; 8) * 3;<a name="l01043"></a>01043 <a name="l01044"></a>01044       tempU = *sineTablePtr++;<a name="l01045"></a>01045       <span class="keywordflow">if</span> (<a class="code" href="main_8c.html#a22">GetDesiredDirection</a>() == <a class="code" href="PMSM_8h.html#a7">DIRECTION_FORWARD</a>)<a name="l01046"></a>01046       {<a name="l01047"></a>01047         tempV = *sineTablePtr++;<a name="l01048"></a>01048         tempW = *sineTablePtr;<a name="l01049"></a>01049       }<a name="l01050"></a>01050       <span class="keywordflow">else</span><a name="l01051"></a>01051       {<a name="l01052"></a>01052         tempW = *sineTablePtr++;<a name="l01053"></a>01053         tempV = *sineTablePtr;<a name="l01054"></a>01054       }<a name="l01055"></a>01055     }<a name="l01056"></a>01056 <a name="l01057"></a>01057     <span class="comment">//Scale sine modulation values to the current amplitude.</span><a name="l01058"></a>01058     tempU = ((<a class="code" href="stdint_8h.html#a58">uint16_t</a>)(<a class="code" href="main_8c.html#a4">amplitude</a> * tempU) &gt;&gt; 8);<a name="l01059"></a>01059     tempV = ((<a class="code" href="stdint_8h.html#a58">uint16_t</a>)(<a class="code" href="main_8c.html#a4">amplitude</a> * tempV) &gt;&gt; 8);<a name="l01060"></a>01060     tempW = ((<a class="code" href="stdint_8h.html#a58">uint16_t</a>)(<a class="code" href="main_8c.html#a4">amplitude</a> * tempW) &gt;&gt; 8);<a name="l01061"></a>01061 <a name="l01062"></a>01062     {<a name="l01063"></a>01063       <a class="code" href="stdint_8h.html#a56">uint8_t</a> compareHigh, compareLow;<a name="l01064"></a>01064 <a name="l01065"></a>01065 <a name="l01066"></a>01066       <a class="code" href="main_8c.html#a29">InsertDeadband</a>(tempU, &amp;compareHigh, &amp;compareLow);<a name="l01067"></a>01067       OCR0A = compareHigh;<a name="l01068"></a>01068       OCR0B = compareLow;<a name="l01069"></a>01069 <a name="l01070"></a>01070       <a class="code" href="main_8c.html#a29">InsertDeadband</a>(tempV, &amp;compareHigh, &amp;compareLow);<a name="l01071"></a>01071       OCR1AL = compareHigh;<a name="l01072"></a>01072       OCR1BL = compareLow;<a name="l01073"></a>01073 <a name="l01074"></a>01074       <a class="code" href="main_8c.html#a29">InsertDeadband</a>(tempW, &amp;compareHigh, &amp;compareLow);<a name="l01075"></a>01075       OCR2A = compareHigh;<a name="l01076"></a>01076       OCR2B = compareLow;<a name="l01077"></a>01077     }<a name="l01078"></a>01078   }<a name="l01079"></a>01079   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fastFlags.driveWaveform == <a class="code" href="PMSM_8h.html#a30">WAVEFORM_BLOCK_COMMUTATION</a>)<a name="l01080"></a>01080   {<a name="l01081"></a>01081     <a class="code" href="stdint_8h.html#a58">uint16_t</a> blockCommutationDuty = <a class="code" href="main_8c.html#a4">amplitude</a> * <a class="code" href="PMSM_8h.html#a40">BLOCK_COMMUTATION_DUTY_MULTIPLIER</a>;<a name="l01082"></a>01082 <a name="l01083"></a>01083     <span class="keywordflow">if</span> (blockCommutationDuty &gt; 255)<a name="l01084"></a>01084     {<a name="l01085"></a>01085       blockCommutationDuty = 255;<a name="l01086"></a>01086     }<a name="l01087"></a>01087 <a name="l01088"></a>01088     <a class="code" href="main_8c.html#a21">BlockCommutationSetDuty</a>((<a class="code" href="stdint_8h.html#a56">uint8_t</a>)blockCommutationDuty);<a name="l01089"></a>01089   }<a name="l01090"></a>01090 <a name="l01091"></a>01091   <a class="code" href="main_8c.html#a36">CommutationTicksUpdate</a>();<a name="l01092"></a>01092 <a name="l01093"></a>01093   {<a name="l01094"></a>01094     <span class="comment">//Run the speed regulation loop with constant intervals.</span><a name="l01095"></a>01095     <span class="keyword">static</span> <a class="code" href="stdint_8h.html#a56">uint8_t</a> speedRegTicks = 0;<a name="l01096"></a>01096     speedRegTicks++;<a name="l01097"></a>01097     <span class="keywordflow">if</span> (speedRegTicks &gt;= <a class="code" href="PMSM_8h.html#a45">SPEED_CONTROLLER_TIME_BASE</a>)<a name="l01098"></a>01098     {<a name="l01099"></a>01099       <a class="code" href="main_8c.html#a9">SpeedControllerRun</a> = <a class="code" href="pid_8h.html#a5">TRUE</a>;<a name="l01100"></a>01100       speedRegTicks -= <a class="code" href="PMSM_8h.html#a45">SPEED_CONTROLLER_TIME_BASE</a>;<a name="l01101"></a>01101     }<a name="l01102"></a>01102   }<a name="l01103"></a>01103 }<a name="l01104"></a>01104 <a name="l01105"></a>01105 <a name="l01121"></a>01121 <span class="preprocessor">#pragma vector=ADC_vect</span><a name="l01122"></a><a class="code" href="PMSM_8h.html#a87">01122</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="main_8c.html#a43">ADCCompleteISR</a>(<span class="keywordtype">void</span>)<a name="l01123"></a>01123 {<a name="l01124"></a>01124   <span class="keywordflow">switch</span> (ADMUX)<a name="l01125"></a>01125   {<a name="l01126"></a>01126   <span class="keywordflow">case</span> <a class="code" href="PMSM_8h.html#a24">ADMUX_SPEED_REF</a>:<a name="l01127"></a>01127     <a class="code" href="main_8c.html#a8">speedInput</a> = ADCH;<a name="l01128"></a>01128     ADMUX = <a class="code" href="PMSM_8h.html#a25">ADMUX_CURRENT</a>;<a name="l01129"></a>01129     <span class="keywordflow">break</span>;<a name="l01130"></a>01130   <span class="keywordflow">case</span> <a class="code" href="PMSM_8h.html#a25">ADMUX_CURRENT</a>:<a name="l01131"></a>01131     <a class="code" href="main_8c.html#a7">current</a> = ADCH;<a name="l01132"></a>01132     ADMUX = <a class="code" href="PMSM_8h.html#a24">ADMUX_SPEED_REF</a>;<a name="l01133"></a>01133     <span class="keywordflow">break</span>;<a name="l01134"></a>01134   <span class="keywordflow">default</span>:<a name="l01135"></a>01135     <span class="comment">//This is probably an error and should be handled.</span><a name="l01136"></a>01136     <span class="keywordflow">break</span>;<a name="l01137"></a>01137   }<a name="l01138"></a>

⌨️ 快捷键说明

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