SingleYork 发表于 2025-4-17 09:57:10

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

大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【08-步进电机启动和停止】”,

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

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

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



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

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

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

整个控制逻辑如下:

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

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

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

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

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

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

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

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

#include      "app.h"

#define M0_PUL       Y00    //定义电机0脉冲对应的GPIO
#define M2_PUL       Y01    //定义电机2脉冲对应的GPIO

#define M0_DIR       Y02    //定义电机0方向对应的GPIO
#define M2_DIR       Y03    //定义电机2方向对应的GPIO

#define M0_Start_CWX00    //定义电机0 顺时针启动 信号对应的GPIO
#define M0_Start_CCW X01    //定义电机0 逆时针启动 信号对应的GPIO
#define M0_Stop      X02    //定义电机0   停止   信号对应的GPIO

#define M2_Start_CWX03    //定义电机2 顺时针启动 信号对应的GPIO
#define M2_Start_CCW X04    //定义电机2 逆时针启动 信号对应的GPIO
#define M2_Stop      X05    //定义电机2   停止   信号对应的GPIO

#define M_Run_CW      0   //电机顺时针运行
#define M_Run_CCW   1   //电机逆时针运行

bit F_Motor2_EN= 0;         //电机2脉冲输出使能标志位

u32 Timer0_Fre = 1000UL;    //timer0频率初值
u32 Timer2_Fre = 1000UL;    //timer2频率初值

/*********************    APP初始化   ***********************/
void app_init(void)
{
      GPIO_Config();      //GPIO配置
   
    Timer0_config(Timer0_Fre);   //定时器0配置
    Timer2_config(Timer2_Fre);   //定时器2配置
   
    TR0= 0;             //定时器0停止运行
    EA = 1;                            //开启总中断
}

/*********************   APP运行    ***********************/
void app_run(void)
{
    static bit F_M0_Start_CW= 0;
    static bit F_M0_Start_CCW = 0;
    static bit F_M0_Stop      = 0;

    static bit F_M2_Start_CW= 0;
    static bit F_M2_Start_CCW = 0;
    static bit F_M2_Stop      = 0;
   
    /*****************************************
   X00由低电平变成高电平时,电机0顺时针启动   
    *****************************************/
   
    if(!F_M0_Start_CW)
    {
      if(!M0_Start_CW)          //X00低电平
      {
            delay_ms(10);         //10ms消抖
            if(!M0_Start_CW)
            {
                F_M0_Start_CW = 1;//X00低电平标志置“1”
            }
      }
    }
    else
    {
      if(M0_Start_CW)         //X00高电平
      {
            delay_ms(10);         //10ms消抖
            if(M0_Start_CW)
            {
                F_M0_Start_CW = 0;       //X00低电平标志清“0”
                TR0         = 1;       //定时器0开始运行
                M0_DIR      = M_Run_CW;//电机0运行方向:顺时针
            }
      }
    }
    /*****************************************
   X01由低电平变成高电平时,电机0逆时针启动   
    *****************************************/
   
    if(!F_M0_Start_CCW)
    {
      if(!M0_Start_CCW)          //X01低电平
      {
            delay_ms(10);          //10ms消抖
            if(!M0_Start_CCW)
            {
                F_M0_Start_CCW = 1;//X01低电平标志置“1”
            }
      }
    }
    else
    {
      if(M0_Start_CCW)         //X01高电平
      {
            delay_ms(10);          //10ms消抖
            if(M0_Start_CCW)
            {
                F_M0_Start_CCW = 0;      //X01低电平标志清“0”
                TR0            = 1;      //定时器0开始运行
                M0_DIR         = M_Run_CCW;//电机0运行方向:逆时针
            }
      }
    }
    /*****************************************
      X02由低电平变成高电平时,电机0停止
    *****************************************/
    if(!F_M0_Stop)
    {
      if(!M0_Stop)         //X02低电平
      {
            delay_ms(10);      //10ms消抖
            if(!M0_Stop)
            {
                F_M0_Stop= 1;//X02低电平标志置“1”
            }
      }
    }
    else
    {
      if(M0_Stop)            //X02高电平
      {
            delay_ms(10);      //10ms消抖
            if(M0_Stop)
            {
                F_M0_Stop= 0;             //X02低电平标志清“0”
                TR0      = 0;             //定时器0停止运行
                M0_PUL   = OutputT_OFF;   //Y00保持高电平
                M0_DIR   = OutputT_OFF;   //Y02保持高电平
            }
      }
    }
   
    /*--------------------------------------*/
   
    /*****************************************
   X03由低电平变成高电平时,电机2顺时针启动   
    *****************************************/
   
    if(!F_M2_Start_CW)
    {
      if(!M2_Start_CW)          //X03低电平
      {
            delay_ms(10);         //10ms消抖
            if(!M2_Start_CW)
            {
                F_M2_Start_CW = 1;//X03低电平标志置“1”
            }
      }
    }
    else
    {
      if(M2_Start_CW)         //X03高电平
      {
            delay_ms(10);         //10ms消抖
            if(M2_Start_CW)
            {
                F_M2_Start_CW = 0;       //X03低电平标志清“0”
                TR0         = 1;       //定时器0开始运行
                M2_DIR      = M_Run_CW;//电机0运行方向:顺时针
            }
      }
    }
    /*****************************************
   X04由低电平变成高电平时,电机2逆时针启动   
    *****************************************/
   
    if(!F_M2_Start_CCW)
    {
      if(!M2_Start_CCW)          //X04低电平
      {
            delay_ms(10);          //10ms消抖
            if(!M2_Start_CCW)
            {
                F_M2_Start_CCW = 1;//X04低电平标志置“1”
            }
      }
    }
    else
    {
      if(M2_Start_CCW)         //X04高电平
      {
            delay_ms(10);          //10ms消抖
            if(M2_Start_CCW)
            {
                F_M2_Start_CCW = 0;      //X04低电平标志清“0”
                TR0            = 1;      //定时器0开始运行
                M2_DIR         = M_Run_CCW;//电机0运行方向:逆时针
            }
      }
    }
    /*****************************************
      X05由低电平变成高电平时,电机2停止
    *****************************************/
    if(!F_M2_Stop)
    {
      if(!M2_Stop)         //X05低电平
      {
            delay_ms(10);      //10ms消抖
            if(!M2_Stop)
            {
                F_M2_Stop= 1;//X05低电平标志置“1”
            }
      }
    }
    else
    {
      if(M2_Stop)            //X05高电平
      {
            delay_ms(10);      //10ms消抖
            if(M2_Stop)
            {
                F_M2_Stop= 0;             //X05低电平标志清“0”
                TR0      = 0;             //定时器0停止运行
                M2_PUL   = OutputT_OFF;   //Y01保持高电平
                M2_DIR   = OutputT_OFF;   //Y03保持高电平
            }
      }
    }
}

/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR //频率可变
{
    M0_PUL = !M0_PUL;         //Y00状态翻转
}

/********************* Timer0中断函数************************/
void timer2_int (void) interrupt TIMER2_VECTOR //频率可变
{
    if(F_Motor2_EN)             //电机2脉冲输出使能
      M2_PUL = !M2_PUL;       //Y01状态翻转
    else
      M2_PUL = OutputT_OFF;   //Y01保持高电平
}


运行效果如下:



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

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

本章附件:






国芯人工智能 发表于 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. 代码实现

以下是实现步进电机正反转控制的代码示例:

c
include "apph"

define M0PUL       Y00    // 定义电机0脉冲对应的GPIO
define M2PUL       Y01    // 定义电机2脉冲对应的GPIO

define M0DIR       Y02    // 定义电机0方向对应的GPIO
define M2DIR       Y03    // 定义电机2方向对应的GPIO

void main() {
    // 初始化GPIO口
    GPIOInit();

    // 初始化定时器
    Timer0Init();
    Timer2Init();

    while (1) {
      // 检测X00信号
      if (X00 == HIGH) {
            M0DIR = HIGH;// 设置电机0方向为顺时针
            Timer0Start(); // 启动电机0
      }

      // 检测X01信号
      if (X01 == HIGH) {
            M0DIR = LOW;   // 设置电机0方向为逆时针
            Timer0Start(); // 启动电机0
      }

      // 检测X02信号
      if (X02 == HIGH) {
            Timer0Stop();// 停止电机0
      }

      // 检测X03信号
      if (X03 == HIGH) {
            M2DIR = HIGH;// 设置电机2方向为顺时针
            Timer2Start(); // 启动电机2
      }

      // 检测X04信号
      if (X04 == HIGH) {
            M2DIR = LOW;   // 设置电机2方向为逆时针
            Timer2Start(); // 启动电机2
      }

      // 检测X05信号
      if (X05 == HIGH) {
            Timer2Stop();// 停止电机2
      }
    }
}

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

6. 总结

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

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

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 【15系列】SYK-0806-A2S1 工业自动化控制之【09-步进电机正反转】