BetaFlight模块设计之十九:摄像头按键控制模拟任务分析
Posted lida2003
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BetaFlight模块设计之十九:摄像头按键控制模拟任务分析相关的知识,希望对你有一定的参考价值。
BetaFlight模块设计之十九:摄像头按键控制模拟任务分析
基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。
摄像头按键控制模拟任务
描述:主要通过摄像头OSD控制引线,使用PWM的方式模拟电压,从而触发摄像头内部配置菜单。
注:模拟按键触发,主要通过OSD菜单(processRcStickPositions)或者Telemetry MSP协议(mspProcessInCommand)进行处理。
├──> 初始化
│ ├──> [v]硬件初始化cameraControlInit
│ └──> [v]业务初始化pgResetFn_cameraControlConfig
├──> 任务
│ ├──> [x]实时任务
│ ├──> [x]事件任务
│ └──> [v]时间任务[TASK_CAMCTRL] = DEFINE_TASK("CAMCTRL", NULL, NULL, taskCameraControl, TASK_PERIOD_HZ(5), TASK_PRIORITY_LOW),
├──> 驱动
│ ├──> [x]查询
│ └──> [x]中断
└──> 接口
└──> void cameraControlKeyPress(cameraControlKey_e key, uint32_t holdDurationMs)
摄像头按键控制模拟原理
逻辑就是通过PWM占空比来模拟不同的电压输出来模拟摄像头原有控制板功能逻辑。
从技术实现角度和代码层面分析,摄像头模拟控制存在以下三种方式:
- CAMERA_CONTROL_MODE_HARDWARE_PWM // 硬件PWM方式采用占空比模拟按键
- CAMERA_CONTROL_MODE_SOFTWARE_PWM // STM32 F1 F3 F4支持软件模拟PWM;STM32 F7 H7 G4不支持
- CAMERA_CONTROL_MODE_DAC // 尚未实现(4.3版本)
函数分析
taskCameraControl
主任务确保只有在未解锁的情况下才可以模拟。
taskCameraControl
├──> <ARMING_FLAG(ARMED)>
│ └──> return
└──> cameraControlProcess
cameraControlProcess
按键模拟通常来说,大致有几个动作,而这个摄像头控制按键模拟比较简单,有些是不需要的:
- 【MUST】push (action)
- 【MUST】release (action)
- 【NO NEED】click = push + hold(a short period) + release
- 【NO NEED】double click
- 【NO NEED】long push = push + hold(a long period)
这里主要为了模拟一个按键释放的过程。
cameraControlProcess
└──> <endTimeMillis && currentTimeUs >= 1000 * endTimeMillis>
├──> <CAMERA_CONTROL_MODE_HARDWARE_PWM == cameraControlConfig()->mode>
│ └──> *cameraControlRuntime.channel.ccr = cameraControlRuntime.period; //周期到了恢复默认电平,模拟释放按键
├──> <CAMERA_CONTROL_MODE_SOFTWARE_PWM == cameraControlConfig()->mode>
│ └──> ;
└──> endTimeMillis = 0;
注:cameraControlKeyPress是通过PWM占空比来调整分压的电压值,从而模拟实际电阻按键分压板的效果。
以上是关于BetaFlight模块设计之十九:摄像头按键控制模拟任务分析的主要内容,如果未能解决你的问题,请参考以下文章