舵机的梯形加减速控制
创作时间:
作者:
@小白创作中心
舵机的梯形加减速控制
引用
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);
}
热门推荐
合同附加条款:法律实务中的重要性与适用原则
这届年轻人,腰已经不行了?
原材料价格继续上涨,燃油车也扛不住了!
法律是怎样规定试用期间的工资的
密蒙花的功效与作用 密蒙花的用法用量
密蒙花的功效与作用 密蒙花的用法用量
黄芪配茶叶:传统养生法,简单又实用
诺如病毒高发期:科学认知与有效预防
将伦理思入现实|应用伦理的学科建设与自主知识体系构建
如何提升引体向上数量?4个步骤让你完成更多引体向上
印尼电商市场高速增长!揭秘出海商机及促销选品技巧
强直性脊柱炎患者的髋关节病变:为什么如此重要?
上学看户口还是看籍贯:探究我国教育资源分配的纠结问题
团圆相聚,WiFi卡顿?这份提速秘籍请收好
公司治理与公司管理的区别
如何查询案件进展?
利用数据分析增强营销洞察力
管仲与鲍叔牙——"管鲍之交"
运输振动试验方法及步骤详解:确保产品在运输过程中的稳定性
客服主管需要具备哪些核心素养?
《裴将军宅芦管歌》创作背景是什么?该如何赏析呢?
Nature Medicine :破解医学影像数据稀缺——生成式AI的全新突破
履行社会责任:普通人如何影响和改变世界
保时捷收购大众的原因是什么?
如何逐步修复Windows中的错误43
《哪吒之魔童闹海》票房成功,原因离不开这九点!
汉唐之间的世界:中国和欧洲沉沦,波斯最强,印度文化盛极一时
电子科技大学新校区将于2025年招生!4个校区有何区别?
南唐后主李煜:从亡国之君到词坛巨匠
2025必看!6斤被子对应温度,舒适睡眠密码!