半开源一个步进电机的核心代码,很方便移植到其他cpu,当然只能是8051,其他类型的51(非STC)应该也可以,我是STC粉,手里只有STC,没办法测试.
我觉得其他可行的原因是代码是平台无关的,无任何寄存器操作.唯一的接口就是定时值,你只要把motorGetTimerCTC()获取的u16的值喂给定时器就好了.
选择半开源的原因是这个东西是从我产品里面移植出来的.吃饭的家伙嘛,总得有点小心思,虽然网上各种代码也有,甚至官方也有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还是稳稳的.
