📄 main_8c-source.html
字号:
<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 >> 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> >> 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) >> 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) >> 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) >> 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, &compareHigh, &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, &compareHigh, &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, &compareHigh, &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 > 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 >= <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 + -