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

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于BetaFlight模块设计之四:ESC传感任务分析的主要内容,如果未能解决你的问题,请参考以下文章

BetaFlight深入传感设计:传感模块设计框架

BetaFlight深入传感设计:传感模块设计框架

BetaFlight模块设计之十:磁力计任务分析

BetaFlight深入传感设计之二:Mag传感模块

BetaFlight深入传感设计之二:Mag传感模块

BetaFlight深入传感设计之三:IMU传感模块