找回密码
 立即注册
查看: 743|回复: 9

步进电机 控制核心, 指数升降速, 速度丝滑, 使用方便,半开源(提供了可随意移植的库)

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2026-03-07 00:33:11
已绑定手机

15

主题

616

回帖

1511

积分

荣誉版主

积分
1511
发表于 2026-1-15 03:11:32 | 显示全部楼层 |阅读模式
步进电机的核心代码@STC8H8K64U
指数升降速, 速度丝滑,  使用方便 到只是简单库的应用
我是STC粉, 可移植到本坛各系列 51, 先只测试了STC8H8K64U.
我觉得其他可行的原因是代码是平台无关的,无任何寄存器操作.

唯一的接口就是定时值,
你只要把motorGetTimerCTC()获取的值喂给定时器就好了.
选择半开源的原因是这个东西是从我产品里面移植出来的.

吃饭的家伙嘛,总得有点小心思,虽然网上各种代码也有,
甚至官方也有PWM相关控制步进电机的,
但总觉得没有这个方便.毕竟还有很多小伙伴刚刚入行,

想丝滑的控制步进电机,可能要不少时间.
所以么,半开源,方便入门的小伙伴,
至于佬们,尽量就不要喷了.

先介绍一下开放的函数接口:
  1. /*
  2.   返回定时器计数值用于装载到当前的定时器
  3. */
  4. u16  motorGetTimerCTC();
  5. /*
  6.   定时器中断回调函数
  7. */
  8. void motorTimerCallBac();
  9. /*
  10.   停止电机运动
  11.   mode: 0x01 立即停止
  12.   mode: 0x00 减速停止
  13. */
  14. void motorStop(u8 mode);
  15. /*
  16.   设置加速系数,数值越小加速越快,范围1-255
  17. */
  18. void motorSetRiseTime(u8 rise_time);
  19. /*
  20.   获取当前速度值(频率)
  21. */
  22. u16  motorGetSpeed();
  23. /*
  24.   获取当前坐标值(脉冲数)
  25. */
  26. s32  motorGetCoord();
  27. /*
  28.   设置当前坐标值(脉冲数)
  29. */
  30. void motorSetCoord(s32 crd);
  31. /*
  32.   获取当前状态:
  33.   高字节为运动模式  MOV_XXX
  34.   低字节为运动状态  STATUS_XXX
  35. */
  36. u8   motorGetStatus();
  37. /*
  38.   速度模式:
  39.   dir: 方向
  40.   speed: 速度值(频率)
  41. */
  42. u8   motorSpeedMode(u8 dir, u16 speed);
  43. /*
  44.   回零模式:
  45.   dir: 方向
  46.   speed: 接近零点速度
  47.   speed_back: 退回速度
  48. */
  49. u8   motorZero(u8 dir, u16 speed, u16 speed_back);
  50. /*
  51.   距离模式:
  52.   v: 移动距离(增量,如果需要绝对位置可使用motorGetCoord()获取当前位置,然后相减得到增量)
  53.   speed: 移动速度(频率)
  54. */
  55. u8   motorDistanceMode(s32 v, u16 speed);
  56. /*
  57.   初始化步进电机模块
  58.   set_cp: 脉冲输出函数指针
  59.   set_dir: 方向输出函数指针
  60.   is_zero: 检测零点函数指针
  61. */
  62. void StepMotorInit(F_CP_DIR set_cp, F_CP_DIR set_dir, F_CHECK_ZERO is_zero);
复制代码


以上函数本例程基本有使用,无使用的可自行测试.

0x01. 指数升降速,电机动作丝滑无比
0x02. 可设定升降速的快慢,针对不同场合都能适用
0x03. 频率750-32000(33M系统时钟,如果选用其他时钟频率,那脉冲的频率返回值就不准确了)
0x04. 随意制定定时器,本例用T0,其他定时器一样,只需要 motorGetTimerCTC() 和 motorTimerCallBac() 配合即可.
0x05. 随意制定脉冲口,方向口,以及零点,这里也是用了回调,虽然有性能损失,但重在移植方便
0x06. 本例程脉冲口P32,方向口P33,零点P17.
0x07. 芯片我用的STC8H8K64U,用了官方的USB-CDC库,中间一些数据,我打印到CDC串口了,方便查看.
0x08. 带返回值的函数如果返回1,表示成功执行,返回0,表示当前的状态不允许执行新的指令.
0x09. motorStatus() 返回的是组合的状态 ,高四位是运动类型,低四位是状态,具体看StepMotor.h里面的宏定义.
0x0A. 关于频率上限,我做了32K的限制, STC芯片极限远不止这个频率.毕竟靠这个吃饭的.没办法.如果有高频率的需求,
         可以联系我.因为频率默认用了u16,65K的话轻轻松松,高了我没有测试,但以前好像测试过,100K还是稳稳的.

!STC8HxxxxxU.rar (410.2 KB, 下载次数: 88)





4 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:334
  • 最近打卡:2026-03-06 15:37:09
已绑定手机

47

主题

259

回帖

2119

积分

金牌会员

积分
2119
发表于 2026-1-15 03:54:23 | 显示全部楼层
下载学习,谢谢楼主的开源
8位程序---换个STC32G.h头文件,换个C251编译器就直接到STC32的高度了;
          想回到8位机,则换个STC8H.h头文件,换个C51编译器就回到8位机了.
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2026-01-28 10:59:26

0

主题

22

回帖

116

积分

注册会员

积分
116
发表于 2026-1-15 09:19:53 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:825
  • 最近打卡:2026-03-07 07:52:42
已绑定手机

58

主题

2008

回帖

3580

积分

论坛元老

积分
3580
发表于 2026-1-15 13:02:28 | 显示全部楼层
谢谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:568
  • 最近打卡:2026-03-05 20:14:34
已绑定手机

24

主题

522

回帖

1195

积分

金牌会员

积分
1195
发表于 2026-1-15 14:01:06 | 显示全部楼层
下载试试,感谢分享
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:184
  • 最近打卡:2026-02-06 08:16:07

8

主题

52

回帖

916

积分

高级会员

积分
916
发表于 2026-1-19 12:52:12 | 显示全部楼层
感谢楼主
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:373
  • 最近打卡:2026-03-07 08:39:52
已绑定手机

2

主题

105

回帖

1478

积分

金牌会员

积分
1478
发表于 2026-1-31 10:55:51 | 显示全部楼层
学习了,谢谢
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:17
  • 最近打卡:2026-03-03 21:17:07

10

主题

28

回帖

240

积分

中级会员

积分
240
发表于 2026-2-14 21:10:04 | 显示全部楼层
下载了,烧到STC8H4K64TL里,看不到运行效果呢,是将P1.4,P1.5,P1.6短接到地,就会有指定脉冲输出吗。我用示波器看P32,看不到脉冲,可以再说细些,具体是怎么用吗?

点评

是的,P14,P15,P16分别对地短接,对应不同的运动.  详情 回复 发表于 2026-2-15 00:56
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2026-03-07 00:33:11
已绑定手机

15

主题

616

回帖

1511

积分

荣誉版主

积分
1511
发表于 2026-2-15 00:56:59 | 显示全部楼层
AHBb*** 发表于 2026-2-14 21:10
下载了,烧到STC8H4K64TL里,看不到运行效果呢,是将P1.4,P1.5,P1.6短接到地,就会有指定脉冲输出吗。我用 ...

是的,P14,P15,P16分别对地短接,对应不同的运动.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:262
  • 最近打卡:2026-03-07 08:19:43
已绑定手机

6

主题

144

回帖

1094

积分

金牌会员

积分
1094
发表于 2026-2-16 08:50:20 | 显示全部楼层
谢谢楼主分享,虽然我现在还没有能力玩步进电机.
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 15:31 , Processed in 0.118361 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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