找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3222|回复: 9
收起左侧

STM32步进、伺服电机驱动 不开源 只提供.LIB和.H文件

  [复制链接]
ID:487396 发表于 2021-8-23 15:53 | 显示全部楼层 |阅读模式
此电机驱动函数,只需开一个定时器,即可控制最大9路电机,已在项目中多次验证OK。只需在自己工程中添加点LIB和点H文件,按下面功能描述驱动即可。

一、电机驱动函数定义
1. 电机相关参数初始化
函数名:void MotorInit(u8 motorNum,u8dirReset,u8 stepReset)
参数:motorNum:控制板需控制电机总个数最大为10轴;dirReset:电机方向信号复位电平,即电机停止运行时方向脚电平,可设置NPNSensor或PNPSensor;stepReset:电机脉冲信号复位电平,即电机停止运行时脉冲脚电平,可设置NPNSensor或PNPSensor;
返回:无

2. 电机相关参数加载
函数名    :void AxisParaLoad(u8 index,MotorParaStruct mStruct)
参数:index:轴号 0至9;mStruct:电机参数结构体,包含驱动器拨码、丝杠导程、原点及极限极性、原点与极性引脚、最大软限位
返回:无

3. 电机运动到指定点位
函数名:u8 MotorMoveToPosi(u8 index,MotorModelmModel,u16 accT,u16 decT,float runS,float distance)
参数:index:轴号 0至9;mModel:电机运行模式,Uniform_Model匀速运行、T_Model 梯形加减速、S_Model  S型加减速;accT:加速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;decT:减速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;runS:运行速度,加减速完成后的速度;distance:目标位置,需运动到的点位
返回:0:运动中  1:正常运动结束 2:碰到正限位运动结束  3:碰到负限位运动结束

4. 电机回原点处理
函数名    :u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,floatspeedH,float speedL,u8 homeMode,u8 homeDir)
参数:index:轴号 0至9;mModel:电机运行模式,Uniform_Model匀速运行、T_Model 梯形加减速、S_Model  S型加减速;accT:加速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;decT:减速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;speedH:回零高速速度,加减速完成后的速度;speedL:回零低速速度,加减速完成后的速度;distance:目标位置,需运动到的点位;homeMode:回零方式,0为一次回零,即电机碰到原点立即停止;1为一次回零加反找,电机向原点运动感应到原点减速停止,然后再反向找原点,直到未感应到原点停止停止;2为两次回零,在一次回零加反找未感应到原点后减速停止,然后再找原点立即停止;homeDir:回零方向,0为往负方向回零,1为往正方向回零
返回:0:运动中  1:正常运动结束 2:碰到正限位运动结束  3:碰到负限位运动结束

5. 获取电机当前位置
函数名:double MotorGetPosi(u8 index)
参数:index:轴号 0至9;
返回:该轴电机当前位置

6. 设置电机当前位置
函数名:u8 MotorSetPosi(u8 index,int posi)
参数:index:轴号 0至9;posi:待设定的位置
返回:0:设置失败  1:设置成功

7. 电机运动完成结果检测
函数名:u8 MotorCheckDone(u8 index)
参数:index:轴号 0至9
返回:0为电机还在运动中,1为运动结束

8. 电机运动停止
函数名:void MotorStop(u8 index)
参数:index:轴号 0至9
返回:无

  1. #ifndef __MOTOR_H
  2. #define __MOTOR_H
  3. #include "sys.h"

  4. #define NPNSENSOR       0          //NPN型信号
  5. #define PNPSENSOR       1                //PNP型信号

  6. typedef enum
  7. {
  8.         Uniform_Model = 0,                                //匀速模式
  9.         T_Model,                                                      //梯形加减速模式
  10.         S_Model                                                                                //S型加减速模式
  11. }MotorModel;

  12. typedef struct
  13. {
  14.         float MaxPosi;                                                //行程上限
  15.         float CycleRange;                                        //电机运转一圈的距离或者度数 丝杆导程
  16.         u32 MotorPluse;                                                //驱动器拨码
  17.         u8 OrgPolar;                                                        //电机原点信号极性
  18.         u8 ElPolar;                                                                //电机极限信号极性
  19.         u8 DirSwitch;             //电机方向切换
  20.         uint32_t *StepPin;                                //电机脉冲引脚
  21.         uint32_t *DirPin;         //电机方向引脚
  22.         uint32_t *OrgPin;         //电机原点引脚
  23.         uint32_t *ElPPin;                                        //电机正极限引脚
  24.         uint32_t *ElNPin;                                        //电机负极限引脚
  25. }MotorParaStruct;

  26. /*******************************************************************************
  27. * 函数名                :MotorGpioInit
  28. * 描述                        :电机GPIO口初始化  只需构造 驱动会自行调用
  29. * 参数                        :无
  30. * 返回                        :无
  31. *******************************************************************************/
  32. void MotorGpioInit(void);        
  33. /*******************************************************************************
  34. * 函数名                :MotorTimerPro
  35. * 描述                        :电机定时器开启/关闭 频率切换   只需构造 驱动会自行调用
  36. * 参数                        :timerEnable:定时器开启/关闭 freq:切换的频率
  37. * 返回                        :无
  38. *******************************************************************************/
  39. void MotorTimerPro(u8 timerEnable,u32 freq);

  40. /*******************************************************************************
  41. * 函数名                :MotorInit
  42. * 描述                        :电机相关参数初始化
  43. * 参数                        :motorNum:轴数  dirReset:电机方向信号复位电平
  44. * 参数                        :stepReset:电机脉冲信号复位电平
  45. * 返回                        :无
  46. *******************************************************************************/
  47. void MotorInit(u8 motorNum,u8 dirReset,u8 stepReset);        
  48. /*******************************************************************************
  49. * 函数名                :AxisParaLoad
  50. * 描述                        :电机相关参数加载
  51. * 参数                        :index:轴号  mStruct 电机参数结构体
  52. * 返回                        :无
  53. *******************************************************************************/
  54. void AxisParaLoad(u8 index,MotorParaStruct mStruct);        
  55. /*******************************************************************************
  56. * 函数名                :MotorMoveHome
  57. * 描述                        :电机回原点处理
  58. * 参数                        :index:轴号  mModel电机运行模式 0 无加减速 1 梯形加减速 2 S型加减速
  59. * 参数                        :accT:加速时间(ms) decT:减速时间(ms) speedH:高速速度  speedL:低速速度
  60. * 参数                        :homeMode: 0 一次回零 即电机反向运动,碰到原点立即停止,适合短距离回零
  61. * 参数                        :homeMode: 1 一次回零加反找 电机向原点运动感应到原点后减速停止
  62. * 参数                        :然后再正向找到未感应到原点位置结束
  63. * 参数                        :homeMode: 2 两次回零
  64. * 参数                        :homeDir: 0 负方向回零  1 正方向回零
  65. * 返回                        :0电机还在复位 1电机复位完成 2碰到正限位停止 3碰到负限位停止
  66. *******************************************************************************/
  67. u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,float speedH,float speedL,u8 homeMode,u8 homeDir);
  68. /*******************************************************************************
  69. * 函数名                :MotorMoveToPosi
  70. * 描述                        :电机运动到指定点位
  71. * 参数                        :index:轴号  mModel电机运行模式 0 无加减速 1 梯形加减速 2 S型加减速
  72. * 参数                        :accT:加速时间(ms) decT:减速时间(ms) runS:运行速度  distance:目标位置
  73. *******************************************************************************/
  74. u8 MotorMoveToPosi(u8 index,MotorModel mModel,u16 accT,u16 decT,float runS,float distance);
  75. /*******************************************************************************
  76. * 函数名                :MotorCheckDone
  77. * 描述                        :电机运动完成结果检测
  78. * 参数                        :index:轴号
  79. * 返回                        :0电机还在运动中,1为运动结束
  80. *******************************************************************************/
  81. u8 MotorCheckDone(u8 index);
  82. /*******************************************************************************
  83. * 函数名                :MotorStop
  84. * 描述                        :电机运动停止
  85. * 参数                        :index:轴号
  86. * 返回                        :无
  87. *******************************************************************************/
  88. void MotorStop(u8 index);                                                         
  89. /*******************************************************************************
  90. * 函数名                :MotorPlusePro
  91. * 描述                        :电机脉冲控制   定时器中断需要调用
  92. * 参数                        :无
  93. * 返回                        :无
  94. *******************************************************************************/
  95. void MotorPlusePro(void);                                                               
  96. /*******************************************************************************
  97. * 函数名                :MotorGetPosi
  98. * 描述                        :获取电机当前位置
  99. * 参数                        :index:轴号
  100. * 返回                        :无
  101. *******************************************************************************/
  102. float MotorGetPosi(u8 index);                          
  103. /*******************************************************************************
  104. * 函数名                :MotorSetPosi
  105. * 描述                        :设置电机位置
  106. * 参数                        :index:轴号
  107. * 返回                        :0未设定成功 1设定成功
  108. *******************************************************************************/
  109. u8 MotorSetPosi(u8 index,float posi);
  110. #endif
复制代码

没有源码 只提供.LIB和点.文件: Motor.zip (81.47 KB, 下载次数: 52)
回复

使用道具 举报

ID:487396 发表于 2021-8-23 15:55 | 显示全部楼层
项目中使用的是STM32F103VET6,GD32F103VCT6
回复

使用道具 举报

ID:319585 发表于 2021-8-23 19:24 来自手机 | 显示全部楼层
有个杨工开源的步进电机的项目,全部开源的,如果有兴趣的可以考虑下载看看。不过楼主这个虽然没有开源,但感觉功能还是很强大了,不错,这也是分享,挺好。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:584195 发表于 2021-8-24 22:58 | 显示全部楼层
留个标签,希望以后能用得着。
回复

使用道具 举报

ID:487396 发表于 2021-9-1 23:14 | 显示全部楼层
liesnake 发表于 2021-8-23 19:24
有个杨工开源的步进电机的项目,全部开源的,如果有兴趣的可以考虑下载看看。不过楼主这个虽然没有开源,但 ...

好的,哪个杨工,可以给一下他主页,直接去看帖子吗
回复

使用道具 举报

ID:602498 发表于 2021-9-8 17:22 | 显示全部楼层
用原子的模板程序调用提示 L6218E: Undefined symbol MotorTimerPro (referred from main.o).
                                       Not enough information to list image symbols.
回复

使用道具 举报

ID:487396 发表于 2022-3-15 19:34 | 显示全部楼层
171821203 发表于 2021-9-8 17:22
用原子的模板程序调用提示 L6218E: Undefined symbol MotorTimerPro (referred from main.o).
            ...

main里面调用MotorTimePro,但你没有定义,把我给的文档看仔细。就懂其中的奥妙了
回复

使用道具 举报

ID:137243 发表于 2022-7-16 18:34 | 显示全部楼层
wzlxhtzy 发表于 2022-3-15 19:34
main里面调用MotorTimePro,但你没有定义,把我给的文档看仔细。就懂其中的奥妙了

那这个定时器怎么定义呢,需要中断吗?
void MotorTimerPro(u8 timerEnable,u32 freq)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
        TIM_TimeBaseStructure.TIM_Period = 72-1;
        TIM_TimeBaseStructure.TIM_Prescaler =1;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);  
       
  TIM_Cmd(TIM3, timerEnable);                
}
回复

使用道具 举报

ID:25103 发表于 2022-9-2 18:24 | 显示全部楼层
楼主,控制伺服最高频率是多少?
回复

使用道具 举报

ID:970790 发表于 2022-9-3 12:34 | 显示全部楼层
wzlxhtzy 发表于 2021-9-1 23:14
好的,哪个杨工,可以给一下他主页,直接去看帖子吗

你去某1个宝搜  杨工的小店
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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