找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6785|回復: 5
打印 上一主題 下一主題
收起左側

AVR stdio寫的ATMEGA16控制步進電機正反轉和速度

[復制鏈接]
跳轉到指定樓層
樓主
ID:162249 發(fā)表于 2017-1-18 09:32 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
AVR stdio寫的ATMEGA16控制步進電機正反轉和速度,供大家免費參閱和批評

適合初學者,總共七個按鍵  三個按鍵控制三個速度正轉,三個按鍵控制三個速度反轉,一個按鍵控制停止。

本程序控制步進電機是和步進電機驅動器相連接的,所以脈沖只有一路,如果想直接連步進電機只需要稍加改動即可。


完整代碼下載:
MEGA16stepmotor.zip (95.53 KB, 下載次數: 129)

主程序預覽:
  1. #define F_CPU 800000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #define INT8U unsigned int
  5. #define INT16U unsigned int

  6. const INT8U FFW[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};//一拍p0口輸出8個脈沖

  7. //按鍵定義
  8. #define K1_DOWN()((PIND &_BV(PD0)) == 0x00)//K1:正轉速度1
  9. #define K2_DOWN()((PIND &_BV(PD1)) == 0x00)//K2:正轉速度2
  10. #define K3_DOWN()((PIND &_BV(PD2)) == 0x00)//K3:正轉速度3
  11. #define K4_DOWN()((PIND &_BV(PD3)) == 0x00)//K4:停止
  12. #define K5_DOWN()((PIND &_BV(PD4)) == 0x00)//K5:反轉速度1
  13. #define K6_DOWN()((PIND &_BV(PD5)) == 0x00)//K6:反轉速度2
  14. #define K7_DOWN()((PIND &_BV(PD6)) == 0x00)//K7:反轉速度3

  15. void STEP_MOTOR_FWRUN_1(INT8U n)
  16. {
  17.    INT8U i,j;
  18.    
  19.    for(i=0;i<n;i++)//轉動n圈
  20.    {
  21.      for(j=0;j<16;j++)//循環(huán)輸出16*8拍
  22.      {
  23.         //if (K1_DOWN())break;
  24.                  if (K2_DOWN())break;
  25.                  if (K3_DOWN())break;
  26.        if (K4_DOWN())return;//中途按下K4時電機停止轉動
  27.           
  28.              if (K5_DOWN())break;
  29.                  if (K6_DOWN())break;
  30.                  if (K7_DOWN())break;
  31.           PORTB=FFW[j];
  32.           _delay_us(50);

  33. }
  34. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  35. }
  36. }

  37. void STEP_MOTOR_FWRUN_2(INT8U n)
  38. {
  39.    INT8U i,j;
  40.    
  41.    for(i=0;i<n;i++)//轉動n圈
  42.    {
  43.      for(j=0;j<16;j++)
  44.      {
  45.        if (K1_DOWN())break;
  46.                 // if (K2_DOWN())break;
  47.                  if (K3_DOWN())break;
  48.        if (K4_DOWN())return;//中途按下K4時電機停止轉動

  49.              if (K5_DOWN())break;
  50.                  if (K6_DOWN())break;
  51.                  if (K7_DOWN())break;
  52.           PORTB=FFW[j];
  53.           _delay_us(150);

  54. }
  55. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  56. }
  57. }

  58. void STEP_MOTOR_FWRUN_3(INT8U n)
  59. {
  60.    INT8U i,j;
  61.    
  62.    for(i=0;i<n;i++)//轉動n圈
  63.    {
  64.      for(j=0;j<16;j++)
  65.      {
  66.        if (K1_DOWN())break;
  67.                  if (K2_DOWN())break;
  68.                 // if (K3_DOWN())break;
  69.        if (K4_DOWN())return;//中途按下K4時電機停止轉動
  70.           
  71.              if (K5_DOWN())break;
  72.                  if (K6_DOWN())break;
  73.                  if (K7_DOWN())break;
  74.           PORTB=FFW[j];
  75.           _delay_us(300);

  76. }
  77. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  78. }
  79. }


  80. void STEP_MOTOR_CWRUN_5(INT8U n)
  81. {
  82.    INT8U i,j;
  83.    
  84.    for(i=0;i<n;i++)//轉動n圈
  85.    {
  86.      for(j=0;j<16;j++)
  87.      {
  88.       if (K1_DOWN())break;
  89.                  if (K2_DOWN())break;
  90.                  if (K3_DOWN())break;
  91.        if (K4_DOWN())return;//中途按下K4時電機停止轉動
  92.           
  93.             // if (K5_DOWN())break;
  94.                  if (K6_DOWN())break;
  95.                  if (K7_DOWN())break;
  96.           
  97.            PORTB=FFW[j];
  98.           _delay_us(300);

  99. }
  100. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  101. }
  102. }

  103. void STEP_MOTOR_CWRUN_6(INT8U n)
  104. {
  105.    INT8U i,j;
  106.    
  107.    for(i=0;i<n;i++)//轉動n圈
  108.    {
  109.      for(j=0;j<16;j++)
  110.      {
  111.         if (K1_DOWN())break;
  112.                  if (K2_DOWN())break;
  113.                  if (K3_DOWN())break;
  114.        if (K4_DOWN())return;//中途按下K4時電機停止轉動
  115.          
  116.              if (K5_DOWN())break;
  117.                  //if (K6_DOWN())break;
  118.                  if (K7_DOWN())break;
  119.           
  120.            PORTB=FFW[j];//方向為0時正轉
  121.           _delay_us(150);

  122. }
  123. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  124. }
  125. }

  126. void STEP_MOTOR_CWRUN_7(INT8U n)
  127. {
  128.    INT8U i,j;
  129.    
  130.    for(i=0;i<n;i++)//轉動n圈
  131.    {
  132.      for(j=0;j<16;j++)
  133.      {   if (K1_DOWN())break;
  134.                  if (K2_DOWN())break;
  135.                  if (K3_DOWN())break;
  136.        if (K4_DOWN())return;//中途按下K4時電機停止轉動
  137.        
  138.              if (K5_DOWN())break;
  139.                  if (K6_DOWN())break;
  140.                 // if (K7_DOWN())break;
  141.            PORTB=FFW[j];
  142.           _delay_us(50);

  143. }
  144. PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
  145. }
  146. }
  147. void beep()
  148. {
  149.         PORTC=0x40;
  150.         _delay_ms(120);
  151.         PORTC=0X00;
  152. }

  153. void initonbeep()
  154. {
  155. PORTC=0x40;
  156. _delay_ms(120);
  157. PORTC=0X00;
  158. _delay_ms(120);
  159. PORTC=0x40;
  160. _delay_ms(120);
  161. PORTC=0X00;
  162. _delay_ms(120);
  163. PORTC=0x40;
  164. _delay_ms(120);
  165. PORTC=0X00;
  166. _delay_ms(120);
  167. PORTC=0x40;
  168. _delay_ms(120);
  169. PORTC=0X00;
  170. }


  171. int main()
  172. {
  173.    INT8U r=65535;
  174.    DDRB=0xFF;PORTB=FFW[0];   //控 制輸出
  175.    DDRD=0X00;PORTD=0xFF;     //按鍵輸入
  176.    DDRA=0X00;PORTA=0xFF; //方向信號
  177.    DDRC=0XFF;PORTC=0x00; //蜂鳴器
  178.    initonbeep ();
  179.   
  180.    while(1)
  181.    {
  182.    

  183.      if(K1_DOWN())
  184.      {
  185.                   _delay_us(200);
  186.                   if(K1_DOWN())
  187.      {
  188.                  beep();
  189.          //while(K1_DOWN());   //等待 K1 釋放
  190.                  PORTA=0x00;        //方向信號為0
  191.          STEP_MOTOR_FWRUN_1(r);//點擊正轉r圈
  192.                  
  193.       }
  194.          }          
  195.           if(K2_DOWN())
  196.      {
  197.                    _delay_us(200);
  198.                   if(K2_DOWN())
  199.      {
  200.                  beep();
  201.          //while(K1_DOWN());   //等待 K1 釋放
  202.                  PORTA=0x00;        //方向信號為0
  203.          STEP_MOTOR_FWRUN_2(r);//點擊正轉r圈
  204.       }
  205.          }          
  206.           if(K3_DOWN())
  207.      {
  208.                    _delay_us(200);
  209.                   if(K3_DOWN())
  210.      {
  211.                  beep();
  212.          //while(K1_DOWN());   //等待 K1 釋放
  213.                  PORTA=0x00;        //方向信號為0
  214.          STEP_MOTOR_FWRUN_3(r);//點擊正轉r圈
  215.       }
  216.          }          
  217.       if(K5_DOWN())
  218.       {
  219.                     _delay_us(200);
  220.                   if(K5_DOWN())
  221.      {
  222.                  beep();
  223.          //while(K2_DOWN());    //等待K2釋放
  224.          PORTA=0x01;         //方向信號為1
  225.          STEP_MOTOR_CWRUN_5(r); //電機反轉r圈
  226.        }
  227.           }          
  228.          if(K6_DOWN())
  229.       {
  230.                     _delay_us(200);
  231.                   if(K6_DOWN())
  232.      {
  233.                  beep();
  234.          //while(K2_DOWN());    //等待K2釋放
  235.          PORTA=0x01;         //方向信號為1
  236.          STEP_MOTOR_CWRUN_6(r); //電機反轉r圈
  237.        }
  238.           }          
  239.          if(K7_DOWN())
  240.       {
  241.                     _delay_us(200);
  242.                   if(K7_DOWN())
  243.      {
  244.                  beep();
  245.          //while(K2_DOWN());    //等待K2釋放
  246.          PORTA=0x01;         //方向信號為1
  247.          STEP_MOTOR_CWRUN_7(r); //電機反轉r圈
  248.        }
  249.           }        
  250.                
  251.      }
  252. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2017-2-12 17:19 | 只看該作者
好資料,51黑有你更精彩。!
回復

使用道具 舉報

板凳
ID:127977 發(fā)表于 2017-4-6 22:13 | 只看該作者
學習一下,謝謝了
回復

使用道具 舉報

地板
ID:198413 發(fā)表于 2017-5-8 22:30 | 只看該作者
樓主可以給我私發(fā)一份嗎
回復

使用道具 舉報

5#
ID:237210 發(fā)表于 2017-10-9 19:10 | 只看該作者
學習了
回復

使用道具 舉報

6#
ID:194122 發(fā)表于 2020-4-2 10:35 | 只看該作者
學習了  幫助很大
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表