找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6407|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

步進電機STM32程序(用A4988控制)與限位開關(guān)配合使用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:480013 發(fā)表于 2020-7-25 09:42 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機是STM32的,有需要的可以參考一下,提供了.c和.h文件,只需添加在工程中就好,這里使用了3個步進電機和三個限位開關(guān),添加的話可以對照著修改。
部分代碼顯示如下。
  1. #include "delay.h"
  2. #include "diver.h"
  3. #include "oled.h"
  4. #include "usart.h"
  5. //暫不知道步距角
  6. //電機引腳初始化
  7. extern u8 endB;

  8. void Step_Motor_GPIO_Init(void)
  9. {
  10.          GPIO_InitTypeDef  GPIO_InitStructure;
  11.          
  12.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PA,PD端口時鐘
  13.                
  14.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                 // 端口配置
  15.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  16.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  17.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.12高
  18.          
  19.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  20.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  21.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  22.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根據(jù)設(shè)定參數(shù)初始化GPIOB.12高
  23.         
  24.          limit1=1;
  25.          limit2=1;
  26.          limit3=1;
  27. }


  28. void SetMotor1_forward(u16 speed)
  29. {
  30.                 DIR1=False;  
  31.                 STEP1=1;
  32.                 delay_us(1);
  33.                 STEP1=0;
  34.                 delay_us(speed);
  35. }
  36. void SetMotor1_back(u16 speed)
  37. {
  38.                 DIR1=Turn; //后退
  39.                 STEP1=1;
  40.                 delay_us(1);
  41.                 STEP1=0;
  42.                 delay_us(speed);
  43. }

  44. void SetMotor2_forward(u16 speed)
  45. {
  46.                 DIR2=False;  
  47.                 STEP2=1;
  48.                 delay_us(1);
  49.                 STEP2=0;
  50.                 delay_us(speed);
  51. }
  52. void SetMotor2_back(u16 speed)
  53. {
  54.                 DIR2=Turn; //后退
  55.                 STEP2=1;
  56.                 delay_us(1);
  57.                 STEP2=0;
  58.                 delay_us(speed);
  59. }

  60. void SetMotor3_forward(u16 speed)
  61. {
  62.                 DIR3=False;  
  63.                 STEP3=1;
  64.                 delay_us(1);
  65.                 STEP3=0;
  66.                 delay_us(speed);
  67. }
  68. void SetMotor3_back(u16 speed)
  69. {
  70.                 DIR3=Turn; //后退
  71.                 STEP3=1;
  72.                 delay_us(1);
  73.                 STEP3=0;
  74.                 delay_us(speed);
  75. }

  76. void step1_forward(u16 steps,u16 speed)
  77. {
  78.         u16 i;
  79.         
  80.                 for(;i<=steps;i++)
  81.                                 {
  82.                                         if(limit_1==1)//判斷限位開關(guān)是否被按下,沒有則執(zhí)行下去
  83.                                         SetMotor1_forward(speed);
  84.                                         else        break;//否則就跳出循環(huán)
  85.                                 }
  86.                                 USART1_RX_BUF[endB]=0;//清零準(zhǔn)備下一次接收

  87. }

  88. void step1_back(u16 steps,u16 speed)
  89. {
  90.         u16 i;

  91.         for(;i<=steps;i++)
  92.                                 {
  93.                                         if(limit_2==1)
  94.                                         SetMotor1_back(speed);
  95.                                         else  break;
  96.                                 }
  97.                                 USART1_RX_BUF[endB]=0;
  98. }


  99. void step2_forward(u16 steps,u16 speed)
  100. {
  101.         u16 i;
  102.         
  103.                 for(;i<=steps;i++)
  104.                                 {
  105.                                         if(limit_2==1)
  106.                                         SetMotor2_forward(speed);
  107.                                         else  break;
  108.                                 }
  109.                                 USART1_RX_BUF[endB]=0;//清零準(zhǔn)備下一次接收

  110. }

  111. void step2_back(u16 steps,u16 speed)
  112. {
  113.         u16 i;

  114.         for(;i<=steps;i++)
  115.                                 {
  116.                                         if(limit_2==1)
  117.                                         SetMotor2_back(speed);
  118.                                         else  break;
  119.                                 }
  120.                                 USART1_RX_BUF[endB]=0;
  121. }

  122. void step3_forward(u16 steps,u16 speed)
  123. {
  124.         u16 i;
  125.         
  126.                 for(;i<=steps;i++)
  127.                                 {
  128.                                         if(limit_3==1)
  129.                                         SetMotor3_forward(speed);
  130.                                         else  break;
  131.                                 }
  132.                                 USART1_RX_BUF[endB]=0;//清零準(zhǔn)備下一次接收

  133. }

  134. void step3_back(u16 steps,u16 speed)
  135. {
  136.         u16 i;

  137.         for(;i<=steps;i++)
  138.                                 {
  139.                                         if(limit_3==1)
  140.                                         SetMotor3_back(speed);
  141.                                         else  break;
  142.                                 }
  143.                                 USART1_RX_BUF[endB]=0;
  144. }
  145. void step1_2_forward(u16 steps,u16 speed)
  146. {

  147. u16 i;

  148.         for(;i<=steps;i++)
  149.                                 {
  150.                                         if(limit_1==1&&limit_2==1)
  151.                                         {
  152.                                                 SetMotor1_forward(speed);
  153.                                           SetMotor2_forward(speed);//兩個步進電機一起運動
  154.                                         }
  155.                                                 else  break;
  156.                                 }
  157.      USART1_RX_BUF[endB]=0;
  158. }

  159. void step1_2_back(u16 steps,u16 speed)
  160. {

  161. u16 i;

  162.         for(;i<=steps;i++)
  163.                                 {
  164.                                         if(limit_1==1&&limit_2==1)
  165.                                         {
  166.                                                 SetMotor1_back(speed);
  167.                                           SetMotor2_back(speed);//兩個步進電機一起運動
  168.                                         }
  169.                                                 else  break;
  170.                                 }
  171.      USART1_RX_BUF[endB]=0;
  172. }






  173. /************以下是****************/
  174. //void STEP_1(u16 speed)
  175. //{ STEP1=0;delay_us(speed);  STEP2=0;  delay_us(speed);STEP3=0; delay_us(speed);STEP4=1;delay_us(speed);}
  176. //void STEP_2(u16 speed)
  177. //{ STEP1=0;delay_us(speed); STEP2=0; delay_us(speed);STEP3=1;delay_us(speed); STEP4=0;delay_us(speed);}
  178. //void STEP_4(u16 speed)
  179. //{ STEP1=0;  delay_us(speed);STEP2=1;delay_us(speed);STEP3=0;delay_us(speed); STEP4=0;delay_us(speed);}
  180. //void STEP_8(u16 speed)
  181. //{ STEP1=1;delay_us(speed); STEP2=0;delay_us(speed); STEP3=0;delay_us(speed);STEP4=0;delay_us(speed);}

  182. //void SetMotor_forward(u16 steps,u16 speed)//正轉(zhuǎn)
  183. //{
  184. //        u8 inch;
  185. //        u16 add;
  186. //        for(add=0;add<steps;add++)//轉(zhuǎn)半圈
  187. //        for(inch=0;inch<4;inch++)//完成一個拍數(shù)4*0.36°
  188. //                switch(inch)
  189. //                {
  190. //                        case 0:          STEP_1(speed);  break;
  191. //                  case 1:          STEP_2(speed);  break;
  192. //                        case 2:          STEP_4(speed);  break;
  193. //                        case 3:          STEP_8(speed);  break;
  194. //                }               
  195. //}
  196. //void SetMotor_back(u16 steps,u16 speed)//反轉(zhuǎn)
  197. //{
  198. //        u8 inch;
  199. //        u16 add;
  200. //        for(add=0;add<steps;add++)//轉(zhuǎn)半圈
  201. //        for(inch=0;inch<4;inch++)//完成一個拍數(shù)4*0.36°
  202. //                switch(inch)
  203. //                {
  204. //                        case 0:          STEP_8(speed);  break;
  205. //                  case 1:          STEP_4(speed);  break;
  206. //                        case 2:          STEP_2(speed);  break;
  207. //                        case 3:          STEP_1(speed);  break;
  208. //                }               
  209. //}
復(fù)制代碼

//已使用過,沒有任何問題。(使用的是4線二相的步進電機,末端注釋掉的是五線的,可用)

頭文件下載:
DIVER.zip (1.96 KB, 下載次數(shù): 116)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1062681 發(fā)表于 2024-3-19 10:31 | 只看該作者
USART1_RX_BUF[endB]=0;//清零準(zhǔn)備下一次接收
請問這個串口這個去掉,會有問題嘛,這句話是用來提示當(dāng)前狀態(tài)的嘛
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表