|

楼主 |
发表于 2025-5-18 10:38:00
|
显示全部楼层
void Send_OPM_Stepper(uint8_t axis)
{
if (axis == AXIS_X)
{
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
}
else
{
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
}
}这是发送单脉冲命令的函数 我把这个函数放在while里面测试过了 这个没问题
void Vison_coverXYtoStep(vision_point_t target_Point)
{
uint16_t differ_x= Vision_info->Redlazer_point.x-target_Point.x;
uint16_t differ_y= Vision_info->Redlazer_point.y-target_Point.y;
float X_angle=atan(differ_x*VR_Rate/100.0f)*(180.0f/PI);
float Y_angle=atan(differ_y*VR_Rate/100.0f)*(180.0f/PI);
//四舍五入整数
target_steps_x=(int32_t)roundf(X_angle*StepperDiv/StepperAngle);
target_steps_y=(int32_t)roundf(Y_angle*StepperDiv/StepperAngle);
}
void MoveToTargetCoordinates_Line(vision_point_t target_Point)
{
Vison_coverXYtoStep( target_Point);
//设置方向
if(target_steps_x<=0)
{
SetDirection(AXIS_X,DIR_CW);
}
else
{
SetDirection(AXIS_X,DIR_CCW);
}
if(target_steps_y<=0)
{
SetDirection(AXIS_Y,DIR_CW);
}
else
{
SetDirection(AXIS_Y,DIR_CCW);
}
//设定好方向后化为绝对值
target_steps_x=abs(target_steps_x);
target_steps_y=abs(target_steps_y);
NXY=target_steps_x+target_steps_y;
line_is_moving=true;
//开始产生脉冲
GPIOE->BSRR|=1<<15;//用于逻辑分析仪指示中断开始
__HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim15);
}
//
//需要测试
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
if (htim->Instance == TIM15)
{
//HAL_Delay(1);
GPIOE->BSRR|=1<<13;
if (!line_is_moving) //如果是false则就会停下来
{
HAL_TIM_Base_Stop_IT(&htim15);
return;
}
if(NXY <= 0)//迭代完成
{
line_is_moving=false;
HAL_TIM_Base_Stop_IT(&htim15);
return;
}
if (FM >= 0)
{
// 判断X方向
FM=FM-target_steps_y;
Send_OPM_Stepper(AXIS_X);
}
else
{
FM=FM+target_steps_x;
Send_OPM_Stepper(AXIS_Y);
}
NXY=NXY-1;
GPIOE->BSRR = (1U << (13 + 16));
}//
这段程序大致意思是我有 两个步进电机组成了 xy轴 使用直线插补让它xy轴协同走直线 (23年电赛e题)但是我发现俩通道各自多两个脉冲 如图所示
根据我的通道一的指示 脉冲都是在中断里面发出的 于是我就在一进入TIM15的中断里面就加入了一个HAL_delay 让中断回调什么也不执行直接卡死没想到还有两个通道各有一个脉冲(第三个图片)这就很奇怪了 |
|