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

基于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 //触发传输
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值