📄 speed__cntr_8c-source.html
字号:
<a name="l00164"></a><a class="code" href="speed__cntr_8c.html#a3">00164</a> <span class="preprocessor"></span>__interrupt <span class="keywordtype">void</span> <a class="code" href="speed__cntr_8c.html#a3">speed_cntr_TIMER1_COMPA_interrupt</a>( <span class="keywordtype">void</span> )00165 {00166 <span class="comment">// Holds next delay period.</span>00167 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> new_step_delay;00168 <span class="comment">// Remember the last step delay used when accelrating.</span>00169 <span class="keyword">static</span> <span class="keywordtype">int</span> last_accel_delay;00170 <span class="comment">// Counting steps when moving.</span>00171 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> step_count = 0;00172 <span class="comment">// Keep track of remainder from new_step-delay calculation to incrase accurancy</span>00173 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rest = 0;00174 00175 OCR1A = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a>;00176 00177 <span class="keywordflow">switch</span>(<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o5">run_state</a>) {00178 <span class="keywordflow">case</span> <a class="code" href="speed__cntr_8h.html#a7">STOP</a>:00179 step_count = 0;00180 rest = 0;00181 <span class="comment">// Stop Timer/Counter 1.</span>00182 TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));00183 <a class="code" href="main_8c.html#a0">status</a>.<a class="code" href="structGLOBAL__FLAGS.html#o2">running</a> = <a class="code" href="global_8h.html#a1">FALSE</a>;00184 <span class="keywordflow">break</span>;00185 00186 <span class="keywordflow">case</span> <a class="code" href="speed__cntr_8h.html#a8">ACCEL</a>:00187 <a class="code" href="sm__driver_8h.html#a11">sm_driver_StepCounter</a>(<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o3">dir</a>);00188 step_count++;00189 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a>++;00190 new_step_delay = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a> - (((2 * (<span class="keywordtype">long</span>)<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a>) + rest)/(4 * <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> + 1));00191 rest = ((2 * (<span class="keywordtype">long</span>)<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a>)+rest)%(4 * <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> + 1);00192 <span class="comment">// Chech if we should start decelration.</span>00193 <span class="keywordflow">if</span>(step_count >= <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o1">decel_start</a>) {00194 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o2">decel_val</a>;00195 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o5">run_state</a> = <a class="code" href="speed__cntr_8h.html#a9">DECEL</a>;00196 }00197 <span class="comment">// Chech if we hitted max speed.</span>00198 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(new_step_delay <= <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o4">min_delay</a>) {00199 last_accel_delay = new_step_delay;00200 new_step_delay = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o4">min_delay</a>;00201 rest = 0;00202 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o5">run_state</a> = <a class="code" href="speed__cntr_8h.html#a10">RUN</a>;00203 }00204 <span class="keywordflow">break</span>;00205 00206 <span class="keywordflow">case</span> <a class="code" href="speed__cntr_8h.html#a10">RUN</a>:00207 <a class="code" href="sm__driver_8h.html#a11">sm_driver_StepCounter</a>(<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o3">dir</a>);00208 step_count++;00209 new_step_delay = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o4">min_delay</a>;00210 <span class="comment">// Chech if we should start decelration.</span>00211 <span class="keywordflow">if</span>(step_count >= <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o1">decel_start</a>) {00212 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o2">decel_val</a>;00213 <span class="comment">// Start decelration with same delay as accel ended with.</span>00214 new_step_delay = last_accel_delay;00215 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o5">run_state</a> = <a class="code" href="speed__cntr_8h.html#a9">DECEL</a>;00216 }00217 <span class="keywordflow">break</span>;00218 00219 <span class="keywordflow">case</span> <a class="code" href="speed__cntr_8h.html#a9">DECEL</a>:00220 <a class="code" href="sm__driver_8h.html#a11">sm_driver_StepCounter</a>(<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o3">dir</a>);00221 step_count++;00222 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a>++;00223 new_step_delay = <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a> - (((2 * (<span class="keywordtype">long</span>)<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a>) + rest)/(4 * <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> + 1));00224 rest = ((2 * (<span class="keywordtype">long</span>)<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a>)+rest)%(4 * <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> + 1);00225 <span class="comment">// Check if we at last step</span>00226 <span class="keywordflow">if</span>(<a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o0">accel_count</a> >= 0){00227 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o5">run_state</a> = <a class="code" href="speed__cntr_8h.html#a7">STOP</a>;00228 }00229 <span class="keywordflow">break</span>;00230 }00231 <a class="code" href="speed__cntr_8c.html#a0">srd</a>.<a class="code" href="structspeedRampData.html#o6">step_delay</a> = new_step_delay;00232 }00233 00244 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> sqrt(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> x)00245 {00246 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> xr; <span class="comment">// result register</span>00247 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> q2; <span class="comment">// scan-bit register</span>00248 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> f; <span class="comment">// flag (one bit)</span>00249 00250 xr = 0; <span class="comment">// clear result</span>00251 q2 = 0x40000000L; <span class="comment">// higest possible result bit</span>00252 <span class="keywordflow">do</span>00253 {00254 <span class="keywordflow">if</span>((xr + q2) <= x)00255 {00256 x -= xr + q2;00257 f = 1; <span class="comment">// set flag</span>00258 }00259 <span class="keywordflow">else</span>{00260 f = 0; <span class="comment">// clear flag</span>00261 }00262 xr >>= 1;00263 <span class="keywordflow">if</span>(f){00264 xr += q2; <span class="comment">// test flag</span>00265 }00266 } <span class="keywordflow">while</span>(q2 >>= 2); <span class="comment">// shift twice</span>00267 <span class="keywordflow">if</span>(xr < x){00268 <span class="keywordflow">return</span> xr +1; <span class="comment">// add for rounding</span>00269 }00270 <span class="keywordflow">else</span>{00271 <span class="keywordflow">return</span> xr;00272 }00273 }00274 <a name="l00281"></a><a class="code" href="speed__cntr_8h.html#a15">00281</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="speed__cntr_8h.html#a15">min</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00282 {00283 <span class="keywordflow">if</span>(x < y){00284 <span class="keywordflow">return</span> x;00285 }00286 <span class="keywordflow">else</span>{00287 <span class="keywordflow">return</span> y;00288 }00289 }</div></pre><hr size="1"><address style="align: right;"><small>Generated on Mon May 8 15:05:03 2006 for AVR446 - Linear speed control of stepper motor by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -