找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5548|回复: 1
收起左侧

步进电机STM32程序(用A4988控制)与限位开关配合使用

[复制链接]
ID:480013 发表于 2020-7-25 09:42 | 显示全部楼层 |阅读模式
单片机是STM32的,有需要的可以参考一下,提供了.c和.h文件,只需添加在工程中就好,这里使用了3个步进电机和三个限位开关,添加的话可以对照着修改。
部分代码显示如下。
  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);                                         //根据设定参数初始化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);                                         //根据设定参数初始化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)//判断限位开关是否被按下,没有则执行下去
  83.                                         SetMotor1_forward(speed);
  84.                                         else        break;//否则就跳出循环
  85.                                 }
  86.                                 USART1_RX_BUF[endB]=0;//清零准备下一次接收

  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;//清零准备下一次接收

  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;//清零准备下一次接收

  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)//正转
  183. //{
  184. //        u8 inch;
  185. //        u16 add;
  186. //        for(add=0;add<steps;add++)//转半圈
  187. //        for(inch=0;inch<4;inch++)//完成一个拍数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)//反转
  197. //{
  198. //        u8 inch;
  199. //        u16 add;
  200. //        for(add=0;add<steps;add++)//转半圈
  201. //        for(inch=0;inch<4;inch++)//完成一个拍数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. //}
复制代码

//已使用过,没有任何问题。(使用的是4线二相的步进电机,末端注释掉的是五线的,可用)
51hei.png
头文件下载:
DIVER.zip (1.96 KB, 下载次数: 116)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1062681 发表于 2024-3-19 10:31 | 显示全部楼层
USART1_RX_BUF[endB]=0;//清零准备下一次接收
请问这个串口这个去掉,会有问题嘛,这句话是用来提示当前状态的嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表