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传感任务分析的主要内容,如果未能解决你的问题,请参考以下文章