[项目]基于FreeRTOS的STM32四轴飞行器: 十.检测遥控器

基于FreeRTOS的STM32四轴飞行器: 十.检测遥控器

一.检测遥控器连接逻辑

判断是否进入定高模式:

根据返回值判断遥控器的连接情况

实现检测函数:

因为该函数在通信任务中调度6ms一次,可以使用cnt进行计时,判断是否失联:

开头初始化 cnt 为200可以防止一启动没有连接显示连接成功的问题。

c 复制代码
/**
 * @description: 用来检测遥控器的连接情况
 *  连接成功:
 *      只要收到一条数据,就算连接成功
 *  失联:
 *      如果连续 1.2s 没有收到数据,表示失联
 * @param {Com_Status} isReceiveData 是否收到遥控器数据
 * @return {*}  是否连接成功
 */
Com_Status App_Communication_CheckConnection(Com_Status isReceiveData)
{                             /* 记录连续收不到数据的次数 */
    static uint8_t cnt = 200; /* 初始化为200可以防止一启动时候,没有连接成功显示连接成功问题*/
    /* 1. 如果收到数据,表示连接成功 */
    if(isReceiveData == Com_OK)
    {
        cnt = 0;
        return Com_OK;
    }

    /* 2. 表示没有收到数据: 计时, 连续200次(1.2s) */
    cnt++;
    if(cnt >= 200)
    {
        cnt = 200; /* 避免溢出 */
        return Com_FAIL;
    }

    return Com_OK;
}

二.遥控器的解锁情况

创建一个状态机进行状态转换。

c 复制代码
/**
 * @description: 遥控器的解锁
 *  把油门拉到最高,持续1s,然后再拉到最低,持续1s, 解锁成功.
 *
 *   自由状态
 *       在此状态, 如果油门拉到最高(>=960), 进入  最大值附近 状态
 *   最大值附近
 *       如果油门持续时间超过1s ,离开最大值状态
 *       如果在这里持续时间不到1s, 退回到 自由状态
 *   离开最大值
 *       如果出现油门 <=20, 进入最小值附近
 *   最小值附近
 *       如果持续时间大于1s, 进入解锁状态
 *       如果持续时间不到1s, 进入自由状态
 *   解锁
 *
 *
 *
 *
 * @param {Com_Status} isRemoteConnected 是否连接成功
 * @return {*} 是否解锁成功 Com_OK 解锁成功  其他 解锁失败
 */
Com_Status App_Communication_RemoteUnlock(Com_Status isRemoteConnected)
{
    /* 油门在最大值和最小值附近的持续时间 */
    static uint8_t thrMaxDuration = 0;
    static uint8_t thrMinDuration = 0;
    /* 定义油门的状态 */
    static Com_RemoteStatus remoteStatus = THR_FREE;

    /* 1. 如果失联状态, 直接解锁失败 */
    if(isRemoteConnected != Com_OK)
    {
        remoteStatus         = THR_FREE;
        joyStick.isFixHeight = 0;
        isFixHeight          = Com_FAIL;
        return Com_FAIL;
    }

    switch(remoteStatus)
    {
        case THR_FREE:
        {
            /* 在自由状态, 最大值和最小值附近持续时间从0计数 */
            thrMaxDuration = 0;
            thrMinDuration = 0;
            if(joyStick.THR >= 960)
            {
                remoteStatus = THR_MAX;
            }
            break;
        }
        case THR_MAX:
        {
            if(joyStick.THR >= 960)
            {
                /* 判断持续时间 */
                thrMaxDuration++;
                if(thrMaxDuration >= 200)
                {
                    remoteStatus = THR_MAX_LEAVE;
                }
            }
            else
            {
                /* 证明在最大值附近没有坚持1.2s */
                remoteStatus = THR_FREE; /* 回到自由状态 */
            }
            break;
        }
        case THR_MAX_LEAVE:
        {
            if(joyStick.THR <= 20)
            {
                remoteStatus = THR_MIN;
            }
            break;
        }
        case THR_MIN:
        {
            if(joyStick.THR <= 20)
            {
                thrMinDuration++;
                if(thrMinDuration >= 200)
                {
                    remoteStatus = THR_UNLOCK;
                }
            }
            else
            {
                remoteStatus = THR_FREE;
            }
            break;
        }
        case THR_UNLOCK:
        {
            /* 如果解锁状态下,油门长时间(1min) <=20, 马上锁定 */
            static uint32_t lowDuration = 0;
            if(joyStick.THR <= 20)
            {
                lowDuration++;
                if(lowDuration >= 200 * 50)
                {
                    remoteStatus = THR_FREE;
                    lowDuration  = 0;
                }
            }
            else
            {
                lowDuration = 0;
            }

            /* 解锁成功, 直接返回成功 */
            return Com_OK;
        }

        default:
            break;
    }

    joyStick.isFixHeight = 0;
    isFixHeight          = Com_FAIL;
    /* 默认返回解锁失败 */
    return Com_FAIL;
}

三.遥控器控制飞机运转

创建飞机飞行的函数。

c 复制代码
/**
 * @description: 让飞机工作(飞行)
 * @param {Com_Status} isRemoteUnlock
 * @return {*}
 */
void App_Flight_Work(Com_Status isRemoteUnlock)
{
    if (isRemoteUnlock != Com_OK || joyStick.THR <= 30)
    {
        motorLeftTop.speed =
            motorLeftBottom.speed =
                motorRightTop.speed =
                    motorRightBottom.speed = 0;
    }

    Inf_Motor_AllMotorsWork();
}

解决遥控器开机直接解锁 的bug:

如果失联将状态变为FREE

相关推荐
恒锐丰小瑞11 小时前
率能SS8841T 40V/2.5A/双通道H桥驱动芯片,PWM控制接口与低导通电阻(350mΩ),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·机器人
zcmodeltech12 小时前
钢铁冶金沙盘模型控制系统设计与实现:高炉-连铸-热轧多工序联动方案
分布式·stm32·单片机·嵌入式硬件·交互
徽京人13 小时前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
QH1392923188014 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
笨笨饿15 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim
捷瑞电子工坊15 小时前
FreeRTOS事件组:多任务同步的利器
stm32·嵌入式·freertos·实时操作系统·标准外设库·事件组·任务同步
笨笨饿17 小时前
#109_BK7258 蓝牙 A2DP 音频数据通路深度解析
python·stm32·单片机·mcu·物联网·编辑器·音视频
千秋岁rr17 小时前
5.0 TIM
单片机·嵌入式硬件
qq_4017004117 小时前
ADC基准电压与参考电压详细解读:以STM32和28335为例
stm32·单片机·嵌入式硬件
小僧景贤18 小时前
STM32 startup.s 启动文件与 .map 映射文件深度技术解析(md/hd 版本差异化对比)
stm32·内存映射·startup.s·map 文件·单片机启动流程