OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6895|回复: 6

STM32步进电机加减速,引脚有点繁杂了,不知道哪个接那个

[复制链接]

6

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
519
金钱
519
注册时间
2015-3-9
在线时间
108 小时
发表于 2015-3-10 22:53:06 | 显示全部楼层 |阅读模式
5金钱

新人看不懂

那位好心人帮忙加下注释      只要引脚接入接出部分就好        附件里是工程全部文件

[mw_shl_code=c,true]#define CONTROL_PORT GPIOE #define AXIS_PULSE_1 GPIO_Pin_0 #define AXIS_PULSE_2 GPIO_Pin_2 #define AXIS_PULSE_3 GPIO_Pin_4 #define AXIS_PULSE_4 GPIO_Pin_6 #define AXIS_DIR_1 GPIO_Pin_1 #define AXIS_DIR_2 GPIO_Pin_3 #define AXIS_DIR_3 GPIO_Pin_5 #define AXIS_DIR_4 GPIO_Pin_7 #define AXIS_LMTPOS_1 GPIO_Pin_8 #define AXIS_LMTNEG_1 GPIO_Pin_9 #define AXIS_LMTPOS_2 GPIO_Pin_10 #define AXIS_LMTNEG_2 GPIO_Pin_11 #define AXIS_LMTPOS_3 GPIO_Pin_12 #define AXIS_LMTNEG_3 GPIO_Pin_13 #define AXIS_LMTPOS_4 GPIO_Pin_14 #define AXIS_LMTNEG_4 GPIO_Pin_15 #define AXIS_HOME_1 GPIO_Pin_0 #define AXIS_HOME_2 GPIO_Pin_1 #define AXIS_HOME_3 GPIO_Pin_2 #define AXIS_HOME_4 GPIO_Pin_3 #define POSITIVE 1 #define NEGATIVE -1 #define CW 0 #define CCW 1 typedef struct { //! What part of the speed ramp we are in. u8 run_state ; //! Direction stepper motor should move. u8 dir ; //! Peroid of next timer delay. At start this value set the accelration rate. s32 step_delay; //! What step_pos to start decelaration u32 decel_start; //! Sets deceleration rate. s32 decel_val; //! Minimum time delay (max speed) s32 min_delay; //! Counter used when accelerateing/decelerateing to calculate step_delay. s32 accel_count; } speedRampData; GPIO_InitTypeDef GPIO_InitStructure; #define T1_FREQ 1000000 #define SPR 1600 // Maths constants. To simplify maths when calculating in AxisMoveRel(). #define ALPHA (2*3.14159/SPR) // 2*pi/spr #define A_T_x100 ((long)(ALPHA*T1_FREQ*100)) // (ALPHA / T1_FREQ)*100 #define T1_FREQ_148 ((int)((T1_FREQ*0.676)/100)) // divided by 100 and scaled by 0.676 #define A_SQ (long)(ALPHA*2*100000*100000) // #define A_x20000 (int)(ALPHA*20000) // ALPHA*20000 // Speed ramp states #define STOP 0 #define ACCEL 1 #define DECEL 2 #define RUN 3 s32 steps[4]={150000, 150000, 150000, 150000};//运动距离 u32 accel[4]={10000,10000, 10000, 10000};//加速度 u32 decel[4]={10000, 10000, 10000, 10000};//减速度 u32 speed[4]={10000, 10000, 10000, 10000};//速度 s32 stpdecel[4]={65000, 65000, 65000, 65000};//急停减速度 u8 addr485=0; u8 LmtSnsPos[4]={1,1,1,1};//正限位电平 u8 LmtSnsNeg[4]={1,1,1,1};//负限位电平 u8 HomeSns[4]={1,1,1,1};//回零电平 s32 position[4]={0,0,0,0};//当前位置 s32 HomePos[4]={0,0,0,0};// s32 SoftLmtPos[4]={0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff}; s32 SoftLmtNeg[4]={0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}; u16 AxisPulsePin[4]={AXIS_PULSE_1, AXIS_PULSE_2, AXIS_PULSE_3, AXIS_PULSE_4}; u16 AxisDirPin[4]={AXIS_DIR_1, AXIS_DIR_2, AXIS_DIR_3, AXIS_DIR_4}; u16 LmtPosPin[4]={AXIS_LMTPOS_1, AXIS_LMTPOS_2, AXIS_LMTPOS_3, AXIS_LMTPOS_4}; u16 LmtNegPin[4]={AXIS_LMTNEG_1, AXIS_LMTNEG_2, AXIS_LMTNEG_3, AXIS_LMTNEG_4}; u16 HomePin[4]={AXIS_HOME_1, AXIS_HOME_2, AXIS_HOME_3, AXIS_HOME_4}; u16 AddrPin[4]={GPIO_Pin_7, GPIO_Pin_6, GPIO_Pin_15, GPIO_Pin_14}; GPIO_TypeDef *AxisLmtPosPort[4]={GPIOE, GPIOE, GPIOE, GPIOE}; GPIO_TypeDef *AxisLmtNegPort[4]={GPIOE, GPIOE, GPIOE, GPIOE}; GPIO_TypeDef *AxisPulsePort[4]={GPIOE, GPIOE, GPIOE, GPIOE}; GPIO_TypeDef *AxisDirPort[4]={GPIOE, GPIOE, GPIOE, GPIOE}; GPIO_TypeDef *HomePort[4]={GPIOC, GPIOC, GPIOC, GPIOC}; GPIO_TypeDef *AddrPort[4]={GPIOC, GPIOC, GPIOB, GPIOB}; uint32_t AxisEXTILine[4]={EXTI_Line0, EXTI_Line1, EXTI_Line2, EXTI_Line3}; uint8_t AxisEXTIPinSource[4]={GPIO_PinSource0, GPIO_PinSource1, GPIO_PinSource2, GPIO_PinSource3}; bool bLmtPos[4]={FALSE, FALSE, FALSE, FALSE}; bool bLmtNeg[4]={FALSE, FALSE, FALSE, FALSE}; bool bStopCmd[4]={FALSE, FALSE, FALSE, FALSE}; bool bEmgStopping[4]={FALSE, FALSE, FALSE, FALSE}; //是否碰限位急停 bool bEnableSoftLmt[4]={FALSE, FALSE, FALSE, FALSE}; bool bHomeOK[4]={FALSE, FALSE, FALSE, FALSE}; bool bZeroCapture[4]={FALSE, FALSE, FALSE, FALSE}; s32 ZeroDir[4]={POSITIVE, POSITIVE, POSITIVE, POSITIVE}; //回零方向 s32 ZeroOffset[4]={1000, 1000, 1000, 1000}; //零点偏移 u32 ZeroBackDistance[4]={6400, 6400, 6400, 6400}; //回零回退距离 u8 ZeroStep[4]={0, 0, 0, 0}; u32 HomeFastSpeed[4]={10000, 10000, 10000, 10000};//回零快搜速度 u32 HomeSlowSpeed[4]={2000, 2000, 2000, 2000};//回零慢搜速度 speedRampData srd[4]; enum { IDEL, FASTSEEK, FASTSEEKSTOP, FASTSEEKBACK, SLOWSEEK, SLOWSEEKSTOP, MOVETOZERO }; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ void NVIC_Configuration(void); void Timer_Init(void); void EXTILine_Config(void); void GPIO_Configuration(void); int fputc(int ch, FILE *f); u8 MotionStatus[4]={0, 0, 0, 0};//是否在运动?0:停止,1:运动 bool bDataOK; USART_InitTypeDef USART_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; uint8_t RxBuffer[12]; uint8_t RxCounter; void AxisMoveRel(u32 axis, s32 step, u32 accel, u32 decel, u32 speed); void AxisMoveAbs(u32 axis, s32 step, u32 accel, u32 decel, u32 speed); u32 sqrt(u32 x); void LimitDetect(u8 axis); void USART_Configuration(void); void AxisHome(u8 axis); #define EnableHomeCapture1 EXTI->IMR |= GPIO_Pin_0 #define DisableHomeCapture1 EXTI->IMR &=~GPIO_Pin_0 #define EnableHomeCapture2 EXTI->IMR |= GPIO_Pin_1 #define DisableHomeCapture2 EXTI->IMR &=~GPIO_Pin_1 #define EnableHomeCapture3 EXTI->IMR |= GPIO_Pin_2 #define DisableHomeCapture3 EXTI->IMR &=~GPIO_Pin_2 #define EnableHomeCapture4 EXTI->IMR |= GPIO_Pin_3 #define DisableHomeCapture4 EXTI->IMR &=~GPIO_Pin_3 void EnableHomeCapture(u8 axis) {EXTI->IMR |=HomePin[axis];} void DisableHomeCapture(u8 axis) {EXTI->IMR &=~HomePin[axis];} /** * @brief Main program. * @param None * @retval : None */ int main(void) { /* Setup STM32 system (clock, PLL and Flash configuration) */ u8 axis=0; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); for(axis=0; axis<4; axis++) { GPIO_InitStructure.GPIO_Pin = AxisPulsePin[axis]; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(AxisPulsePort[axis], &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = AxisDirPin[axis]; GPIO_Init(AxisDirPort[axis], &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=LmtPosPin[axis]; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(AxisLmtPosPort[axis], &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=LmtNegPin[axis]; GPIO_Init(AxisLmtNegPort[axis], &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=HomePin[axis]; GPIO_Init(HomePort[axis], &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=AddrPin[axis]; GPIO_Init(AddrPort[axis], &GPIO_InitStructure); } [/mw_shl_code]


STM32F103加减速.rar

1.83 MB, 下载次数: 2035

最佳答案

查看完整内容[请看2#楼]

现在没有用这个了,参考别人的用的插补算法有点慢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
519
金钱
519
注册时间
2015-3-9
在线时间
108 小时
 楼主| 发表于 2015-3-10 22:53:07 | 显示全部楼层
现在没有用这个了,参考别人的用的插补算法有点慢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-10 23:11:31 | 显示全部楼层
帮顶.....
回复

使用道具 举报

17

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-12-7
在线时间
0 小时
发表于 2015-3-11 08:38:29 | 显示全部楼层
这个代码我用过,仔细看下面这段代码
for(axis=0; axis<4; axis++)
176
    {
177
        GPIO_InitStructure.GPIO_Pin = AxisPulsePin[axis];
178
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
179
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
180
        GPIO_Init(AxisPulsePort[axis], &GPIO_InitStructure);
181
         
182
        GPIO_InitStructure.GPIO_Pin = AxisDirPin[axis];
183
        GPIO_Init(AxisDirPort[axis], &GPIO_InitStructure);
184
         
185
        GPIO_InitStructure.GPIO_Pin=LmtPosPin[axis];
186
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
187
 
188
        GPIO_Init(AxisLmtPosPort[axis], &GPIO_InitStructure);
189
         
190
        GPIO_InitStructure.GPIO_Pin=LmtNegPin[axis];
191
        GPIO_Init(AxisLmtNegPort[axis], &GPIO_InitStructure);
192
         
193
        GPIO_InitStructure.GPIO_Pin=HomePin[axis];
194
        GPIO_Init(HomePort[axis], &GPIO_InitStructure);
195
         
196
        GPIO_InitStructure.GPIO_Pin=AddrPin[axis];
197
        GPIO_Init(AddrPort[axis], &GPIO_InitStructure);
198
    }
然后对照:
#define  AXIS_PULSE_1    GPIO_Pin_0
003
#define  AXIS_PULSE_2    GPIO_Pin_2 //脉冲输出
004
#define  AXIS_PULSE_3    GPIO_Pin_4
005
#define  AXIS_PULSE_4    GPIO_Pin_6
006
#define  AXIS_DIR_1    GPIO_Pin_1   //方向引脚
007
#define  AXIS_DIR_2    GPIO_Pin_3
008
#define  AXIS_DIR_3    GPIO_Pin_5
009
#define  AXIS_DIR_4    GPIO_Pin_7
010
#define  AXIS_LMTPOS_1    GPIO_Pin_8 //限位引脚
011
#define  AXIS_LMTNEG_1    GPIO_Pin_9
012
#define  AXIS_LMTPOS_2    GPIO_Pin_10
013
#define  AXIS_LMTNEG_2    GPIO_Pin_11
014
#define  AXIS_LMTPOS_3    GPIO_Pin_12
015
#define  AXIS_LMTNEG_3    GPIO_Pin_13
016
#define  AXIS_LMTPOS_4    GPIO_Pin_14
017
#define  AXIS_LMTNEG_4    GPIO_Pin_15
018
#define  AXIS_HOME_1    GPIO_Pin_0
019
#define  AXIS_HOME_2    GPIO_Pin_1
020
#define  AXIS_HOME_3    GPIO_Pin_2
021
#define  AXIS_HOME_4    GPIO_Pin_3
这代码只能进行直线加减速,无法做任意直线加减速,里面有很多参数计算不好理解,需要看avr446这个资料
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-8-16
在线时间
3 小时
发表于 2015-8-21 14:50:25 | 显示全部楼层
楼主这个做的怎么样的啊,我也在一句句的啃这个代码
回复

使用道具 举报

6

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
519
金钱
519
注册时间
2015-3-9
在线时间
108 小时
 楼主| 发表于 2015-8-29 14:42:29 | 显示全部楼层
回复【4楼】枫过云叶:
---------------------------------
回复【4楼】枫过云叶:
---------------------------------

现在没有用这个了,参考别人的用的插补算法有点慢
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-8-16
在线时间
3 小时
发表于 2015-9-24 17:14:50 | 显示全部楼层
回复【5楼】1026481385:
---------------------------------
兄台,有资料吗,
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 03:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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