找回密码
 立即注册
查看: 58|回复: 1

【15系列】SYK-0806-A2S1 工业自动化控制之【09-步进电机正反转】

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-04-21 13:00:02

19

主题

9

回帖

217

积分

中级会员

积分
217
发表于 2025-4-17 09:57:10 | 显示全部楼层 |阅读模式
大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【08-步进电机启动和停止】”,

这一篇中,笔者要给大家介绍如何实现步进电机的正反转控制。

在前面介绍步进电机接线方法的时候,我们可以看到,单片机跟步进电机是有三根信号线相连的,

其中有一根就是方向信号线。那么就很简单了,我们要控制步进电机的正反转,就只需要控制步进电机的方向信号就可以了。

01.png

本例中笔者是还是跟上一讲一样,分两种方式来实现步进电机的启动与停止:

通过控制定时器0的启动与停止来实现电机0脉冲的输出与关闭

定时器2一直开启,通过一个变量来控制电机2的脉冲输出与关闭

整个控制逻辑如下:

X00由低电平变成高电平时,电机0顺时针启动

X01由低电平变成高电平时,电机0逆时针启动

X02由低电平变成高电平时,电机0停止

X03由低电平变成高电平时,电机2顺时针启动

X04由低电平变成高电平时,电机2逆时针启动

X05由低电平变成高电平时,电机2停止

代码上跟上一讲也没有太大的变化,除了GPIO口稍有改动之外,就是增加了两个电机的方向控制引脚,

因此关于代码部分笔者也就不再做过多解释,代码注释的也很清晰,相信大家都能看懂:

  1. #include        "app.h"
  2. #define M0_PUL       Y00    //定义电机0脉冲对应的GPIO
  3. #define M2_PUL       Y01    //定义电机2脉冲对应的GPIO
  4. #define M0_DIR       Y02    //定义电机0方向对应的GPIO
  5. #define M2_DIR       Y03    //定义电机2方向对应的GPIO
  6. #define M0_Start_CW  X00    //定义电机0 顺时针启动 信号对应的GPIO
  7. #define M0_Start_CCW X01    //定义电机0 逆时针启动 信号对应的GPIO
  8. #define M0_Stop      X02    //定义电机0   停止     信号对应的GPIO
  9. #define M2_Start_CW  X03    //定义电机2 顺时针启动 信号对应的GPIO
  10. #define M2_Start_CCW X04    //定义电机2 逆时针启动 信号对应的GPIO
  11. #define M2_Stop      X05    //定义电机2   停止     信号对应的GPIO
  12. #define M_Run_CW      0     //电机顺时针运行
  13. #define M_Run_CCW     1     //电机逆时针运行
  14. bit F_Motor2_EN= 0;         //电机2脉冲输出使能标志位
  15. u32 Timer0_Fre = 1000UL;    //timer0频率初值
  16. u32 Timer2_Fre = 1000UL;    //timer2频率初值
  17. /*********************    APP初始化   ***********************/
  18. void app_init(void)
  19. {
  20.         GPIO_Config();      //GPIO配置
  21.    
  22.     Timer0_config(Timer0_Fre);     //定时器0配置
  23.     Timer2_config(Timer2_Fre);     //定时器2配置
  24.    
  25.     TR0= 0;             //定时器0停止运行
  26.     EA = 1;                            //开启总中断
  27. }
  28. /*********************     APP运行    ***********************/
  29. void app_run(void)
  30. {
  31.     static bit F_M0_Start_CW  = 0;
  32.     static bit F_M0_Start_CCW = 0;
  33.     static bit F_M0_Stop      = 0;
  34.     static bit F_M2_Start_CW  = 0;
  35.     static bit F_M2_Start_CCW = 0;
  36.     static bit F_M2_Stop      = 0;
  37.    
  38.     /*****************************************
  39.      X00由低电平变成高电平时,电机0顺时针启动     
  40.     *****************************************/
  41.    
  42.     if(!F_M0_Start_CW)
  43.     {
  44.         if(!M0_Start_CW)          //X00低电平
  45.         {
  46.             delay_ms(10);         //10ms消抖
  47.             if(!M0_Start_CW)
  48.             {
  49.                 F_M0_Start_CW = 1;//X00低电平标志置“1”
  50.             }
  51.         }
  52.     }
  53.     else
  54.     {
  55.         if(M0_Start_CW)           //X00高电平
  56.         {
  57.             delay_ms(10);         //10ms消抖
  58.             if(M0_Start_CW)
  59.             {
  60.                 F_M0_Start_CW = 0;       //X00低电平标志清“0”
  61.                 TR0           = 1;       //定时器0开始运行
  62.                 M0_DIR        = M_Run_CW;//电机0运行方向:顺时针
  63.             }
  64.         }
  65.     }
  66.     /*****************************************
  67.      X01由低电平变成高电平时,电机0逆时针启动     
  68.     *****************************************/
  69.    
  70.     if(!F_M0_Start_CCW)
  71.     {
  72.         if(!M0_Start_CCW)          //X01低电平
  73.         {
  74.             delay_ms(10);          //10ms消抖
  75.             if(!M0_Start_CCW)
  76.             {
  77.                 F_M0_Start_CCW = 1;//X01低电平标志置“1”
  78.             }
  79.         }
  80.     }
  81.     else
  82.     {
  83.         if(M0_Start_CCW)           //X01高电平
  84.         {
  85.             delay_ms(10);          //10ms消抖
  86.             if(M0_Start_CCW)
  87.             {
  88.                 F_M0_Start_CCW = 0;        //X01低电平标志清“0”
  89.                 TR0            = 1;        //定时器0开始运行
  90.                 M0_DIR         = M_Run_CCW;//电机0运行方向:逆时针
  91.             }
  92.         }
  93.     }
  94.     /*****************************************
  95.         X02由低电平变成高电平时,电机0停止
  96.     *****************************************/
  97.     if(!F_M0_Stop)
  98.     {
  99.         if(!M0_Stop)           //X02低电平
  100.         {
  101.             delay_ms(10);      //10ms消抖
  102.             if(!M0_Stop)
  103.             {
  104.                 F_M0_Stop  = 1;//X02低电平标志置“1”
  105.             }
  106.         }
  107.     }
  108.     else
  109.     {
  110.         if(M0_Stop)            //X02高电平
  111.         {
  112.             delay_ms(10);      //10ms消抖
  113.             if(M0_Stop)
  114.             {
  115.                 F_M0_Stop  = 0;             //X02低电平标志清“0”
  116.                 TR0        = 0;             //定时器0停止运行
  117.                 M0_PUL     = OutputT_OFF;   //Y00保持高电平
  118.                 M0_DIR     = OutputT_OFF;   //Y02保持高电平
  119.             }
  120.         }
  121.     }
  122.    
  123.     /*--------------------------------------*/
  124.    
  125.     /*****************************************
  126.      X03由低电平变成高电平时,电机2顺时针启动     
  127.     *****************************************/
  128.    
  129.     if(!F_M2_Start_CW)
  130.     {
  131.         if(!M2_Start_CW)          //X03低电平
  132.         {
  133.             delay_ms(10);         //10ms消抖
  134.             if(!M2_Start_CW)
  135.             {
  136.                 F_M2_Start_CW = 1;//X03低电平标志置“1”
  137.             }
  138.         }
  139.     }
  140.     else
  141.     {
  142.         if(M2_Start_CW)           //X03高电平
  143.         {
  144.             delay_ms(10);         //10ms消抖
  145.             if(M2_Start_CW)
  146.             {
  147.                 F_M2_Start_CW = 0;       //X03低电平标志清“0”
  148.                 TR0           = 1;       //定时器0开始运行
  149.                 M2_DIR        = M_Run_CW;//电机0运行方向:顺时针
  150.             }
  151.         }
  152.     }
  153.     /*****************************************
  154.      X04由低电平变成高电平时,电机2逆时针启动     
  155.     *****************************************/
  156.    
  157.     if(!F_M2_Start_CCW)
  158.     {
  159.         if(!M2_Start_CCW)          //X04低电平
  160.         {
  161.             delay_ms(10);          //10ms消抖
  162.             if(!M2_Start_CCW)
  163.             {
  164.                 F_M2_Start_CCW = 1;//X04低电平标志置“1”
  165.             }
  166.         }
  167.     }
  168.     else
  169.     {
  170.         if(M2_Start_CCW)           //X04高电平
  171.         {
  172.             delay_ms(10);          //10ms消抖
  173.             if(M2_Start_CCW)
  174.             {
  175.                 F_M2_Start_CCW = 0;        //X04低电平标志清“0”
  176.                 TR0            = 1;        //定时器0开始运行
  177.                 M2_DIR         = M_Run_CCW;//电机0运行方向:逆时针
  178.             }
  179.         }
  180.     }
  181.     /*****************************************
  182.         X05由低电平变成高电平时,电机2停止
  183.     *****************************************/
  184.     if(!F_M2_Stop)
  185.     {
  186.         if(!M2_Stop)           //X05低电平
  187.         {
  188.             delay_ms(10);      //10ms消抖
  189.             if(!M2_Stop)
  190.             {
  191.                 F_M2_Stop  = 1;//X05低电平标志置“1”
  192.             }
  193.         }
  194.     }
  195.     else
  196.     {
  197.         if(M2_Stop)            //X05高电平
  198.         {
  199.             delay_ms(10);      //10ms消抖
  200.             if(M2_Stop)
  201.             {
  202.                 F_M2_Stop  = 0;             //X05低电平标志清“0”
  203.                 TR0        = 0;             //定时器0停止运行
  204.                 M2_PUL     = OutputT_OFF;   //Y01保持高电平
  205.                 M2_DIR     = OutputT_OFF;   //Y03保持高电平
  206.             }
  207.         }
  208.     }
  209. }
  210. /********************* Timer0中断函数************************/
  211. void timer0_int (void) interrupt TIMER0_VECTOR //频率可变
  212. {
  213.     M0_PUL = !M0_PUL;           //Y00状态翻转
  214. }
  215. /********************* Timer0中断函数************************/
  216. void timer2_int (void) interrupt TIMER2_VECTOR //频率可变
  217. {
  218.     if(F_Motor2_EN)             //电机2脉冲输出使能
  219.         M2_PUL = !M2_PUL;       //Y01状态翻转
  220.     else
  221.         M2_PUL = OutputT_OFF;   //Y01保持高电平
  222. }
复制代码

运行效果如下:

08.gif

好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,

下一节笔者将给大家介绍“如何实现步进电机加减速”,详见“SYK-0806-A2S1 工业自动化控制之【10-步进电机加减速】”感谢大家的支持!

本章附件:

【STC15系列】SYK-0806-A2S1- 09-步进电机正反转.rar (68.25 KB, 下载次数: 3)




本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-17 09:58:00 | 显示全部楼层
步进电机的正反转控制在工业自动化中是一个常见且重要的应用场景。通过控制步进电机的方向信号线,可以轻松实现电机的正转和反转。本文将基于SYK-0806-A2S1工业自动化控制模块,详细讲解如何通过单片机实现步进电机的正反转控制。

1. 步进电机控制原理

步进电机的控制主要依赖于脉冲信号和方向信号。脉冲信号用于控制电机的步进角度,而方向信号则用于控制电机的旋转方向。在本文中,我们通过单片机的GPIO口来控制步进电机的脉冲和方向信号。

2. 硬件连接

在硬件连接方面,单片机与步进电机之间有三根信号线相连,分别是脉冲信号线、方向信号线和使能信号线。其中,方向信号线用于控制电机的旋转方向。通过改变方向信号的电平状态,可以实现电机的正转和反转。

3. 控制逻辑

本文中,我们通过定时器来控制步进电机的脉冲输出,并通过GPIO口来控制电机的方向信号。具体控制逻辑如下:
X00由低电平变成高电平时,电机0顺时针启动
X01由低电平变成高电平时,电机0逆时针启动
X02由低电平变成高电平时,电机0停止
X03由低电平变成高电平时,电机2顺时针启动
X04由低电平变成高电平时,电机2逆时针启动
X05由低电平变成高电平时,电机2停止

4. 代码实现

以下是实现步进电机正反转控制的代码示例:
  1. c
  2. include "apph"
  3. define M0PUL       Y00    // 定义电机0脉冲对应的GPIO
  4. define M2PUL       Y01    // 定义电机2脉冲对应的GPIO
  5. define M0DIR       Y02    // 定义电机0方向对应的GPIO
  6. define M2DIR       Y03    // 定义电机2方向对应的GPIO
  7. void main() {
  8.     // 初始化GPIO口
  9.     GPIOInit();
  10.     // 初始化定时器
  11.     Timer0Init();
  12.     Timer2Init();
  13.     while (1) {
  14.         // 检测X00信号
  15.         if (X00 == HIGH) {
  16.             M0DIR = HIGH;  // 设置电机0方向为顺时针
  17.             Timer0Start(); // 启动电机0
  18.         }
  19.         // 检测X01信号
  20.         if (X01 == HIGH) {
  21.             M0DIR = LOW;   // 设置电机0方向为逆时针
  22.             Timer0Start(); // 启动电机0
  23.         }
  24.         // 检测X02信号
  25.         if (X02 == HIGH) {
  26.             Timer0Stop();  // 停止电机0
  27.         }
  28.         // 检测X03信号
  29.         if (X03 == HIGH) {
  30.             M2DIR = HIGH;  // 设置电机2方向为顺时针
  31.             Timer2Start(); // 启动电机2
  32.         }
  33.         // 检测X04信号
  34.         if (X04 == HIGH) {
  35.             M2DIR = LOW;   // 设置电机2方向为逆时针
  36.             Timer2Start(); // 启动电机2
  37.         }
  38.         // 检测X05信号
  39.         if (X05 == HIGH) {
  40.             Timer2Stop();  // 停止电机2
  41.         }
  42.     }
  43. }
复制代码

5. 代码解析
GPIO初始化:首先对GPIO口进行初始化,确保脉冲信号和方向信号能够正确输出。
定时器初始化:初始化定时器0和定时器2,用于控制步进电机的脉冲输出。
主循环:在主循环中,检测各个输入信号的状态,并根据信号状态控制电机的启动、停止和方向。

6. 总结

通过本文的介绍,我们了解了如何通过单片机实现步进电机的正反转控制。通过控制方向信号线的电平状态,可以轻松实现电机的正转和反转。在实际应用中,可以根据具体需求对代码进行优化和扩展,以满足不同的控制需求。

希望本文对大家有所帮助,如果有任何问题或建议,欢迎在评论区留言讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:21 , Processed in 0.152321 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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