標(biāo)題: STM32步進(jìn)、伺服電機(jī)驅(qū)動(dòng) 不開源 只提供.LIB和.H文件 [打印本頁(yè)]

作者: wzlxhtzy    時(shí)間: 2021-8-23 15:53
標(biāo)題: STM32步進(jìn)、伺服電機(jī)驅(qū)動(dòng) 不開源 只提供.LIB和.H文件
此電機(jī)驅(qū)動(dòng)函數(shù),只需開一個(gè)定時(shí)器,即可控制最大9路電機(jī),已在項(xiàng)目中多次驗(yàn)證OK。只需在自己工程中添加點(diǎn)LIB和點(diǎn)H文件,按下面功能描述驅(qū)動(dòng)即可。

一、電機(jī)驅(qū)動(dòng)函數(shù)定義
1. 電機(jī)相關(guān)參數(shù)初始化
函數(shù)名:void MotorInit(u8 motorNum,u8dirReset,u8 stepReset)
參數(shù):motorNum:控制板需控制電機(jī)總個(gè)數(shù)最大為10軸;dirReset:電機(jī)方向信號(hào)復(fù)位電平,即電機(jī)停止運(yùn)行時(shí)方向腳電平,可設(shè)置NPNSensor或PNPSensor;stepReset:電機(jī)脈沖信號(hào)復(fù)位電平,即電機(jī)停止運(yùn)行時(shí)脈沖腳電平,可設(shè)置NPNSensor或PNPSensor;
返回:無(wú)

2. 電機(jī)相關(guān)參數(shù)加載
函數(shù)名    :void AxisParaLoad(u8 index,MotorParaStruct mStruct)
參數(shù):index:軸號(hào) 0至9;mStruct:電機(jī)參數(shù)結(jié)構(gòu)體,包含驅(qū)動(dòng)器撥碼、絲杠導(dǎo)程、原點(diǎn)及極限極性、原點(diǎn)與極性引腳、最大軟限位
返回:無(wú)

3. 電機(jī)運(yùn)動(dòng)到指定點(diǎn)位
函數(shù)名:u8 MotorMoveToPosi(u8 index,MotorModelmModel,u16 accT,u16 decT,float runS,float distance)
參數(shù):index:軸號(hào) 0至9;mModel:電機(jī)運(yùn)行模式,Uniform_Model勻速運(yùn)行、T_Model 梯形加減速、S_Model  S型加減速;accT:加速時(shí)間(ms) 至針點(diǎn)梯形加減速有效,如100為100ms,為0時(shí)切換為勻速運(yùn)動(dòng);decT:減速時(shí)間(ms) 至針點(diǎn)梯形加減速有效,如100為100ms,為0時(shí)切換為勻速運(yùn)動(dòng);runS:運(yùn)行速度,加減速完成后的速度;distance:目標(biāo)位置,需運(yùn)動(dòng)到的點(diǎn)位
返回:0:運(yùn)動(dòng)中  1:正常運(yùn)動(dòng)結(jié)束 2:碰到正限位運(yùn)動(dòng)結(jié)束  3:碰到負(fù)限位運(yùn)動(dòng)結(jié)束

4. 電機(jī)回原點(diǎn)處理
函數(shù)名    :u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,floatspeedH,float speedL,u8 homeMode,u8 homeDir)
參數(shù):index:軸號(hào) 0至9;mModel:電機(jī)運(yùn)行模式,Uniform_Model勻速運(yùn)行、T_Model 梯形加減速、S_Model  S型加減速;accT:加速時(shí)間(ms) 至針點(diǎn)梯形加減速有效,如100為100ms,為0時(shí)切換為勻速運(yùn)動(dòng);decT:減速時(shí)間(ms) 至針點(diǎn)梯形加減速有效,如100為100ms,為0時(shí)切換為勻速運(yùn)動(dòng);speedH:回零高速速度,加減速完成后的速度;speedL:回零低速速度,加減速完成后的速度;distance:目標(biāo)位置,需運(yùn)動(dòng)到的點(diǎn)位;homeMode:回零方式,0為一次回零,即電機(jī)碰到原點(diǎn)立即停止;1為一次回零加反找,電機(jī)向原點(diǎn)運(yùn)動(dòng)感應(yīng)到原點(diǎn)減速停止,然后再反向找原點(diǎn),直到未感應(yīng)到原點(diǎn)停止停止;2為兩次回零,在一次回零加反找未感應(yīng)到原點(diǎn)后減速停止,然后再找原點(diǎn)立即停止;homeDir:回零方向,0為往負(fù)方向回零,1為往正方向回零
返回:0:運(yùn)動(dòng)中  1:正常運(yùn)動(dòng)結(jié)束 2:碰到正限位運(yùn)動(dòng)結(jié)束  3:碰到負(fù)限位運(yùn)動(dòng)結(jié)束

5. 獲取電機(jī)當(dāng)前位置
函數(shù)名:double MotorGetPosi(u8 index)
參數(shù):index:軸號(hào) 0至9;
返回:該軸電機(jī)當(dāng)前位置

6. 設(shè)置電機(jī)當(dāng)前位置
函數(shù)名:u8 MotorSetPosi(u8 index,int posi)
參數(shù):index:軸號(hào) 0至9;posi:待設(shè)定的位置
返回:0:設(shè)置失敗  1:設(shè)置成功

7. 電機(jī)運(yùn)動(dòng)完成結(jié)果檢測(cè)
函數(shù)名:u8 MotorCheckDone(u8 index)
參數(shù):index:軸號(hào) 0至9
返回:0為電機(jī)還在運(yùn)動(dòng)中,1為運(yùn)動(dòng)結(jié)束

8. 電機(jī)運(yùn)動(dòng)停止
函數(shù)名:void MotorStop(u8 index)
參數(shù):index:軸號(hào) 0至9
返回:無(wú)

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

  4. #define NPNSENSOR       0          //NPN型信號(hào)
  5. #define PNPSENSOR       1                //PNP型信號(hào)

  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;                                        //電機(jī)運(yùn)轉(zhuǎn)一圈的距離或者度數(shù) 絲桿導(dǎo)程
  16.         u32 MotorPluse;                                                //驅(qū)動(dòng)器撥碼
  17.         u8 OrgPolar;                                                        //電機(jī)原點(diǎn)信號(hào)極性
  18.         u8 ElPolar;                                                                //電機(jī)極限信號(hào)極性
  19.         u8 DirSwitch;             //電機(jī)方向切換
  20.         uint32_t *StepPin;                                //電機(jī)脈沖引腳
  21.         uint32_t *DirPin;         //電機(jī)方向引腳
  22.         uint32_t *OrgPin;         //電機(jī)原點(diǎn)引腳
  23.         uint32_t *ElPPin;                                        //電機(jī)正極限引腳
  24.         uint32_t *ElNPin;                                        //電機(jī)負(fù)極限引腳
  25. }MotorParaStruct;

  26. /*******************************************************************************
  27. * 函數(shù)名                :MotorGpioInit
  28. * 描述                        :電機(jī)GPIO口初始化  只需構(gòu)造 驅(qū)動(dòng)會(huì)自行調(diào)用
  29. * 參數(shù)                        :無(wú)
  30. * 返回                        :無(wú)
  31. *******************************************************************************/
  32. void MotorGpioInit(void);        
  33. /*******************************************************************************
  34. * 函數(shù)名                :MotorTimerPro
  35. * 描述                        :電機(jī)定時(shí)器開啟/關(guān)閉 頻率切換   只需構(gòu)造 驅(qū)動(dòng)會(huì)自行調(diào)用
  36. * 參數(shù)                        :timerEnable:定時(shí)器開啟/關(guān)閉 freq:切換的頻率
  37. * 返回                        :無(wú)
  38. *******************************************************************************/
  39. void MotorTimerPro(u8 timerEnable,u32 freq);

  40. /*******************************************************************************
  41. * 函數(shù)名                :MotorInit
  42. * 描述                        :電機(jī)相關(guān)參數(shù)初始化
  43. * 參數(shù)                        :motorNum:軸數(shù)  dirReset:電機(jī)方向信號(hào)復(fù)位電平
  44. * 參數(shù)                        :stepReset:電機(jī)脈沖信號(hào)復(fù)位電平
  45. * 返回                        :無(wú)
  46. *******************************************************************************/
  47. void MotorInit(u8 motorNum,u8 dirReset,u8 stepReset);        
  48. /*******************************************************************************
  49. * 函數(shù)名                :AxisParaLoad
  50. * 描述                        :電機(jī)相關(guān)參數(shù)加載
  51. * 參數(shù)                        :index:軸號(hào)  mStruct 電機(jī)參數(shù)結(jié)構(gòu)體
  52. * 返回                        :無(wú)
  53. *******************************************************************************/
  54. void AxisParaLoad(u8 index,MotorParaStruct mStruct);        
  55. /*******************************************************************************
  56. * 函數(shù)名                :MotorMoveHome
  57. * 描述                        :電機(jī)回原點(diǎn)處理
  58. * 參數(shù)                        :index:軸號(hào)  mModel電機(jī)運(yùn)行模式 0 無(wú)加減速 1 梯形加減速 2 S型加減速
  59. * 參數(shù)                        :accT:加速時(shí)間(ms) decT:減速時(shí)間(ms) speedH:高速速度  speedL:低速速度
  60. * 參數(shù)                        :homeMode: 0 一次回零 即電機(jī)反向運(yùn)動(dòng),碰到原點(diǎn)立即停止,適合短距離回零
  61. * 參數(shù)                        :homeMode: 1 一次回零加反找 電機(jī)向原點(diǎn)運(yùn)動(dòng)感應(yīng)到原點(diǎn)后減速停止
  62. * 參數(shù)                        :然后再正向找到未感應(yīng)到原點(diǎn)位置結(jié)束
  63. * 參數(shù)                        :homeMode: 2 兩次回零
  64. * 參數(shù)                        :homeDir: 0 負(fù)方向回零  1 正方向回零
  65. * 返回                        :0電機(jī)還在復(fù)位 1電機(jī)復(fù)位完成 2碰到正限位停止 3碰到負(fù)限位停止
  66. *******************************************************************************/
  67. u8 MotorMoveHome(u8 index,MotorModel mModel,u16 accT,u16 decT,float speedH,float speedL,u8 homeMode,u8 homeDir);
  68. /*******************************************************************************
  69. * 函數(shù)名                :MotorMoveToPosi
  70. * 描述                        :電機(jī)運(yùn)動(dòng)到指定點(diǎn)位
  71. * 參數(shù)                        :index:軸號(hào)  mModel電機(jī)運(yùn)行模式 0 無(wú)加減速 1 梯形加減速 2 S型加減速
  72. * 參數(shù)                        :accT:加速時(shí)間(ms) decT:減速時(shí)間(ms) runS:運(yùn)行速度  distance:目標(biāo)位置
  73. *******************************************************************************/
  74. u8 MotorMoveToPosi(u8 index,MotorModel mModel,u16 accT,u16 decT,float runS,float distance);
  75. /*******************************************************************************
  76. * 函數(shù)名                :MotorCheckDone
  77. * 描述                        :電機(jī)運(yùn)動(dòng)完成結(jié)果檢測(cè)
  78. * 參數(shù)                        :index:軸號(hào)
  79. * 返回                        :0電機(jī)還在運(yùn)動(dòng)中,1為運(yùn)動(dòng)結(jié)束
  80. *******************************************************************************/
  81. u8 MotorCheckDone(u8 index);
  82. /*******************************************************************************
  83. * 函數(shù)名                :MotorStop
  84. * 描述                        :電機(jī)運(yùn)動(dòng)停止
  85. * 參數(shù)                        :index:軸號(hào)
  86. * 返回                        :無(wú)
  87. *******************************************************************************/
  88. void MotorStop(u8 index);                                                         
  89. /*******************************************************************************
  90. * 函數(shù)名                :MotorPlusePro
  91. * 描述                        :電機(jī)脈沖控制   定時(shí)器中斷需要調(diào)用
  92. * 參數(shù)                        :無(wú)
  93. * 返回                        :無(wú)
  94. *******************************************************************************/
  95. void MotorPlusePro(void);                                                               
  96. /*******************************************************************************
  97. * 函數(shù)名                :MotorGetPosi
  98. * 描述                        :獲取電機(jī)當(dāng)前位置
  99. * 參數(shù)                        :index:軸號(hào)
  100. * 返回                        :無(wú)
  101. *******************************************************************************/
  102. float MotorGetPosi(u8 index);                          
  103. /*******************************************************************************
  104. * 函數(shù)名                :MotorSetPosi
  105. * 描述                        :設(shè)置電機(jī)位置
  106. * 參數(shù)                        :index:軸號(hào)
  107. * 返回                        :0未設(shè)定成功 1設(shè)定成功
  108. *******************************************************************************/
  109. u8 MotorSetPosi(u8 index,float posi);
  110. #endif
復(fù)制代碼

沒有源碼 只提供.LIB和點(diǎn).文件: Motor.zip (81.47 KB, 下載次數(shù): 52)


作者: wzlxhtzy    時(shí)間: 2021-8-23 15:55
項(xiàng)目中使用的是STM32F103VET6,GD32F103VCT6
作者: liesnake    時(shí)間: 2021-8-23 19:24
有個(gè)楊工開源的步進(jìn)電機(jī)的項(xiàng)目,全部開源的,如果有興趣的可以考慮下載看看。不過樓主這個(gè)雖然沒有開源,但感覺功能還是很強(qiáng)大了,不錯(cuò),這也是分享,挺好。
作者: zyluglugl    時(shí)間: 2021-8-24 22:58
留個(gè)標(biāo)簽,希望以后能用得著。
作者: wzlxhtzy    時(shí)間: 2021-9-1 23:14
liesnake 發(fā)表于 2021-8-23 19:24
有個(gè)楊工開源的步進(jìn)電機(jī)的項(xiàng)目,全部開源的,如果有興趣的可以考慮下載看看。不過樓主這個(gè)雖然沒有開源,但 ...

好的,哪個(gè)楊工,可以給一下他主頁(yè),直接去看帖子嗎
作者: 171821203    時(shí)間: 2021-9-8 17:22
用原子的模板程序調(diào)用提示 L6218E: Undefined symbol MotorTimerPro (referred from main.o).
                                       Not enough information to list image symbols.
作者: wzlxhtzy    時(shí)間: 2022-3-15 19:34
171821203 發(fā)表于 2021-9-8 17:22
用原子的模板程序調(diào)用提示 L6218E: Undefined symbol MotorTimerPro (referred from main.o).
            ...

main里面調(diào)用MotorTimePro,但你沒有定義,把我給的文檔看仔細(xì)。就懂其中的奧妙了
作者: 天上跑著玩    時(shí)間: 2022-7-16 18:34
wzlxhtzy 發(fā)表于 2022-3-15 19:34
main里面調(diào)用MotorTimePro,但你沒有定義,把我給的文檔看仔細(xì)。就懂其中的奧妙了

那這個(gè)定時(shí)器怎么定義呢,需要中斷嗎?
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);                
}
作者: huaishang    時(shí)間: 2022-9-2 18:24
樓主,控制伺服最高頻率是多少?
作者: henge-stone    時(shí)間: 2022-9-3 12:34
wzlxhtzy 發(fā)表于 2021-9-1 23:14
好的,哪個(gè)楊工,可以給一下他主頁(yè),直接去看帖子嗎

你去某1個(gè)寶搜  楊工的小店




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1