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

【15系列】SYK-0806-A2S1 工业自动化控制之【12-步进电机精确定位】

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

19

主题

9

回帖

215

积分

中级会员

积分
215
发表于 2025-4-17 14:57:20 | 显示全部楼层 |阅读模式
大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【11-步进电机转动指定圈数】”,这一篇中,笔者要给大家介绍如何让步进电机实现精确定位。

其实,这一讲内容跟上一讲比较类似,最大的区别就是电机带负载时的位移跟传动机构有关,所以大家要学会不同的传动机构如何计算距离。笔者以下图所示最常见的同步带传动结构来进行讲解:

01.png

假设,如上图所示,电机细分为800,同步带轮的直径为30mm,想要让工件M在同步带上移动1000mm,那么需要给电机发送多少个脉冲?

刚接触这块的小伙伴们乍一看是不是感觉有点懵?别慌,我们来一步一步分析。

首先,同步带是跟同步带轮连在一起的,工件是在同步带上,那么工件所移动的距离即是同步轮在同步带上转动的距离。我们现在知道了同步带轮的直径为30mm,那么,同步带轮转一圈距离就是同步带轮的周长,根据圆的周长计算公式:c=πd,这里的d即使30mm,π取3.14,那么周长c=3.14*30mm。

接下来分析电机,已知电机细分为800,即电机转一圈需要800个脉冲,那么,一个脉冲同步带轮转动的距离为:L=3.14*30/800mm。

那么,要让同步带轮移动1000mm的距离,所需要的脉冲数就是:M0_Max_PUL = 1000/(3.14*30/800mm)个,这里我们不用直接计算出来,可以直接将算是写到程序中即可:

  1. #define M0_Max_PUL    1000/(3.14*30/800)  //电机运行1000mm所需要的脉冲数
复制代码

弄清楚了这个计算的方法,代码就简单了,跟上一讲代码一样,笔者就不逐一分析了,直接将app.c文件中的完整代码贴出来了,相信大家一看就明白了:

  1. #include        "app.h"
  2. #define M0_PUL       P30      //定义电机0脉冲对应的GPIO
  3. #define M0_DIR       P31      //定义电机0方向对应的GPIO
  4. #define M0_Start     X00      //定义电机0 启动 信号对应的GPIO
  5. #define M_Run_CW      0       //电机顺时针运行
  6. #define M_Run_CCW     1       //电机逆时针运行
  7. #define M0_Level_Low  0       //低电平
  8. #define M0_Level_High 1       //高电平
  9. //假设电机需要运行最大距离为1000mm
  10. //同步轮直径为30mm,同步轮周长即为:3.14*30mm
  11. //电机细分为800,那么一个脉冲所走过的距离为:3.14*30/800mm
  12. //那么,同步轮要运行1000mm,需要的脉冲数为:1000/(3.14*30/800)mm
  13. //即:M0_Max_PUL = 1000(3.14*30/800)mm,约等于8492个脉冲,差不多10圈半
  14. #define M0_Max_PUL    1000/(3.14*30/800)  //电机运行1000mm所需要的脉冲数
  15. bit F_M0_Run   = 0;           //电机运行标志
  16. u32 M_PUL_Cnt  = 0;           //电机脉冲计数
  17. u32 Timer0_Fre = 2000UL;      //timer0频率初值
  18. u32 Timer2_Fre = 500UL;       //timer2频率初值
  19. /*********************    APP初始化   ***********************/
  20. void app_init(void)
  21. {
  22.         GPIO_Config();      //GPIO配置
  23.    
  24.     Timer0_config(Timer0_Fre);     //定时器0配置
  25.     Timer2_config(Timer2_Fre);     //定时器2配置
  26.    
  27.     TR0= 0;             //定时器0停止运行
  28.     EA = 1;                            //开启总中断
  29. }
  30. /*********************     APP运行    ***********************/
  31. void app_run(void)
  32. {
  33.     static bit F_M0_Start  = 0;
  34.    
  35.     /**************************************************
  36.    
  37.    X00由低电平变成高电平时,电机0以初始2kHz频率顺时针启动
  38.                 电机0转2圈后,停止运行
  39.    
  40.     **************************************************/
  41.    
  42.     if(!F_M0_Run)//电机未运行
  43.     {
  44.         if(!F_M0_Start)
  45.         {
  46.             if(!M0_Start)          //X00低电平
  47.             {
  48.                 delay_ms(10);      //10ms消抖
  49.                 if(!M0_Start)
  50.                 {
  51.                     F_M0_Start = 1;//X00低电平标志置“1”
  52.                 }
  53.             }
  54.         }
  55.         else
  56.         {
  57.             if(M0_Start)               //X00高电平
  58.             {
  59.                 delay_ms(10);          //10ms消抖
  60.                 if(M0_Start)
  61.                 {
  62.                     F_M0_Start = 0;            //X00低电平标志清“0”
  63.                     TR0        = 1;            //定时器0开始运行
  64.                     M0_DIR     = M_Run_CW;     //电机0运行方向:顺时针
  65.                     M0_PUL     = M0_Level_High;//将电机脉冲电平保持为高电平
  66.                     M0_DIR     = M0_Level_High;//将电机方向电平保持为高电平
  67.                     M_PUL_Cnt  = 0;            //电机脉冲计数清零
  68.                     F_M0_Run   = 1;            //电机运行标志置“1”
  69.                 }
  70.             }
  71.         }   
  72.     }   
  73. }
  74. /********************* Timer0中断函数************************/
  75. void timer0_int (void) interrupt TIMER0_VECTOR //频率可变
  76. {
  77.     M0_PUL = !M0_PUL;           //电机脉冲信号P30状态翻转
  78.    
  79.     if(M0_PUL == M0_Level_Low)  //脉冲有效电平为低电平
  80.     {
  81.         M_PUL_Cnt ++;//脉冲计数加“1”
  82.         
  83.         if(M_PUL_Cnt>=M0_Max_PUL)//当前脉冲数达到设定值,电机停止运行
  84.         {
  85.             M_PUL_Cnt = 0;
  86.             F_M0_Run  = 0;              //电机运行标志清“0”
  87.             TR0       = 0;              //定时器0停止运行,电机停止
  88.             M0_PUL    = M0_Level_High;  //将电机脉冲电平保持为高电平
  89.             M0_DIR    = M0_Level_High;  //将电机方向电平保持为高电平
  90.         }
  91.     }
  92. }
复制代码

好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,下一节笔者将给大家介绍“串口的基本使用”,详见“SYK-0806-A2S1 工业自动化控制之【13-串口收发单个字符】”,感谢大家的支持!

本章附件:

【STC15系列】SYK-0806-A2S1- 12-步进电机精确定位.rar (68.11 KB, 下载次数: 2)




本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-17 14:58:00 | 显示全部楼层
大家好,我是『芯知识学堂』的SingleYork。在上一篇文章中,我们探讨了如何通过SYK-0806-A2S1控制器实现步进电机的指定圈数转动。今天,我们将进一步深入,讨论如何实现步进电机的精确定位,特别是在工业自动化控制中的应用。

1. 步进电机精确定位的基本原理

步进电机的精确定位依赖于对电机转角的精确控制。通过发送特定数量的脉冲信号,我们可以控制电机转动到指定的位置。每个脉冲对应电机的一个微小步进,因此,通过计算所需的脉冲数,我们可以实现精确的位置控制。

2. 同步带传动机构的计算

在工业自动化中,步进电机通常与同步带传动机构配合使用,以实现工件的精确定位。同步带传动机构的关键参数包括同步带轮的直径和电机的细分步数。

假设我们有一个同步带轮,其直径为30mm,电机细分为800步。我们需要计算工件在同步带上移动1000mm所需的脉冲数。

2.1 计算同步带轮的周长

同步带轮的周长(C)可以通过公式计算:
\[ C = \pi \times d \]
其中,\( d \) 是同步带轮的直径,\( \pi \) 取3.14。

代入数值:
\[ C = 3.14 \times 30mm = 94.2mm \]

2.2 计算每个脉冲对应的移动距离

电机细分为800步,即电机每转一圈需要800个脉冲。因此,每个脉冲对应的同步带轮转动的距离(L)为:
\[ L = \frac{C}{800} = \frac{94.2mm}{800} = 0.11775mm \]

2.3 计算移动1000mm所需的脉冲数

要移动1000mm,所需的脉冲数(M0MaxPUL)为:
\[ M0\Max\PUL = \frac{1000mm}{L} = \frac{1000mm}{0.11775mm} \approx 8490 \]

3. 代码实现

在程序中,我们可以直接使用上述计算公式来定义所需的脉冲数。以下是一个示例代码片段:
  1. c
  2. define M0MaxPUL    1000/(3.1430/800)  // 电机运行1000mm所需要的脉冲数
复制代码

通过这种方式,我们可以确保电机在接收到指定数量的脉冲后,能够精确地将工件移动到目标位置。

4. 总结

步进电机的精确定位在工业自动化控制中具有广泛的应用。通过理解同步带传动机构的计算方法和电机的细分步数,我们可以实现高精度的位置控制。在实际应用中,合理选择传动机构参数和电机细分步数,是确保系统性能的关键。

希望本文能够帮助大家更好地理解步进电机精确定位的原理和实现方法。如果有任何问题或需要进一步的讨论,欢迎在评论区留言。感谢大家的阅读!

——SingleYork,『芯知识学堂』

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 21:58 , Processed in 0.157538 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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