1、前言
前面两次我们成功的将PPM信号的读取、储存和油门处理完成了,这次我们要开始真正的控制无人机,首先我们要了解无人机前后,左右,旋转,升降的原理。
2、动作原理
引用:https://blog.csdn.net/weixin_35703797/article/details/52072105
我觉得他的博客讲的非常清晰,大家可以阅读以下。
我直接使用博主的结论:
*1号电机(前左)= 悬停油门 + 右倾的量 - 前飞的量 - 旋转的量
*2号电机(前右)= 悬停油门 - 右倾的量 - 前飞的量 + 旋转的量
*3号电机(后左)= 悬停油门 + 右倾的量 + 前飞的量 + 旋转的量
*4号电机(后右)= 悬停油门 - 右倾的量 + 前飞的量 - 旋转的量
3、程序设计
这里我预先加入了上锁解锁模式
/*****************************用于处理遥控器的命令和PID输出的综合控制程序**********************************
*2021.2.17 完成没有PID干预的遥控器四通道(前后,左右,油门,转向)的综合控制,采用数据帧不排序直接处理
*
*
*
*
*1号电机(前左)= 悬停油门 + 右倾的量 - 前飞的量 - 旋转的量
*2号电机(前右)= 悬停油门 - 右倾的量 - 前飞的量 + 旋转的量
*3号电机(后左)= 悬停油门 + 右倾的量 + 前飞的量 + 旋转的量
*4号电机(后右)= 悬停油门 - 右倾的量 + 前飞的量 - 旋转的量
**************/
/**
* 功能:将处理的数据控制电机
* 入口参数:
* 返回值:
*/
void DataOutput_ToMOT(uint8_t rc_lock)
{
if(rc_lock == 0)//已解锁
{
Rc.mot1 = Rc.THROTTLE+((int)Rc.ROLL-1500)-((int)Rc.PITCH-1500)-((int)Rc.YAW-1500);
Rc.mot2 = Rc.THROTTLE-((int)Rc.ROLL-1500)-((int)Rc.PITCH-1500)+((int)Rc.YAW-1500);
Rc.mot3 = Rc.THROTTLE+((int)Rc.ROLL-1500)+((int)Rc.PITCH-1500)+((int)Rc.YAW-1500);
Rc.mot4 = Rc.THROTTLE-((int)Rc.ROLL-1500)+((int)Rc.PITCH-1500)-((int)Rc.YAW-1500);
}
else
{
Rc.mot1=0;
Rc.mot2=0;
Rc.mot3=0;
Rc.mot4=0;
}
MOT_Control(Rc.mot1,Rc.mot2,Rc.mot3,Rc.mot4);
}
其实非常简单,MOT_Control就是我在stm32基础篇的PWM驱动无刷电机中使用的程序,只需要将处理好的数据写入电机对应的定时器即可。
这里我预留了一个全局变量rc_lock(0,解锁;1,上锁),我现在直接软件设定为0,默认解锁模式,后面我们为了安全,可以将rc_lock通过遥控器控制改变。比如辅助通道1接收到信号,rc_lock=0,再一次=1,之类的都可以。
4、总结
PPM信号控制无人机非常重要,我们要确保数据正确,及时。只有这样后期的PID才能正常发挥作用。所以PPM信号一定要正确。这就是我为什么将接收PPM信号设计为5Hz的原因,就像,PPM信号没有不要紧,顶多就是动作多做一会儿,有PID在把关,不会出现很大错误,但为了追求速度而导致PPM信号出错,炸机是小事,炸到人就是大事了。