BetaFlight模块设计之四:ESC传感任务分析

BetaFlight模块设计之四:ESC传感任务分析

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

ESC传感任务escSensorProcess

描述:主要实时更新ESC的温度、电压、电流、功耗,以及RPM转速信息。

模块整体情况

 ├──> 初始化
 │   ├──> [v]硬件初始化escSensorInit/targetConfiguration
 │   └──> [x]业务初始化motorDevInit/pgResetFn_motorConfig
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [x]时间任务[TASK_ESC_SENSOR] = DEFINE_TASK("ESC_SENSOR", NULL, NULL, escSensorProcess, TASK_PERIOD_HZ(100), TASK_PRIORITY_LOW),
 ├──> 驱动
 │   ├──> [x]查询
 │   └──> [v]中断escSensorDataReceive
 └──> 接口
     └──> escSensorData_t *getEscSensorData(uint8_t motorNumber)

任务状态机

escSensorProcess
 ├──> <!escSensorPort || !motorIsEnabled()>
 ├──> <ESC_SENSOR_TRIGGER_STARTUP>
 │   └──> <currentTimeMs >= ESC_BOOTTIME>
 │       └──> escSensorTriggerState = ESC_SENSOR_TRIGGER_READY;
 ├──> <ESC_SENSOR_TRIGGER_READY>
 │   ├──> startEscDataRead(telemetryBuffer, TELEMETRY_FRAME_SIZE);
 │   ├──> motorDmaOutput_t * const motor = getMotorDmaOutput(escSensorMotor);
 │   ├──> motor->protocolControl.requestTelemetry = true;
 │   └──> escSensorTriggerState = ESC_SENSOR_TRIGGER_PENDING;
 └──> <ESC_SENSOR_TRIGGER_PENDING>
     ├──> <currentTimeMs < escTriggerTimestamp + ESC_REQUEST_TIMEOUT> // ESC_REQUEST_TIMEOUT=100ms
     │   ├──> decodeEscFrame
     │   ├──> <ESC_SENSOR_FRAME_COMPLETE>
     │   │   ├──> selectNextMotor
     │   │   └──> escSensorTriggerState = ESC_SENSOR_TRIGGER_READY;
     │   ├──> <ESC_SENSOR_FRAME_FAILED>
     │   │   ├──> increaseDataAge
     │   │   ├──> selectNextMotor
     │   │   └──> escSensorTriggerState = ESC_SENSOR_TRIGGER_READY;
     │   └──> <ESC_SENSOR_FRAME_PENDING>
     │       └──> // wait another round
     └──> <something wrong, Move on to next ESC> // TASK_PERIOD_HZ(100), 10ms
         ├──> increaseDataAge
         ├──> selectNextMotor
         └──> escSensorTriggerState = ESC_SENSOR_TRIGGER_READY;

ESC报文解析

decodeEscFrame
 ├──> <!isFrameComplete()>
 │   └──> return ESC_SENSOR_FRAME_PENDING
 ├──> <telemetry sum != crc checksum>
 │   └──> return ESC_SENSOR_FRAME_FAILED
 ├──> update escSensorData
 │   ├──> escSensorData[escSensorMotor].dataAge = 0;
 │   ├──> escSensorData[escSensorMotor].temperature = telemetryBuffer[0];
 │   ├──> escSensorData[escSensorMotor].voltage = telemetryBuffer[1] << 8 | telemetryBuffer[2];
 │   ├──> escSensorData[escSensorMotor].current = telemetryBuffer[3] << 8 | telemetryBuffer[4];
 │   ├──> escSensorData[escSensorMotor].consumption = telemetryBuffer[5] << 8 | telemetryBuffer[6];
 │   ├──> escSensorData[escSensorMotor].rpm = telemetryBuffer[7] << 8 | telemetryBuffer[8];
 │   └──> combinedDataNeedsUpdate = true;  // 标志混合数据需要更新
 └──> return ESC_SENSOR_FRAME_COMPLETE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值