欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機步進電機控制器的設計-電子系統設計創新實驗報告+仿真+源碼

[復制鏈接]
跳轉到指定樓層
樓主
電子系統設計創新實驗報告
題目步進電機控制器的設計

設計要求:
  • 步進電機是用電脈沖信號進行控制,將電脈沖信號轉換成相應的角位移或線位移的微電動機,它突出的優點是可以在寬廣的頻率范圍內通過改變脈沖頻率來實現調速,快速啟停,正反轉控制及制動等

摘要
   通過制作步進電機控制器的設計,加深對數字電路和模擬電路的理解以及了解它們在現實生活中的應用,提高動手能力。

  • 系統總體設計
步進電機控制器的設計設計框圖如圖所示,系統由按鍵電路、單片機電路、脈沖放大電路、步進電機等部分組成。時鐘電路產生一個時鐘信號,
  • 系統的按鍵電路
     步進電機按鍵電路如圖1所示
     
圖1
              該按鍵電路由六個按鍵開關組成,第一個按鈕為運行狀態控制,運行電機的啟動與關閉;第二個按鈕為轉速控制,控制電機的轉速;第三個按鈕為步進數預制,可以設置電機的圈數使其自動停止;第四個按鈕為模式調節,可以控制電機的模式;第五個與第六個按鈕為前三個按鈕的參數調節,可以調節它們的參數。
(2)時鐘電路
此系統的時鐘電路設計是采用的內部方式,即利用芯片內部的振蕩電路。MCS-51內部有一個用于構成振蕩器的高增益反相放大器。這個放大器外接晶體諧振器以及電容CX1和CX2構成并聯諧振電路,接在放大器的反饋回路中構成時鐘電路。時鐘頻率越高,單片機控制器的控制節拍越快,運算速度也就越快。
圖2
  • 系統軟件設計
整個系統工作的流程圖如下圖所示:圖需要用VISIO繪制

              對流程圖進行描述,如:
              系統上電初始化,然后進入等待按鍵狀態,如果無按鍵按下,則繼續等待,如有按鍵按下,則判斷是哪一個按鍵,然后執行相應的功能。
還可以再細點
四、系統測試及調試(仿真)——如果是實物制作,則寫系統測試及調試,如果是仿真,則寫系統測試與仿真
圖3 …….

在protues軟件中繪制系統原理圖,如下圖所示:

(整個系統的原理圖)

仿真過程中,記錄了7個不同的仿真波形,如圖3所示,…….然后對圖中內容進行說明,可以看出來它們的速度進行調節會越來越快。


仿真中如還有其它現象則寫進來!



五、結論
系統在仿真過程中比較順利,沒有出現什么大問題,只是在運行中顯示當前步進數的時候,LCD1602刷新步數不是很連續。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機源程序如下:
  1. #include "reg52.h"
  2. #include "lcd.h"

  3. sbit RUN_LED = P2^3;
  4. sbit ON_OFF = P2^4;
  5. sbit SPEED = P2^5;
  6. sbit STEP = P2^6;
  7. sbit MOD = P2^7;
  8. sbit UP = P3^0;
  9. sbit DOWN = P3^1;
  10. sbit M1 = P3^2;
  11. sbit M2 = P3^3;
  12. sbit M3 = P3^4;

  13. #define ui unsigned int
  14. #define uc unsigned char

  15. uc ON_OFF_DATA = 0;//開為1,關為0
  16. unsigned char SPEED_DATA = 5;//默認速度為20,即1.5度為1800r/s,3.0度為600r/s,范圍為1-10
  17. unsigned long STEP_RECORD = 0;//步進圈速
  18. unsigned long STEP_PRESET = 0;//步進預置數
  19. uc MOD_STEP = 0;  //正反轉,正轉為0,反轉為1
  20. uc MOD_PHASE = 0;//相位控制,3.0度為0,1.5度為1
  21. uc SetOrNonSetNumberStartUp ;//置數與非置數模式啟動判斷,0為非置數模式,為1為指數模式
  22. char STATE=0;//此變量存儲線圈通電狀態,在中斷3中switch語句中對應
  23. uc ControlState=0;

  24. code uc Disp[]=" STARTING UP ";

  25. int Button();
  26. void Timer1Init();
  27. void control(uc button);

  28. void aaaa()
  29. {
  30.         uc i;
  31.         LcdInit();
  32.         for(i=0;i<13;i++)
  33.         {
  34.                 LcdWriteData(Disp[i]);
  35.         }
  36. }

  37. void main()
  38. {
  39.         M1 = 0;
  40.         M2 = 0;
  41.         M3 = 0;
  42.         
  43.         RUN_LED = 0;
  44.         LcdInit();
  45.         Timer1Init();
  46.         aaaa();
  47.         
  48.         while(1)
  49.         {
  50.                
  51.                 control(Button());
  52.         }
  53. }

  54. int Button()
  55. {
  56.         static char CACHE_ON_OFF=1,
  57.                                 CACHE_SPEED=1,
  58.                                 CACHE_STEP=1,
  59.                                 CACHE_MOD=1,
  60.                                 CACHE_UP=1,
  61.                                 CACHE_DOWN=1;        
  62.         //////////////////////////////////////////////
  63.         if(ON_OFF == 0)
  64.         {
  65.                 //delay(10);
  66.                 if( CACHE_ON_OFF != ON_OFF ) // 按鍵消抖邏輯與上,上一次存入CACHE_ON_OFF的ON_OFF狀態     
  67.                 {
  68.                         CACHE_ON_OFF = ON_OFF;//將這一次ON_OFF的狀態存入CACHE_ON_OFF中
  69.                         return 1;
  70.                 }
  71.         }
  72.         else        //將這一次ON_OFF的狀態存入CACHE_ON_OFF中
  73.         {
  74.                 CACHE_ON_OFF = 1;
  75.         }
  76.         /////////////////////////////////////////////
  77.         if(SPEED == 0)
  78.         {
  79.                 //delay(10);
  80.                 if( CACHE_SPEED != SPEED ) // 按鍵消抖邏輯與上,上一次存入CACHE_SPEED的SPEED狀態     
  81.                 {
  82.                         CACHE_SPEED = SPEED ;//將這一次SPEED的狀態存入CACHE_SPEED中
  83.                         return 2;
  84.                 }
  85.         }
  86.         else        //將這一次SPEED的狀態存入CACHE_SPEED中
  87.         {
  88.                 CACHE_SPEED = 1;
  89.         }
  90.         /////////////////////////////////////////////
  91.         if(STEP == 0)
  92.         {
  93.                 //delay(10);
  94.                 if( CACHE_STEP != STEP ) // 按鍵消抖邏輯與上,上一次存入CACHE_STEP的STEP狀態     
  95.                 {
  96.                         CACHE_STEP = STEP;//將這一次STEP的狀態存入CACHE_STEP中
  97.                         return 3;
  98.                 }
  99.         }
  100.         else        //將這一次STEP的狀態存入CACHE_STEP中
  101.         {
  102.                 CACHE_STEP = 1;
  103.         }
  104.         //////////////////////////////////////////////
  105.         if(MOD == 0)
  106.         {
  107.                 //delay(10);
  108.                 if( CACHE_MOD != MOD ) // 按鍵消抖邏輯與上,上一次存入CACHE_MOD的MOD狀態     
  109.                 {
  110.                         CACHE_MOD = MOD;//將這一次MOD的狀態存入CACHE_MOD中
  111.                         return 4;
  112.                 }
  113.         }
  114.         else        //將這一次MOD的狀態存入CACHE_MOD中
  115.         {
  116.                 CACHE_MOD = 1;
  117.         }
  118.         //////////////////////////////////////////////
  119.         if(UP == 0)
  120.         {
  121.                 //delay(10);
  122.                 if( CACHE_UP != UP )   
  123.                 {
  124.                         CACHE_UP = UP;
  125.                         return 5;
  126.                 }
  127.         }
  128.         else        
  129.         {
  130.                 CACHE_UP = 1;
  131.         }
  132.         //////////////////////////////////////////////
  133.         if(DOWN == 0)
  134.         {
  135.                 //delay(10);
  136.                 if( CACHE_DOWN != DOWN )   
  137.                 {
  138.                         CACHE_DOWN = DOWN;
  139.                         return 6;
  140.                 }
  141.         }
  142.         else        
  143.         {
  144.                 CACHE_DOWN = 1;
  145.         }

  146.         return 0;
  147. }











  148. void control(uc button)
  149. {
  150.         static uc d=0;
  151.         static STEP_RECORD_COMPARE;
  152.         if(button == 2 || button == 3 || button == 4)
  153.         {
  154.                 ControlState = button;//保存當前控制界面
  155.         }
  156.         if (button == 0)
  157.         {
  158.                 if( ControlState == 3 )
  159.                 {
  160.                         if( STEP_RECORD_COMPARE != STEP_RECORD)
  161.                         {
  162.                                 LcdStep();
  163.                                 STEP_RECORD_COMPARE = STEP_RECORD;
  164.                         }
  165.                 }
  166.         }
  167.         else if(button == 1)
  168.         {
  169.                 if( (button != 5) && (button != 6) ) //進入此if語句不能為上下鍵
  170.                 {
  171.                         ON_OFF_DATA = !ON_OFF_DATA;
  172.                         RUN_LED = ON_OFF_DATA;
  173.                 }
  174.                 if(ON_OFF_DATA == 0)//關閉
  175.                 {
  176.                         EA = 0;//關閉中斷
  177.                         M1 = 0;
  178.                         M2 = 0;
  179.                         M3 = 0;
  180.                         SetOrNonSetNumberStartUp = 0;//置數與非置數模式置位為非置數模式
  181.                         if( ControlState == 3 )
  182.                         {
  183.                                 LcdStep();
  184.                         }

  185.                 }
  186.                 else if(ON_OFF_DATA == 1)
  187.                 {
  188.                         SetOrNonSetNumberStartUp = STEP_PRESET;
  189.                         EA = 1;//打開總中斷
  190.                         STATE=0;
  191.                 }
  192.         }
  193.         //判斷運行狀態為運行還是關閉,1運行則無法修改,if(b == 0)
  194.         
  195.         else if(ControlState == 2)//speed參數調整
  196.         {
  197.                 if(ON_OFF_DATA == 0)
  198.                 {
  199.                         if( (button == 5) && ( SPEED_DATA < 10 ) )
  200.                         {
  201.                                 SPEED_DATA++;
  202.                         }
  203.                         else if( (button == 6) && (SPEED_DATA > 1) )
  204.                         {
  205.                                 SPEED_DATA--;
  206.                         }
  207.                 }
  208.                 LcdSpeed();
  209.                 ///////////////////////////////////////////////////////////////
  210.         }
  211.         else if (ControlState == 3)//STEP,運行圈速預置
  212.         {
  213.                 if( (ON_OFF_DATA == 0) != (button == 3))//進入此if語句不得為運行狀態,切必須為上下鍵
  214.                  {
  215.                         if(button == 5)
  216.                         {
  217.                                 STEP_PRESET++;
  218.                         }
  219.                         else if( (button == 6) && (STEP_PRESET != 0) )
  220.                         {
  221.                                 STEP_PRESET--;
  222.                         }
  223.                 }
  224.                 else if(ON_OFF_DATA == 0)
  225.                 {
  226.                         STEP_PRESET = 0;
  227.                         STEP_RECORD = 0;
  228.                         //步數和步速置數清零
  229.                 }        
  230.                 LcdStep();//更新顯示命令               
  231.         }
  232.         else if (ControlState == 4)//mod,模式預置
  233.         {
  234.                 if( (button != 5) && (button != 6) )
  235.                 {
  236.                         d = !d;
  237.                 }
  238.                 if(d == 0)
  239.                 {
  240.                                 if(button == 5)
  241.                                 {
  242.                                         if ((MOD_STEP != 1) && (ON_OFF_DATA == 0) )
  243.                                         {
  244.                                                 MOD_STEP++;
  245.                                         }
  246.                                 }
  247.                                 else if(button == 6)
  248.                                 {
  249.                                         if((MOD_STEP != 0)  && (ON_OFF_DATA == 0) )
  250.                                         {
  251.                                                 MOD_STEP--;
  252.                                         }
  253.                                 }
  254.                                 LcdModStep();//更新正反轉顯示命令
  255.                 }
  256.                 else if(d != 0)
  257.                 {
  258.                                 if(button == 5)
  259.                                 {
  260.                                         if ( (MOD_PHASE != 1) && (ON_OFF_DATA == 0) )
  261.                                         {
  262.                                                 MOD_PHASE++;
  263.                                         }
  264.                                 }
  265.                                 else if(button == 6)
  266.                                 {
  267.                                         if ( (MOD_PHASE != 0)  && (ON_OFF_DATA == 0) )
  268.                                         {
  269.                                                 MOD_PHASE--;
  270.                                         }
  271.                                 }
  272.                                 LcdModPhase();//更新相位顯示命令
  273.                 }
  274.         }
  275. }




  276. void Timer1Init()//定時器初始化
  277. {
  278.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  279.         TH0=0XFC;        //給定時器賦初值,定時8.33ms
  280.         TL0=0X18;        
  281.         ET0=1;//打開定時器1中斷允許
  282.         TR0=1;//打開定時器        


  283.         EA=0;//打開總中斷

  284. }



  285. void Timer0() interrupt 1
  286. {
  287.         static ui b=0;
  288.         
  289.         TH0=0XFC;        //給定時器賦初值,定時8.33ms
  290.         TL0=0X18;
  291.         //if(SetOrNonSetNumberStartUp == 0)
  292.         if( b >= (11 - SPEED_DATA) )
  293.         {
  294.                 b = 0;
  295.                 if( (MOD_STEP == 0) && (MOD_PHASE == 0) ) //正轉3
  296.                 {
  297.                         STATE++;
  298.                         STATE++;
  299.                         if( STATE > 4 )
  300.                         {
  301.                                 STATE = 0;
  302.                         }
  303.                 }
  304.                 else if( (MOD_STEP == 0) && (MOD_PHASE == 1) ) //正轉1.5
  305.                 {
  306.                         STATE++;
  307.                         if( STATE > 5 )
  308.                         {
  309.                                 STATE = 0;
  310.                         }
  311.                 }
  312.                 else if( (MOD_STEP == 1) && (MOD_PHASE == 0) ) //反轉3
  313.                 {
  314.                         STATE--;
  315.                         STATE--;
  316.                         if( STATE < 0 )
  317.                         {
  318.                                 STATE = 4;
  319.                         }
  320.                 }
  321.                 else if( (MOD_STEP == 1) && (MOD_PHASE == 1) ) //反轉1.5
  322.                 {
  323.                         STATE--;
  324.                         if( STATE < 0 )
  325.                         {
  326.                                 STATE = 5;
  327.                         }
  328.                 }
  329.                 switch(STATE)
  330.                 {
  331.                         case 0:
  332.                                 M1 = 1;
  333.                                 M2 = 0;
  334.                                 M3 = 0;
  335.                                 break;
  336.                         case 1:
  337.                                 M1 = 1;
  338.                                 M2 = 1;
  339.                                 M3 = 0;
  340.                                 break;
  341.                         case 2:
  342.                                 M1 = 0;
  343. ……………………

  344. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
步進電機控制器的設計.7z (230.14 KB, 下載次數: 105)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-10-20 15:46 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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