BetaFlight模块设计之二十四:transponder任务分析

  • transponder任务
  • 配置情况
    • 硬件配置
    • 驱动配置
    • 业务配置
      • 初始化
      • MSP协议
      • 三种IR transponder type类型
  • 主要函数

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。

transponder任务

描述:主要是通过一个红外发射固定的一个红外编码。竞赛时,不同FC都有唯一编码,红外接收机通过识别唯一编码,给FC机型计时和打卡。

 ├──> 初始化│   ├──> [v]硬件初始化transponderInit(transponderIrInit/transponderIrInitArcitimer/transponderIrInitIlap/transponderIrInitERLT/transponderIrHardwareInit)│   └──> [x]业务初始化├──> 任务│   ├──> [x]实时任务│   ├──> [x]事件任务│   └──> [v]时间任务[TASK_TRANSPONDER] = DEFINE_TASK("TRANSPONDER", NULL, NULL, transponderUpdate, TASK_PERIOD_HZ(250), TASK_PRIORITY_LOW),├──> 驱动│   ├──> [x]查询│   └──> [x]中断└──> 接口├──> 支持MSP修改唯一标识码及应答机类型(ILAP/ARCITIMER/ERLT)├──> void transponderStartRepeating(void)└──> void transponderStopRepeating(void)

配置情况

硬件配置

Kakute F7从默认配置角度并不支持这个功能。

注:如果想要有这个功能,需要配置并整理出一个IO来做硬件驱动IR LED发射编码使用。

以下是默认配置支持transponder功能的机型。

./src/main/target/OMNIBUS/target.h:142:#define USE_TRANSPONDER
./src/main/target/NUCLEOH743/target.h:249:#define USE_TRANSPONDER
./src/main/target/NOX/target.h:115:#define USE_TRANSPONDER
./src/main/target/BEEBRAIN_V2F/target.h:106:#define USE_TRANSPONDER
./src/main/target/SPRACINGF4EVO/target.h:185:#define USE_TRANSPONDER
./src/main/target/OMNINXT/target.h:178:#define USE_TRANSPONDER
./src/main/target/ELINF722/target.h:118:#define USE_TRANSPONDER
./src/main/target/AG3X/target.h:154:#define USE_TRANSPONDER
./src/main/target/OMNIBUSF4/target.h:277:#define USE_TRANSPONDER
./src/main/target/NUCLEOH723ZG/target.h:235:#define USE_TRANSPONDER
./src/main/target/SPRACINGF3NEO/target.h:138:#define USE_TRANSPONDER
./src/main/target/BEEROTORF4/target.h:138:#define USE_TRANSPONDER
./src/main/target/NUCLEOF103RG/target.h:29:#undef USE_TRANSPONDER
./src/main/target/NUCLEOH7A3ZI/target.h:235:#define USE_TRANSPONDER
./src/main/target/SPRACINGF3EVO/target.h:160:#define USE_TRANSPONDER
./src/main/target/CLRACINGF4/target.h:127:#define USE_TRANSPONDER
./src/main/target/SPRACINGH7NANO/target.h:188:#define USE_TRANSPONDER
./src/main/target/REVO/target.h:335:#define USE_TRANSPONDER
./src/main/target/SPRACINGF7DUAL/target.h:185:#define USE_TRANSPONDER
./src/main/target/SPRACINGF4NEO/target.h:181:#define USE_TRANSPONDER
./src/main/target/STM32_UNIFIED/target.h:339:#define USE_TRANSPONDER
./src/main/target/NUCLEOH725ZG/target.h:244:#define USE_TRANSPONDER
./src/main/target/RG_SSD_F3/target.h:119:#define USE_TRANSPONDER
./src/main/target/SPRACINGH7EXTREME/target.h:173:#define USE_TRANSPONDER
./src/main/target/PYRODRONEF4/target.h:103:#define USE_TRANSPONDER
./src/main/target/FF_PIKOBLX/target.h:105:#define USE_TRANSPONDER
./src/main/target/SPRACINGF3MINI/target.h:171:#define USE_TRANSPONDER
./src/main/target/NUCLEOF303RE/target.h:139:#define USE_TRANSPONDER
./src/main/target/OMNIBUSF4FW/target.h:196:#define USE_TRANSPONDER
./src/main/target/EXF722DUAL/target.h:145:#define USE_TRANSPONDER
./src/main/target/FRSKYF3/target.h:117:#define USE_TRANSPONDER
./src/main/target/SPRACINGH7ZERO/target.h:191:#define USE_TRANSPONDER
./src/main/target/REVOLT/target.h:44:#define USE_TRANSPONDER

驱动配置

不同MCU对应的驱动有一些变化,这里给出了当前F3/F4/F7/H7/G4主控对应的驱动代码。

./make/source.mk:317:            drivers/transponder_ir_io_hal.c \
./make/mcu/STM32F7.mk:181:            drivers/transponder_ir_io_hal.c \
./make/mcu/STM32H7.mk:320:            drivers/transponder_ir_io_hal.c \
./make/mcu/STM32G4.mk:177:            drivers/transponder_ir_io_hal.c \
./make/source.mk:318:            drivers/transponder_ir_io_stdperiph.c \
./make/mcu/STM32F4.mk:183:            drivers/transponder_ir_io_stdperiph.c \
./make/mcu/STM32F3.mk:87:            drivers/transponder_ir_io_stdperiph.c \

业务配置

初始化

\src\main\io\transponder_ir.c
void pgResetFn_transponderConfig(transponderConfig_t *transponderConfig)
{RESET_CONFIG_2(transponderConfig_t, transponderConfig,.provider = TRANSPONDER_ILAP,.reserved = 0,.data = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0x0, 0x0, 0x0 }, // Note, this is NOT a valid transponder code, it's just for testing production hardware.ioTag = IO_TAG_NONE);transponderConfig->ioTag = timerioTagGetByUsage(TIM_USE_TRANSPONDER, 0);
}

MSP协议

\src\main\msp\msp_protocol.h
#define MSP_TRANSPONDER_CONFIG          82 //out message         Get transponder settings
#define MSP_SET_TRANSPONDER_CONFIG      83 //in message          Set transponder settings

三种IR transponder type类型

\src\main\io\transponder_ir.c
const transponderRequirement_t transponderRequirements[TRANSPONDER_PROVIDER_COUNT] = {{TRANSPONDER_ILAP, TRANSPONDER_DATA_LENGTH_ILAP, TRANSPONDER_TRANSMIT_DELAY_ILAP, TRANSPONDER_TRANSMIT_JITTER_ILAP},{TRANSPONDER_ARCITIMER, TRANSPONDER_DATA_LENGTH_ARCITIMER, TRANSPONDER_TRANSMIT_DELAY_ARCITIMER, TRANSPONDER_TRANSMIT_JITTER_ARCITIMER},{TRANSPONDER_ERLT, TRANSPONDER_DATA_LENGTH_ERLT, TRANSPONDER_TRANSMIT_DELAY_ERLT, TRANSPONDER_TRANSMIT_JITTER_ERLT}
};

主要函数

采用DMA方式进行IO电平变换,发送唯一红外编码。DMA控制器可以很好的确保不占用CPU资源,确保资源的有效利用。

transponderUpdate├──> <!(transponderInitialised && transponderRepeat && isTransponderIrReady())>│   └──> return  //硬件初始化(transponderInitialised),业务逻辑初始化(transponderRepeat),DMA忙状态(isTransponderIrReady)├──> <!(updateNow = (timeDelta_t)(currentTimeUs - nextUpdateAtUs) >= 0L)>│   └──> return  //未到下次更新时间├──> 更新Jitter时间,避开某些同步传输的问题├──> nextUpdateAtUs = currentTimeUs + transponderRequirements[provider - 1].transmitDelay + jitter; //规划下次执行transponder时间├──> <REDUCE_TRANSPONDER_CURRENT_DRAW_WHEN_USB_CABLE_PRESENT><usbCableIsInserted()>│   └──> nextUpdateAtUs = currentTimeUs + (1000 * 1000) / 10; // 10 hz.USB连接FC时,传输周期定义为10Hz└──> transponderIrTransmit //触发传输

BetaFlight模块设计之二十四:transponder任务分析相关推荐

  1. BetaFlight模块设计之二十:CMS菜单模块分析

    BetaFlight模块设计之二十:CMS菜单模块分析 CMS菜单模块 CMS菜单按键控制 CMS菜单Elements CMS_Menu OSD_Etnry Element类型 可调Element类型 ...

  2. BetaFlight模块设计之二十六:接收机任务分析

    BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...

  3. BetaFlight模块设计之二十九:滤波模块分析

    BetaFlight模块设计之二十九:滤波模块分析 滤波模块 滤波类型 1. slewFilter 2. simpleLowpassFilter 3. laggedMovingAverage 4. p ...

  4. PX4模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六:BatteryStatus模块 1. BatteryStatus模块简介 2. 模块入口函数 2.1 主入口battery_status_main 2.2 自定义子命令cust ...

  5. BetaFlight模块设计之二:SERIAL任务分析

    BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...

  6. BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三:Pid模块分析 Pid模块 1. Pid_audio子模块 2. Pid_init子模块 3. Pid算法子模块 3.1 TPA模式 3.2 飞行模式 3.3 L ...

  7. BetaFlight模块设计之三十五:RSSI信号强度链路稳定性分析

    BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析 1. RSSI信号强度 1.1 RSSI Value 1.2 RSSI dBm Value 2. 链路稳定性 3. RS ...

  8. BetaFlight模块设计之三十:Cli模块分析

    BetaFlight模块设计之三十:Cli模块分析 Cli模块 Cli接口 Cli框架 Cli命令结构 主要函数分析 cliProcess函数 processCharacterInteractive函 ...

  9. BetaFlight模块设计之三十二:MSP协议模块分析

    BetaFlight模块设计之三十二:MSP协议模块分析 1. MSP协议模块 1.1 MSP描述 1.2 MSP版本优缺点 1.3 MSP代码资源 2. MSP报文解析 2.1 MSP收包状态机 2 ...

最新文章

  1. RxJava repeat,repeatWhen,repeatUntil 的区别
  2. c语言数组最大元调换,c语言数组元素交换有关问题,请高手过来看看
  3. python流程控制语句-python语言的流程控制
  4. 在64位linux下编译32位程序
  5. swift中的@objc
  6. 探索Flutter_Image显示Webp逻辑
  7. Flex之嵌入外部资源
  8. 呼叫中心客服交流三大法宝
  9. 查找文章中出现频率最高的单词
  10. oracle 1亿条数据,如何在十分钟内插入1亿条记录到Oracle数据库?
  11. ZZULIOJ1010
  12. 区块链技术在“三资”监管领域的应用
  13. VS2017安装MSDN帮助文档
  14. NeoKylin7服务器操作系统安装
  15. 分式求二阶导数_第12讲 典型例题与练习参考解答:导数的基本运算法则与高阶导数...
  16. 如何显示电脑已连接的WiFi的密码
  17. element-ui表格合并数据相同行
  18. python库缺少pkg_resource_Python pkg_resources.ResourceManager方法代码示例
  19. 4种解决json日期格式问题的办法
  20. Android 11 正式版发布

热门文章

  1. oracle+并非所有变量,ORA-01008:并非所有变量都已绑定异常错误汇总解决方案
  2. 海贼王最大剧透!神预判,技术革新!
  3. 弗格森谈及董方卓称其透支 戏称盼足总杯切尔西上残阵
  4. 『开发』网页端展示深度学习模型|Gradio上手教程
  5. MXNet/Gluon 中 Triplet Loss 算法
  6. photoshop实例实战(入门级)教程
  7. Web页面开发之旅——HTML
  8. 【点灯鼠教程】K210裸机点灯之旅(1)点亮SSD1306【C开发I2C】
  9. xcode5真机调试教程 xcode5真机测试步骤
  10. 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想