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

📄 speed__cntr_8c-source.html

📁 使用AVR单片机控制步进电机的软件代码
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<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 &amp;= ~((1&lt;&lt;CS12)|(1&lt;&lt;CS11)|(1&lt;&lt;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 &gt;= <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 &lt;= <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 &gt;= <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> &gt;= 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) &lt;= 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 &gt;&gt;= 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 &gt;&gt;= 2);          <span class="comment">// shift twice</span>00267   <span class="keywordflow">if</span>(xr &lt; 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 &lt; 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 + -