久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3154|回復(fù): 0
收起左側(cè)

LabVIEW+51單片機驅(qū)動A4988步進電機做的十字滑臺

[復(fù)制鏈接]
ID:906881 發(fā)表于 2021-11-3 20:27 | 顯示全部樓層 |閱讀模式
使用A4988驅(qū)動模塊驅(qū)動42步進電機
一、結(jié)構(gòu)問題
1、兩個滑臺的尺寸不匹配,X絲杠滑塊與Y軸絲杠底座安裝不到一起
解決方案:將兩個絲杠模組全部解體,將X絲杠滑塊打穿,用螺絲固定,并用銼刀進行打磨。
潛在問題:①銼刀打磨過的螺絲可能不能使用,若后期拆卸,需另覓蹊徑;②由于結(jié)構(gòu)問題,X絲杠滑塊與Y絲杠底座固定處只用了兩個螺絲,連接不太穩(wěn)定,已用三秒固定。
2、限位開關(guān)與絲杠之前沒有連接零件
解決方案:手工打磨或采用3D打印該工件。
潛在問題:由于傳感器與控制系統(tǒng)均采用5V供電,因此金屬限位開關(guān)的有效檢測距離只有  ,所以連接必須可靠,并且必須保證滑塊必須在傳感器檢測的有效距離之內(nèi),否則會燒毀步進電機。
二、方案設(shè)計問題
1、上位機與下位機通訊協(xié)議的約定
最初打算采用幀頭+數(shù)據(jù)幀+幀尾的格式,但限于項目時間,故采用如下協(xié)議約定。
上位機接收指令如下表所示:
注:位移控制設(shè)置三個按鍵分別為:設(shè)置、加、減,采用光標跳轉(zhuǎn)進行不同軸的設(shè)置
②軟件:
采用定時器輸出A4988驅(qū)動的脈沖,從而控制步進電機的角速度、角位移;
采用2個外部中斷判斷金屬限位開關(guān)是否被觸發(fā),因為該中斷優(yōu)先級最高;
采用串口和上位機進行通訊。
3、金屬接近傳感器電路設(shè)計
由于51系別單片機外部中斷資源有限,所需傳感器有4個,故每一個絲杠模組兩端傳感器作為一組,作為“與門”的輸入,輸出信號傳給單片機的外部中斷,這樣可以保證任何一個傳感器輸出信號都可以觸發(fā)外部中斷。
4、步進電機的失能控制
雖然A4988驅(qū)動上有ENABLE端口,但是51單片機的硬件資源已經(jīng)使用完畢,因此,只能停止脈沖輸入,從而控制步進電機失能。
5、滑塊的速度、位移計算
本項目采用兩個步距角為1.8°的兩相四線步進電機,在1細分的驅(qū)動下,一個脈沖轉(zhuǎn)動1.8°,因此轉(zhuǎn)動一圈(360°)需要200個脈沖。由于絲杠的精度較高,所以步進電機的角位移轉(zhuǎn)換為滑塊的位移比例差距較大,電機每轉(zhuǎn)動一圈,滑塊位移()mm(還未測量),控制精度完全滿足要求,因此我們采用1細分進行驅(qū)動。
利用鋼尺測量出電機的角位移與滑塊線位移的關(guān)系為:  
得出滑塊的速度為:
其中t為滑塊位移的時間,該時間利用脈沖周期進行計算

單片機源程序如下:
  1. # include <Motor_Con.h>

  2. sbit KEY_XFOR = P2^6;         //X正轉(zhuǎn)按鍵                                                   
  3. sbit KEY_XREV = P2^5;         //X反轉(zhuǎn)按鍵
  4. sbit KEY_XUP  = P1^2;              //X加速按鍵  
  5. sbit KEY_XDOWN =P1^1;         //X減速按鍵

  6. sbit KEY_YFOR = P2^7;         //Y正轉(zhuǎn)按鍵                                                   
  7. sbit KEY_YREV = P1^6;         //Y反轉(zhuǎn)按鍵
  8. sbit KEY_YUP  = P1^5;              //Y加速按鍵  
  9. sbit KEY_YDOWN =P1^4;         //Y減速按鍵         

  10. sbit KEY_SET_UP   =P2^2;                  //位移加按鍵
  11. sbit KEY_SET_DOWN =P2^3;                  //位移減按鍵
  12. sbit KEY_SETX     =P2^0;                  //X位移設(shè)置按鍵
  13. sbit KEY_SETY     =P2^1;                  //Y位移設(shè)置按鍵

  14. sbit KEY_STOP   =P2^4;                  //啟動停止按鍵

  15. extern char User_Data[];
  16. int Distance_X2,Distance_Y2;         //定時器所需取反的脈沖次數(shù)
  17. int Distance_X1,Distance_Y1;         //位移編號
  18. extern int num_x,num_y;                         //x、y速度
  19. int Order_X=10,Order_Y=10;       //初始化XY指令為電機停止
  20. int Distance[]={5,10,30,60,100}; //位移顯示
  21. bit stop=0;                                                 //啟動停止標志
  22. /*按鍵掃描函數(shù)*/
  23. void KEY_SCAN()
  24. {        
  25.                 if((KEY_XFOR == 0))  //X正轉(zhuǎn)按鍵被按下 或 接收到X正轉(zhuǎn)指令
  26.                         FOR(0);
  27.                 if((KEY_YFOR == 0))  //Y正轉(zhuǎn)按鍵被按下 或 接收到Y(jié)正轉(zhuǎn)指令
  28.                         FOR(1);
  29.                 if((KEY_XREV == 0))  //X反轉(zhuǎn)按鍵被按下 或 接收到X反轉(zhuǎn)指令
  30.                         REV(0);
  31.                 if((KEY_YREV == 0))  //Y反轉(zhuǎn)按鍵被按下 或 接收到Y(jié)反轉(zhuǎn)指令
  32.                         REV(1);
  33.                 if((KEY_XUP  == 0))   //X加速按鍵被按下 或 接收到X加速指令
  34.                 {        delay(300);                if((KEY_XUP  == 0))                Speed_UP(0); }while(!KEY_XUP);
  35.                 if((KEY_YUP  == 0) )   //Y加速按鍵被按下 或 接收到Y(jié)加速指令
  36.                 {        delay(300);                if((KEY_YUP  == 0))                Speed_UP(1); }while(!KEY_YUP);
  37.                 if((KEY_XDOWN  == 0))  //X減速按鍵被按下 或 接收到X減速指令
  38.                 {        delay(300);                if((KEY_XDOWN  == 0))        Speed_DOWN(0);}while(!KEY_XDOWN);
  39.                 if((KEY_YDOWN  == 0))  //Y減速按鍵被按下 或 接收到Y(jié)減速指令
  40.                 {        delay(300);                if((KEY_YDOWN  == 0) )         Speed_DOWN(1);}while(!KEY_YDOWN);

  41. }

  42. void Distance_Data()
  43. {
  44.         switch(Distance_Y1)
  45.         {
  46.                 case 1 :        Distance_Y2=500;        break;
  47.                 case 2 :        Distance_Y2=1000;        break;
  48.                 case 3 :        Distance_Y2=3000;        break;
  49.                 case 4 :        Distance_Y2=6000;        break;
  50.                 case 5 :        Distance_Y2=10000;        break;
  51.         }
  52.         switch(Distance_X1)
  53.         {
  54.                 case 1 :        Distance_X2=200;        break;
  55.                 case 2 :        Distance_X2=400;        break;
  56.                 case 3 :        Distance_X2=1200;        break;
  57.                 case 4 :        Distance_X2=2400;        break;
  58.                 case 5 :        Distance_X2=4000;        break;
  59.         }
  60. }
  61. void Distance_Set()
  62. {
  63.         int i=0;
  64.         Disp_Str(2,0,"SET_X:   mm",11);          //顯示
  65.         Disp_Str(3,0,"SET_Y:   mm",11);
  66.         if(KEY_SETX==0)                                          //位移設(shè)置按鍵按下
  67.         {        
  68.                 delay(500);
  69.                 if(KEY_SETX==0)
  70.                 {
  71.                         while(!KEY_SETX);
  72.                         ET0=0;                                          //關(guān)定時器0,電機停止
  73.                         while(1)                                  //進入死循環(huán),設(shè)置位移距離
  74.                         {                                
  75.                                 if(KEY_SET_UP==0)          //位移加按鍵按下
  76.                                 {
  77.                                         delay(100);
  78.                                         Distance_X1++;        
  79.                                         i++;
  80.                                         if(Distance_X1==6)//位移數(shù)組最大到6
  81.                                                 Distance_X1=1;
  82.                                         if(i==5)
  83.                                                 i=0;
  84.                                 }
  85.                                 if(KEY_SET_DOWN==0)
  86.                                 {
  87.                                         delay(100);
  88.                                         Distance_X1--;        
  89.                                         i--;
  90.                                         if(Distance_X1<1)
  91.                                                 Distance_X1=5;
  92.                                         if(i<0)
  93.                                                 i=4;
  94.                                 }
  95.                                 Write_Int(2,3,Distance[i]); //顯示當前速度
  96.                                 Distance_Data();                    //位移設(shè)置
  97.                                 delay(500);
  98.                                 if(KEY_SETX==0)                                //位移設(shè)置按鍵再次按下退出循環(huán)
  99.                                 {
  100.                                         ET0=1;
  101.                                         return;
  102.                                 }
  103.                         }        
  104.                 }
  105.         }
  106.         if(KEY_SETY==0)
  107.         {        
  108.                 delay(500);
  109.                 if(KEY_SETY==0)
  110.                 {
  111.                         while(!KEY_SETY);
  112.                         ET0=0;
  113.                         while(1)
  114.                         {                                
  115.                                 if(KEY_SET_UP==0)
  116.                                 {
  117.                                         delay(100);
  118.                                         Distance_Y1++;        
  119.                                         i++;
  120.                                         if(Distance_Y1==6)
  121.                                                 Distance_Y1=1;
  122.                                         if(i==5)
  123.                                                 i=0;
  124.                                 }
  125.                                 if(KEY_SET_DOWN==0)
  126.                                 {
  127.                                         delay(100);
  128.                                         Distance_Y1--;        
  129.                                         i--;
  130.                                         if(Distance_Y1<1)
  131.                                                 Distance_Y1=5;
  132.                                         if(i<0)
  133.                                                 i=4;
  134.                                 }
  135.                                 Write_Int(3,3,Distance[i]);
  136.                                 Distance_Data();
  137.                                 if(KEY_SETY==0)
  138.                                 {
  139.                                         ET0=1;
  140.                                         return;
  141.                                 }
  142.                         }        
  143.                 }
  144.         }
  145. }
  146. /*限位開關(guān)掃描*/
  147. void RUN_SCAN()
  148. {
  149.         static uint Y,X;
  150.         if(EXTI1==0)     //Y軸                 
  151.         {
  152.                 delay(100);
  153.                 if(EXTI1==0)
  154.                 {
  155.                         DIR_Y=~DIR_Y;
  156.                         Y++;
  157.                         if(Y%2)                                   //每次取反之后變量加一,從而判斷正反轉(zhuǎn)
  158.                         {
  159.                                 Disp_Str(1,1,"RE",2);        //顯示反轉(zhuǎn)
  160.                                 Uart_String("B0002\r\n"); //發(fā)送反轉(zhuǎn)指令
  161.                         }        
  162.                         else
  163.                         {
  164.                                 Disp_Str(1,1,"FO",2);
  165.                                 Uart_String("B0001\r\n");
  166.                         }        
  167.                 }while(!EXTI1);
  168.         }
  169.         if(EXTI0==0)                   //X軸
  170.         {
  171.                 delay(100);
  172.                 if(EXTI0==0)
  173.                 {
  174.                         DIR_X=~DIR_X;
  175.                         X++;
  176.                         if(X%2)
  177.                         {
  178.                                 Disp_Str(0,1,"RE",2);
  179.                                 Uart_String("A0002\r\n");        
  180.                         }
  181.                         else
  182.                         {
  183.                                 Disp_Str(0,1,"FO",2);
  184.                                 Uart_String("A0001\r\n");
  185.                         }         
  186.                 }while(!EXTI0);
  187.         }                        
  188. }
  189. /*啟動停止按鈕*/
  190. void Usert_receive()
  191. {
  192.         if(KEY_STOP==0)
  193.         {
  194.                 delay(200);
  195.                 if(KEY_STOP==0)
  196.                         stop=~stop;
  197.         }while(!KEY_STOP);
  198. }
  199. void main()
  200. {
  201.         Lcd_Init();           //LCD初始化
  202.         Timer0Init();  //定時器0初始化
  203.         UsartInit();   //串口初始化
  204.         while(1)
  205.         {
  206.                 Usert_receive();        //判斷啟動按鍵是否被按下
  207.                 while(!(stop==1))        //系統(tǒng)沒有啟動卡死在改循環(huán)中
  208.                 {
  209.                         Usert_receive();   //判斷啟動是否被按下
  210.                         ET0=0;                           //關(guān)閉定時器0
  211.                         Disp_Str(2,0,"    Welcome!    ",16);        //顯示
  212.                         Disp_Str(3,0," Please Start!  ",16);
  213.                 }
  214.                 Distance_Set();         //位移設(shè)置按鍵掃描
  215.                 RUN_SCAN();                 //限位開關(guān)掃描
  216.                 ET0=1;                         //打開定時器
  217.                 KEY_SCAN();                 //控制按鍵掃描               
  218.         }
  219. }
復(fù)制代碼

單片機代碼與LabVIEW 51hei附件下載:
十字滑臺.7z (67.93 KB, 下載次數(shù): 90)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 草草视频在线免费观看 | 日韩在线精品 | 久草电影网 | 国产欧美精品一区二区三区 | 美女日批免费视频 | 亚洲成人av | 欧美日韩国产一区二区三区 | www.国产精| 欧美激情综合 | 国产探花 | 亚洲福利网 | 香蕉视频在线播放 | 99热精品在线观看 | 涩涩导航 | 久久久91精品国产一区二区三区 | 国产在线观看一区二区三区 | 91精品入口蜜桃 | 亚州精品天堂中文字幕 | 日韩在线中文 | 国产欧美一区二区三区日本久久久 | 国产精品久久国产愉拍 | 搞黄视频免费看 | 日韩视频91| 国产精品视频网址 | 久免费视频 | 日韩欧美二区 | 97精品国产97久久久久久免费 | 国产大学生情侣呻吟视频 | 欧美午夜精品 | 成人九色 | 国产精品久久久久aaaa樱花 | 少妇精品亚洲一区二区成人 | 高清国产午夜精品久久久久久 | av色站| 老司机免费视频 | 最新国产视频 | 欧美九九| 亚洲女人天堂成人av在线 | 欧美三级三级三级爽爽爽 | 91pron在线 | wwwxxx国产|