xiangzichen 发表于 2026-1-15 03:11:32

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

步进电机的核心代码@STC8H8K64U !
指数升降速, 速度丝滑,使用方便 到只是简单库的应用 !
我是STC粉, 可移植到本坛各系列 51, 先只测试了STC8H8K64U.
我觉得其他可行的原因是代码是平台无关的,无任何寄存器操作.
唯一的接口就是定时值,
你只要把motorGetTimerCTC()获取的值喂给定时器就好了.
选择半开源的原因是这个东西是从我产品里面移植出来的.
吃饭的家伙嘛,总得有点小心思,虽然网上各种代码也有,
甚至官方也有PWM相关控制步进电机的,
但总觉得没有这个方便.毕竟还有很多小伙伴刚刚入行,
想丝滑的控制步进电机,可能要不少时间.
所以么,半开源,方便入门的小伙伴,
至于佬们,尽量就不要喷了.

先介绍一下开放的函数接口:
/*
返回定时器计数值用于装载到当前的定时器
*/
u16motorGetTimerCTC();

/*
定时器中断回调函数
*/
void motorTimerCallBac();

/*
停止电机运动
mode: 0x01 立即停止
mode: 0x00 减速停止
*/
void motorStop(u8 mode);

/*
设置加速系数,数值越小加速越快,范围1-255
*/
void motorSetRiseTime(u8 rise_time);

/*
获取当前速度值(频率)
*/
u16motorGetSpeed();

/*
获取当前坐标值(脉冲数)
*/
s32motorGetCoord();

/*
设置当前坐标值(脉冲数)
*/
void motorSetCoord(s32 crd);

/*
获取当前状态:
高字节为运动模式MOV_XXX
低字节为运动状态STATUS_XXX
*/
u8   motorGetStatus();

/*
速度模式:
dir: 方向
speed: 速度值(频率)
*/
u8   motorSpeedMode(u8 dir, u16 speed);

/*
回零模式:
dir: 方向
speed: 接近零点速度
speed_back: 退回速度
*/
u8   motorZero(u8 dir, u16 speed, u16 speed_back);

/*
距离模式:
v: 移动距离(增量,如果需要绝对位置可使用motorGetCoord()获取当前位置,然后相减得到增量)
speed: 移动速度(频率)
*/
u8   motorDistanceMode(s32 v, u16 speed);

/*
初始化步进电机模块
set_cp: 脉冲输出函数指针
set_dir: 方向输出函数指针
is_zero: 检测零点函数指针
*/
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还是稳稳的.







East Wind 41 发表于 2026-1-15 03:54:23

下载学习,谢谢楼主的开源

万事胜意 发表于 2026-1-15 09:19:53

感谢楼主分享

jwd 发表于 2026-1-15 13:02:28

谢谢分享

llyymm 发表于 2026-1-15 14:01:06

下载试试,感谢分享

houzi8 发表于 2026-1-19 12:52:12

感谢楼主

草木灰06 发表于 2026-1-31 10:55:51

学习了,谢谢

AHBbGao 发表于 2026-2-14 21:10:04

下载了,烧到STC8H4K64TL里,看不到运行效果呢,是将P1.4,P1.5,P1.6短接到地,就会有指定脉冲输出吗。我用示波器看P32,看不到脉冲,可以再说细些,具体是怎么用吗?

xiangzichen 发表于 2026-2-15 00:56:59

AHBbGao 发表于 2026-2-14 21:10
下载了,烧到STC8H4K64TL里,看不到运行效果呢,是将P1.4,P1.5,P1.6短接到地,就会有指定脉冲输出吗。我用 ...

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

ZIJIN_CHJ 发表于 2026-2-16 08:50:20

谢谢楼主分享,虽然我现在还没有能力玩步进电机.
页: [1]
查看完整版本: 步进电机 控制核心, 指数升降速, 速度丝滑, 使用方便,半开源(提供了可随意移植的库)