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

1. 芯片温度&参考电压监测任务(ADCINTERNAL)

描述:主要监控参考电压以及芯片温度。

 ├──> 初始化
 │   ├──> [v]硬件初始化adcInit/pgResetAll-pgResetFn_adcConfig
 │   └──> [v]业务初始化adcInternalInit
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [v]时间任务[TASK_ADC_INTERNAL] = DEFINE_TASK("ADCINTERNAL", NULL, NULL, adcInternalProcess, TASK_PERIOD_HZ(1), TASK_PRIORITY_LOWEST),
 ├──> 驱动
 │   ├──> [v]查询HAL_ADCEx_InjectedStart/HAL_ADCEx_InjectedPollForConversion
 │   └──> [x]中断
 └──> 接口
     ├──> uint16_t getVrefMv(void)
     └──> int16_t getCoreTemperatureCelsius(void)

主要函数分析:

adcInternalProcess
 ├──> adcInternalIsBusy //检查采样情况
 ├──> vrefintSample = adcInternalReadVrefint(); //获取参考电压adc数据
 ├──> tempsensorSample = adcInternalReadTempsensor(); //获取芯片温度adc数据
 ├──> adcVrefintValue = updateMovingAverageUint16(&adcVrefintAverageState, vrefintSample); //时间平滑处理
 ├──> adcTempsensorValue = updateMovingAverageUint16(&adcTempsensorAverageState, tempsensorSample); //时间平滑处理
 ├──> vrefMv = adcInternalCompensateVref(adcVrefintValue); //参考电压补偿
 ├──> coreTemperature = adcInternalComputeTemperature(adcTempsensorValue, vrefMv); //核心温度计算
 └──> adcInternalStartConversion //触发采样

注意:这两个参数在命令行status获取如下信息。

Entering CLI Mode, type 'exit' to return, or 'help'
# 
# Building AutoComplete Cache ... Done!
# 
# status
MCU F745 Clock=216MHz, Vref=3.29V, Core temp=41degC
Stack size: 2048, Stack address: 0x20010000
Config size: 3986, Max available config: 32768
Gyros detected: gyro 1
GYRO=ICM20689, ACC=ICM20689, BARO=BMP280
OSD: NONE
System Uptime: 31 seconds, Current Time: 2022-05-22T04:19:38.001+00:00
CPU:1%, cycle time: 125, GYRO rate: 8000, RX rate: 33, System rate: 9
Voltage: 1 * 0.01V (0S battery - NOT PRESENT)
I2C Errors: 2
SD card: Manufacturer 0x2, 1902592kB, 06/2011, v0.7, 'SA02G'
Filesystem: Ready
Arming disable flags: RXLOSS CLI MSP

2. 电池监测模块

描述:主要监测电池相关电压,电流以及尤其需要考虑的告警问题。

 ├──> 初始化
 │   ├──> [v]硬件初始化adcInit/pgResetAll-pgResetFn_adcConfig
 │   └──> [v]业务初始化batteryInit/validateAndFixConfig
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [v]时间任务
 │          [TASK_BATTERY_ALERTS] = DEFINE_TASK("BATTERY_ALERTS", NULL, NULL, taskBatteryAlerts, TASK_PERIOD_HZ(5), TASK_PRIORITY_MEDIUM)[TASK_BATTERY_VOLTAGE] = DEFINE_TASK("BATTERY_VOLTAGE", NULL, NULL, batteryUpdateVoltage, TASK_PERIOD_HZ(SLOW_VOLTAGE_TASK_FREQ_HZ), TASK_PRIORITY_MEDIUM)[TASK_BATTERY_CURRENT] = DEFINE_TASK("BATTERY_CURRENT", NULL, NULL, batteryUpdateCurrentMeter, TASK_PERIOD_HZ(50), TASK_PRIORITY_MEDIUM),
 ├──> 驱动
 │   ├──> [x]查询
 │   └──> [v]中断 DMA_CIRCULAR 
 └──> 接口
     ├──> uint16_t getBatteryVoltage(void)
	 ├──> uint8_t getBatteryCellCount(void)
	 ├──> batteryState_e getBatteryState(void)
	 ├──> const char * getBatteryStateString(void)
	 ├──> batteryState_e getVoltageState(void);
	 ├──> batteryState_e getConsumptionState(void);
	 ├──> uint8_t calculateBatteryPercentageRemaining(void);
	 ├──> bool isBatteryVoltageConfigured(void);
	 ├──> uint16_t getLegacyBatteryVoltage(void);
	 ├──> uint16_t getBatteryVoltageLatest(void);
	 ├──> uint16_t getBatteryAverageCellVoltage(void);
	 ├──> uint16_t getBatterySagCellVoltage(void);
	 ├──> bool isAmperageConfigured(void);
	 ├──> int32_t getAmperage(void);
	 ├──> int32_t getAmperageLatest(void);
	 └──> int32_t getMAhDrawn(void);

2.1 电压监测任务

batteryUpdateVoltage //ADC_BATTERY
 ├──> <VOLTAGE_METER_ESC>
 │   └──> <featureIsEnabled(FEATURE_ESC_SENSOR)>
 │       ├──> voltageMeterESCRefresh
 │       └──> voltageMeterESCReadCombined
 ├──> <VOLTAGE_METER_ADC>
 │   ├──> voltageMeterADCRefresh
 │   └──> voltageMeterADCRead
 └──> <VOLTAGE_METER_NONE>
     └──> voltageMeterReset

2.2 电流监测任务

batteryUpdateCurrentMeter //ADC_CURRENT
 ├──> <batteryCellCount == 0>
 │   └──> currentMeterReset
 ├──> <CURRENT_METER_ADC>
 │   ├──> currentMeterADCRefresh
 │   └──> currentMeterADCRead
 ├──> <CURRENT_METER_VIRTUAL> <USE_VIRTUAL_CURRENT_METER>
 │   ├──> currentMeterVirtualRefresh
 │   └──> currentMeterVirtualRead
 ├──> <CURRENT_METER_ESC> <USE_ESC_SENSOR> <featureIsEnabled(FEATURE_ESC_SENSOR)>
 │   ├──> currentMeterESCRefresh
 │   └──> currentMeterESCReadCombined
 ├──> <CURRENT_METER_MSP> <USE_MSP_CURRENT_METER>
 │   ├──> currentMeterMSPRefresh
 │   └──> currentMeterMSPRead
 └──> <CURRENT_METER_NONE>
     └──> currentMeterReset

2.3 电池告警任务

taskBatteryAlerts
 ├──> <!ARMING_FLAG(ARMED)> //飞行时,主电丢失场景
 │   └──> batteryUpdatePresence
 ├──> batteryUpdateStates
 │   ├──> batteryUpdateVoltageState
 │   ├──> batteryUpdateConsumptionState
 │   ├──> batteryUpdateLVC
 │   └──> batteryState = MAX(voltageState, consumptionState);
 └──> batteryUpdateAlarms
     └──> <batteryConfig()->useVBatAlerts>
         └──> updateBatteryBeeperAlert

3. 延伸阅读

【1】BetaFlight开源代码之电压校准
【2】BetaFlight开源代码之电流校准

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐