步进电机的核心代码@STC8H8K64U !
指数升降速, 速度丝滑, 使用方便 到只是简单库的应用 !
我是STC粉, 可移植到本坛各系列 51, 先只测试了STC8H8K64U.
我觉得其他可行的原因是代码是平台无关的,无任何寄存器操作.
唯一的接口就是定时值,
你只要把motorGetTimerCTC()获取的值喂给定时器就好了.
选择半开源的原因是这个东西是从我产品里面移植出来的.
吃饭的家伙嘛,总得有点小心思,虽然网上各种代码也有,
甚至官方也有PWM相关控制步进电机的,
但总觉得没有这个方便.毕竟还有很多小伙伴刚刚入行,
想丝滑的控制步进电机,可能要不少时间.
所以么,半开源,方便入门的小伙伴,
至于佬们,尽量就不要喷了.
先介绍一下开放的函数接口:
- /*
- 返回定时器计数值用于装载到当前的定时器
- */
- u16 motorGetTimerCTC();
-
- /*
- 定时器中断回调函数
- */
- void motorTimerCallBac();
-
- /*
- 停止电机运动
- mode: 0x01 立即停止
- mode: 0x00 减速停止
- */
- void motorStop(u8 mode);
-
- /*
- 设置加速系数,数值越小加速越快,范围1-255
- */
- void motorSetRiseTime(u8 rise_time);
-
- /*
- 获取当前速度值(频率)
- */
- u16 motorGetSpeed();
-
- /*
- 获取当前坐标值(脉冲数)
- */
- s32 motorGetCoord();
-
- /*
- 设置当前坐标值(脉冲数)
- */
- 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还是稳稳的.
!STC8HxxxxxU.rar
(410.2 KB, 下载次数: 88)
|