新人看不懂
那位好心人帮忙加下注释 只要引脚接入接出部分就好 附件里是工程全部文件
[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]
|