基于stm32的光点运动轨迹控制

您所在的位置:网站首页 pdf如何用激光笔 基于stm32的光点运动轨迹控制

基于stm32的光点运动轨迹控制

2024-07-11 13:26| 来源: 网络整理| 查看: 265

前言

步进电机画圆、直线。使用的简单的模拟脉冲方式快速实现的步进电机运动控制,如有不足的地方欢迎补充。

任务分析

1.任务 制作一个激光笔点二维控制装置,示意如图所示。在50cm*50cm靶纸上,用激光笔投射一光点,激光笔距离靶纸1米。要求能按指定的误差范围将光点定位在靶纸上任意一点,并在限定的条件下将光点按指定轨迹运动。 在这里插入图片描述 2.设备方案 主控采用stm32f411retx。控制装置为二自由度旋转式云台。使用42步进电机以及TB6600电机驱动器进行32细分。 3.基本原理 直线运动插补与圆弧运动插补采用的逐点比较法,这里只要注意一点就是激光笔是在云台上进行控制,控制x轴与y轴的电机转动时,需根据实际定位的坐标换算成电机当前相对初始状态要转动的角度。这里让激光笔初始垂直照射到原点位置,如下图。 在这里插入图片描述 tan(angle_x) = x / o p x / op x/op。 tan(angle_y) = y / ( x 2 + o p 2 ) y / \sqrt(x^2+op^2) y/( ​x2+op2)。 使用math.h里的atan可以算出angle值 angle_x = a t a n ( x / o p ) ∗ 180 / P I atan(x / op) * 180 / PI atan(x/op)∗180/PI; angle_y = a t a n ( y / ( x 2 + o p 2 ) ) ∗ 180 / P I atan(y / \sqrt(x^2+op^2)) * 180 / PI atan(y/( ​x2+op2))∗180/PI。

4.关键代码

#define Step_one 1 //单步步进值 static float now_x_step = 0, now_y_step = 0; //记忆当前步数 /* * x * CCW对应x轴正方向 */ void stepper_x_run(int tim,float step,float subdivide,uint8_t dir) { int i; if(step = 0) XOY = 1; else if ((Xm - x0) 0) XOY = 2; else if ((Xm - x0) 0) ? (Ym -= Step_one) : (Xm -= Step_one); break; case 3: if(SorN == 1) (Fm >= 0) ? (Ym += Step_one) : (Xm -= Step_one); else (Fm > 0) ? (Xm += Step_one) : (Ym -= Step_one); break; case 4: if(SorN == 1) (Fm >= 0) ? (Xm -= Step_one) : (Ym -= Step_one); else (Fm > 0) ? (Ym += Step_one) : (Xm += Step_one); default: break; } step = step + 1; Fm = pow((Xm - x0), 2) + pow((Ym - y0), 2) - pow(R, 2); turn_coordinate(Xm, Ym); osDelay(2); } } 结论与现象

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 右边有一点点多出来是因为板子右边往后弯了些。思路大概为:写好一个定点函数,根据所给坐标更新步进电机的当前对应角度。然后在直线与圆弧插补里面不断调用定点函数来进行插补。如果使用PWM脉冲中断去控制电机步进。开环控制改为闭环控制,如带编码器的伺服电机,精度也许会更高。

附下工程:https://github.com/YAOSIYANAD/Light_spot_motion_control



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3