舵机的梯形加减速控制
创作时间:
作者:
@小白创作中心
舵机的梯形加减速控制
引用
CSDN
1.
https://blog.csdn.net/Myself_study/article/details/142743369
原理
我们以MG995等舵机为例,舵机有三个PIN,分别是VCC,GND,PWM,PWM引脚需要一个20ms周期信号,通过不同的占空比来控制不同角度,具体参数如下:
- 0.5ms--------------0度;
- 1.0ms------------45度;
- 1.5ms------------90度;
- 2.0ms-----------135度;
- 2.5ms-----------180度;
在舵机的控制过程中,只需要控制占空比即可。然而,如果是大角度的切换,舵机将以最大转速到达目标位置,在简单的机械臂应用中,这样的控制往往会带来非常大的惯性。
为了避免这种惯性,对舵机进行类梯形加减速控制,如下图:
梯形加减速舵机控制
本质上是通过调节每20ms的占空比,使其逐步增加而不是直接变换,从而实现的梯形加减速控制。每次占空比增加的数量是梯形加减速的核心。
给出控制结果如下图:
代码
- 采用面向对象的方法编写C代码,首先使用一个结构体将舵机所需要的参数封装起来
typedef struct
{
float MaxAngle; //对应舵机转动的最大角度
float MinAngle; //对应舵机能转动的最小角度
float TargetAngle; //舵机的目标角度
float MaxOmega; //舵机的最大速度
float Omega; //舵机的速度
float Angle; //舵机的角度
float Acc; //舵机的加速度
uint8_t Dir; //舵机的方向 //#define CCW 0 #define CW 1
void (*SetPluse)(uint16_t us); //放在定时器更新中断中使用:定时器时钟配置为1Mhz,更新频率配置为50Hz
}Servo_t;
- 然后就是舵机的速度和角度更新函数,这个更新函数 需要放在20ms的定时器中定时调用,因为舵机控制的最小时间间隔是20ms。
uint8_t compulteNewPos(Servo_t*Node)
{
float AngleTo = Node->TargetAngle - Node->Angle;
float AngleStop = Node->Omega * Node->Omega / 2 / Node->Acc;
float Omega = Node->Omega;
if (fabs(AngleTo) < 0.1 && AngleStop < 1) //在目标位置上
{
Node->Angle = Node->TargetAngle;
Node->Omega = 0;
Node->Dir = CW;
return 0;
}
if (AngleTo > 0) //目标在当前位置的顺时针方向
{
if (AngleTo < AngleStop || Node->Dir == CCW) //应当减速
{
if(Omega>0)
Omega = Omega - Node->Acc * 0.02;
else if(Omega <0)
Omega = Omega + Node->Acc * 0.02;
}
else if(AngleStop< AngleTo && Node->Dir == CW)//应当加速
{
Omega = Omega + Node->Acc * 0.02;
Omega = min(Omega, Node->MaxOmega);
}
}
else//目标在当前位置的逆时针方向
{
if (-AngleTo < AngleStop || Node->Dir == CW) //应当减速
{
if (Omega > 0)
Omega =Omega - Node->Acc * 0.02;
else if (Omega <0)
Omega =Omega + Node->Acc * 0.02;
}
else if (AngleStop < -AngleTo&& Node->Dir == CCW)//应当加速
{
Omega = Omega - Node->Acc * 0.02;
Omega = max(Omega, -Node->MaxOmega);
}
}
if (Omega == 0)
{
Node->Dir = AngleTo > 0?CW:CCW;
}
else
{
Node->Dir = Omega > 0 ? CW : CCW;
}
Node->Omega = Omega;
Node->Angle = Node->Angle + Node->Omega * 0.02;
return 1;
}
- 其次就是要对其他的一些参数设置进行封装。
/*
* 将角度转换成脉冲宽度
*/
uint16_t Angle2Pluse(Servo_t* Node)
{
return (Node->Angle - Node->MinAngle) / (Node->MaxAngle - Node->MinAngle) * 2000.0 + 500.0;
}
/*
* 设置目标角度
*/
void Servo_MoveTo(Servo_t* Node,float anlge)
{
Node->TargetAngle = anlge;
}
/*
* 设置加速度
*/
void Servo_SetAcc(Servo_t* Node, float acc)
{
Node->Acc = fabs(acc);
}
/*
* 设置最大速度
*/
void Servo_SetMaxOmega(Servo_t* Node, float max)
{
Node->MaxOmega = fabs(max);
}
热门推荐
签订投资担保合同时的注意事项
2025年国际竞赛时间表!数学/物理/化学/生物/经济全竞赛推荐!
咽峡炎治疗方法
农村医疗保险手机上怎么查
“VR/AR游戏+非遗”,数字科技赋能非遗创新发展
王铎行草书法作品集第七十期:《行草五言诗》手卷墨迹欣赏
什么算非法集资?如何避免陷入非法集资陷阱?
燃尽岁月!探秘猫王的非凡一生:音乐传奇与幕后故事
精神分裂症患者自知力:判断标准与恢复方法
12306 购票系统:从零到一构建高并发分布式系统
压电陶瓷行业运行现状与九大应用领域
稻盛和夫:当你犹豫彷徨时,建议选择充满荆棘的道路
新材料与纳米技术:应用实例与发展方向
鹦鹉怎么认主?怎么让鹦鹉认主人
如何帮助学生快速适应新学期?且看这几位名班主任的做法!
美媒评NBA小前历史TOP20:塔图姆14 杜兰特超伯德 榜首无悬念
孕妇每天都便秘怎么办
中国足球历史上的10位顶尖前锋,德甲杨晨排名第2、西甲武磊位列第4
千古奇文《璇玑图》:八百四十字织就的智慧瑰宝
注射用盐酸氨溴索的正确用法是什么
网民更关注这些事!通过150个热点事件解析2024年度城市管理热门话题
生活当中危险的【羊群效应】:你是否一直跟着别人做盲目的决定?
这8个出游城市,浓缩了春天所有的美景,一个比一个惊艳!
防雾湿巾对眼镜片有无影响
色即是空,空即是色 那么何为“色”何为“空”
西方中世纪文学:意大利诗人但丁的生平和创作
莆田,一座“闹春”的城市
郑州ETC免费办理的地点在哪里?
Cell:揭开CRISPR-Cas10的全新抗病毒免疫机制——牺牲自我,保护集体
长期拉肚子会造成低血压么