BetaFlight模块设计之三:芯片温度&参考电压和电池监测模块分析
BetaFlight模块设计之三:芯片温度&参考电压和电池监测模块分析1. 芯片温度&参考电压监测任务(ADCINTERNAL)2. 电池监测模块2.1 电压监测任务2.2 电流监测任务2.3 电池告警任务基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。1. 芯片温度&参考电压监测任务(ADCINTERNAL)描述:主要监控参考电压以及芯片温度
·
BetaFlight模块设计之三:芯片温度&参考电压和电池监测模块分析
基于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. 延伸阅读
更多推荐
已为社区贡献14条内容
所有评论(0)