找回密码
 注册
关于网站域名变更的通知
查看: 383|回复: 2
打印 上一主题 下一主题

STM32步进、伺服电机驱动

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-17 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
此电机驱动函数,只需开一个定时器,即可控制最大9路电机,已在项目中多次验证OK。只需在自己工程中添加点LIB和点H文件,按下面功能描述驱动即可。
" h4 C  @0 |6 E7 y# Y' ]% M+ j+ [. T  n
一、电机驱动函数定义
) q9 h; |& ]! A# d" _, e/ }1. 电机相关参数初始化
& [9 ?/ c+ A+ s/ D0 E  o7 C6 [函数名:void MotorInit(u8 motorNum,u8dirReset,u8 stepReset)1 `& u0 V+ [% z! c3 U
参数:motorNum:控制板需控制电机总个数最大为10轴;dirReset:电机方向信号复位电平,即电机停止运行时方向脚电平,可设置NPNSensor或PNPSensor;stepReset:电机脉冲信号复位电平,即电机停止运行时脉冲脚电平,可设置NPNSensor或PNPSensor;2 P' P% g6 c7 i4 ^! {* [
返回:无
; p& [' j- W) S) W% t$ A2 w$ ]4 w6 a) r
2. 电机相关参数加载
# N, a- `& T& A- `7 V! I函数名    :void AxisParaLoad(u8 index,MotorParaStruct mStruct). J; z( \: |2 g5 S8 K3 q
参数:index:轴号 0至9;mStruct:电机参数结构体,包含驱动器拨码、丝杠导程、原点及极限极性、原点与极性引脚、最大软限位/ E) t1 u$ D- A! s8 ?* E: g
返回:无
# a1 v% @% y0 G4 M+ ]( w+ ^- x% N7 O. U1 L* Q9 m+ |) U
3. 电机运动到指定点位( p- Q5 Z1 l  P' V0 X
函数名:u8 MotorMoveToPosi(u8 index,MotorModelmModel,u16 accT,u16 decT,float runS,float distance)! o$ ^3 n+ Y, Q, Y4 b
参数:index:轴号 0至9;mModel:电机运行模式,Uniform_Model匀速运行、T_Model 梯形加减速、S_Model  S型加减速;accT:加速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;decT:减速时间(ms) 至针点梯形加减速有效,如100为100ms,为0时切换为匀速运动;runS:运行速度,加减速完成后的速度;distance:目标位置,需运动到的点位4 T0 X/ i9 D$ h, b' o
返回:0:运动中  1:正常运动结束 2:碰到正限位运动结束  3:碰到负限位运动结束
9 R# s4 h9 M9 L- C) c8 n% v0 [1 E2 j! U
4. 电机回原点处理
" o( K# w6 R& P% w函数名    :u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,floatspeedH,float speedL,u8 homeMode,u8 homeDir)
+ N9 W0 U7 e' @  T3 T$ }; v参数: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为往正方向回零
# @: U$ K; v- }返回:0:运动中  1:正常运动结束 2:碰到正限位运动结束  3:碰到负限位运动结束5 g( w- b/ [) q8 x, L

6 [) g/ R: A2 ~- p9 ?% E* }5. 获取电机当前位置
* H* }: F" C4 c4 b8 x* z1 e函数名:double MotorGetPosi(u8 index)
9 }* t& H7 ?, f; |参数:index:轴号 0至9;
/ Z0 c! P! o* P7 g; d9 u  J5 f. A返回:该轴电机当前位置
3 Z6 y5 S) W/ v& _
) Z6 D1 Q: v) v- ]3 ~  R  N6. 设置电机当前位置
6 d3 o0 F$ T$ I' A& N/ m函数名:u8 MotorSetPosi(u8 index,int posi). N  w& [, }3 L4 X' L6 c
参数:index:轴号 0至9;posi:待设定的位置8 M# B3 Y  r" V) m
返回:0:设置失败  1:设置成功, U! P3 J) m& e5 z5 c' z5 i

$ s* T- [/ Q7 t7 y+ r7. 电机运动完成结果检测
( F8 c0 [( K& n$ b2 e: n2 p函数名:u8 MotorCheckDone(u8 index)
9 k& W, g3 }! P+ j5 w参数:index:轴号 0至95 w) {( O; F3 t' m% Z- h$ U1 {
返回:0为电机还在运动中,1为运动结束# ~% y3 f5 O; a' C4 s! ]2 `
5 C+ x! N  ^% g- j. G& u0 v
8. 电机运动停止  W, @2 Y; X5 ]& c0 g2 h- _5 g
函数名:void MotorStop(u8 index)
& j& \# D/ `/ F$ v) h7 u1 e参数:index:轴号 0至9( }0 R. a$ I9 m
返回:无' l* Y3 d" k* I- w( P" g' v
  • #ifndef __MOTOR_H
  • #define __MOTOR_H
  • #include "sys.h"
  • #define NPNSENSOR       0          //NPN型信号
  • #define PNPSENSOR       1                //PNP型信号
  • typedef enum
  • {
  •         Uniform_Model = 0,                                //匀速模式
  •         T_Model,                                                      //梯形加减速模式
  •         S_Model                                                                                //S型加减速模式
  • }MotorModel;
  • typedef struct
  • {
  •         float MaxPosi;                                                //行程上限
  •         float CycleRange;                                        //电机运转一圈的距离或者度数 丝杆导程
  •         u32 MotorPluse;                                                //驱动器拨码
  •         u8 OrgPolar;                                                        //电机原点信号极性
  •         u8 ElPolar;                                                                //电机极限信号极性
  •         u8 DirSwitch;             //电机方向切换
  •         uint32_t *StepPin;                                //电机脉冲引脚
  •         uint32_t *DirPin;         //电机方向引脚
  •         uint32_t *OrgPin;         //电机原点引脚
  •         uint32_t *ElPPin;                                        //电机正极限引脚
  •         uint32_t *ElNPin;                                        //电机负极限引脚
  • }MotorParaStruct;
  • /*******************************************************************************
  • * 函数名                :MotorGpioInit
  • * 描述                        :电机GPIO口初始化  只需构造 驱动会自行调用
  • * 参数                        :无
  • * 返回                        :无
  • *******************************************************************************/
  • void MotorGpioInit(void);
  • /*******************************************************************************
  • * 函数名                :MotorTimerPro
  • * 描述                        :电机定时器开启/关闭 频率切换   只需构造 驱动会自行调用
  • * 参数                        :timerEnable:定时器开启/关闭 freq:切换的频率
  • * 返回                        :无
  • *******************************************************************************/
  • void MotorTimerPro(u8 timerEnable,u32 freq);
  • /*******************************************************************************
  • * 函数名                :MotorInit
  • * 描述                        :电机相关参数初始化
  • * 参数                        :motorNum:轴数  dirReset:电机方向信号复位电平
  • * 参数                        :stepReset:电机脉冲信号复位电平
  • * 返回                        :无
  • *******************************************************************************/
  • void MotorInit(u8 motorNum,u8 dirReset,u8 stepReset);
  • /*******************************************************************************
  • * 函数名                :AxisParaLoad
  • * 描述                        :电机相关参数加载
  • * 参数                        :index:轴号  mStruct 电机参数结构体
  • * 返回                        :无
  • *******************************************************************************/
  • void AxisParaLoad(u8 index,MotorParaStruct mStruct);
  • /*******************************************************************************
  • * 函数名                :MotorMoveHome
  • * 描述                        :电机回原点处理
  • * 参数                        :index:轴号  mModel电机运行模式 0 无加减速 1 梯形加减速 2 S型加减速
  • * 参数                        :accT:加速时间(ms) decT:减速时间(ms) speedH:高速速度  speedL:低速速度
  • * 参数                        :homeMode: 0 一次回零 即电机反向运动,碰到原点立即停止,适合短距离回零
  • * 参数                        :homeMode: 1 一次回零加反找 电机向原点运动感应到原点后减速停止
  • * 参数                        :然后再正向找到未感应到原点位置结束
  • * 参数                        :homeMode: 2 两次回零
  • * 参数                        :homeDir: 0 负方向回零  1 正方向回零
  • * 返回                        :0电机还在复位 1电机复位完成 2碰到正限位停止 3碰到负限位停止
  • *******************************************************************************/
  • u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,float speedH,float speedL,u8 homeMode,u8 homeDir);
  • /*******************************************************************************
  • * 函数名                :MotorMoveToPosi
  • * 描述                        :电机运动到指定点位
  • * 参数                        :index:轴号  mModel电机运行模式 0 无加减速 1 梯形加减速 2 S型加减速
  • * 参数                        :accT:加速时间(ms) decT:减速时间(ms) runS:运行速度  distance:目标位置
  • *******************************************************************************/
  • u8 MotorMoveToPosi(u8 index,MotorModel mModel,u16 accT,u16 decT,float runS,float distance);
  • /*******************************************************************************
  • * 函数名                :MotorCheckDone
  • * 描述                        :电机运动完成结果检测
  • * 参数                        :index:轴号
  • * 返回                        :0电机还在运动中,1为运动结束
  • *******************************************************************************/
  • u8 MotorCheckDone(u8 index);
  • /*******************************************************************************
  • * 函数名                :MotorStop
  • * 描述                        :电机运动停止
  • * 参数                        :index:轴号
  • * 返回                        :无
  • *******************************************************************************/
  • void MotorStop(u8 index);
  • /*******************************************************************************
  • * 函数名                :MotorPlusePro
  • * 描述                        :电机脉冲控制   定时器中断需要调用
  • * 参数                        :无
  • * 返回                        :无
  • *******************************************************************************/
  • void MotorPlusePro(void);
  • /*******************************************************************************
  • * 函数名                :MotorGetPosi
  • * 描述                        :获取电机当前位置
  • * 参数                        :index:轴号
  • * 返回                        :无
  • *******************************************************************************/
  • float MotorGetPosi(u8 index);
  • /*******************************************************************************
  • * 函数名                :MotorSetPosi
  • * 描述                        :设置电机位置
  • * 参数                        :index:轴号
  • * 返回                        :0未设定成功 1设定成功
  • *******************************************************************************/
  • u8 MotorSetPosi(u8 index,float posi);
  • #endif
    ) o6 N" b1 R( U% R2 P' e

  c/ d3 U0 X3 l8 m0 w( T; }1 Z* v

该用户从未签到

2#
发表于 2021-9-17 10:55 | 只看该作者
电机正转和反转用Dirswitch吗

该用户从未签到

3#
发表于 2021-9-17 13:46 | 只看该作者
两个电机转速差距大呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 20:36 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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