BetaFlight模块设计之十一:GyroAcc任务分析
BetaFlight模块设计之十一:Gyro&Acc任务分析
- IMU硬件配置
- Gyro任务
- taskGyroSample函数分析
- gyroUpdate函数分析
- Acc任务
- taskUpdateAccelerometer函数分析
- accUpdate函数分析
基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。
IMU硬件配置
KAKUTEF7 AIO硬件配置,详见\src\main\target\KAKUTEF7\target.h; 手头的板子是ICM20689硬件。
#define USE_ACC
#define USE_GYRO
#define USE_EXTI// ICM-20689
#define USE_ACC_SPI_ICM20689
#define USE_GYRO_SPI_ICM20689
#define GYRO_1_CS_PIN SPI4_NSS_PIN
#define GYRO_1_SPI_INSTANCE SPI4
#define GYRO_1_ALIGN CW270_DEG#define USE_GYRO_EXTI
#define GYRO_1_EXTI_PIN PE1
#define USE_MPU_DATA_READY_SIGNAL
Gyro任务
描述:主要获取x,y,z方向gyroADC值。
├──> 初始化│ ├──> [v]硬件初始化gyroDetect(icm20689SpiGyroDetect)/mpuDetect(icm20689SpiDetect)/gyroDetectSensor()/gyroPreInit│ └──> [v]业务初始化pgResetFn_gyroConfig/gyroInit├──> 任务│ ├──> [v]实时任务[TASK_GYRO] = DEFINE_TASK("GYRO", NULL, NULL, taskGyroSample, TASK_GYROPID_DESIRED_PERIOD, TASK_PRIORITY_REALTIME),│ ├──> [x]事件任务│ └──> [x]时间任务├──> 驱动│ ├──> [v]查询mpuGyroRead│ └──> [x]中断└──> 接口├──> void dynLpfGyroUpdate(float throttle);├──> float dynThrottle(float throttle);├──> void initYawSpinRecovery(int maxYawRate);├──> uint16_t gyroAbsRateDps(int axis);├──> bool gyroYawSpinDetected(void);├──> bool gyroOverflowDetected(void);├──> void gyroReadTemperature(void);├──> int16_t gyroGetTemperature(void);├──> bool isFirstArmingGyroCalibrationRunning(void);├──> void gyroStartCalibration(bool isFirstArmingCalibration);├──> FAST_CODE bool gyroFilterReady(void)└──> FAST_CODE bool pidLoopReady(void)
taskGyroSample函数分析
这里activePidLoopDenom和pidUpdateCounter主要把gyroFilter和pidLoop两个时间片分开来缓解MCU压力。STM32F1只有STM32F7的1/8。
taskGyroSample├──> gyroUpdate├──> <pidUpdateCounter % activePidLoopDenom == 0> //│ └──> pidUpdateCounter = 0;└──> pidUpdateCounter++;
注:配置PID_PROCESS_DENOM_DEFAULT,详见:\src\main\flight\pid.c
#if defined(STM32F1)
#define PID_PROCESS_DENOM_DEFAULT 8
#elif defined(STM32F3)
#define PID_PROCESS_DENOM_DEFAULT 4
#elif defined(STM32F411xE) || defined(STM32G4) //G4 sometimes cpu overflow when PID rate set to higher than 4k
#define PID_PROCESS_DENOM_DEFAULT 2
#else
#define PID_PROCESS_DENOM_DEFAULT 1
#endif
gyroUpdate函数分析
gyroUpdate├──> <GYRO_CONFIG_USE_GYRO_1>│ ├──> gyroUpdateSensor(&gyro.gyroSensor1);│ └──> <isGyroSensorCalibrationComplete(&gyro.gyroSensor1)>│ └──> 更新gyro.gyroADC[X],gyro.gyroADC[Y],gyro.gyroADC[Z]├──> <USE_MULTI_GYRO><GYRO_CONFIG_USE_GYRO_2>│ ├──> gyroUpdateSensor(&gyro.gyroSensor2);│ └──> <isGyroSensorCalibrationComplete(&gyro.gyroSensor2)>│ └──> 更新gyro.gyroADC[X],gyro.gyroADC[Y],gyro.gyroADC[Z]├──> <USE_MULTI_GYRO><GYRO_CONFIG_USE_GYRO_BOTH>│ ├──> gyroUpdateSensor(&gyro.gyroSensor1);│ ├──> gyroUpdateSensor(&gyro.gyroSensor2);│ └──> <isGyroSensorCalibrationComplete gyroSensor1 && gyroSensor1>│ └──> 根据权重更新gyro.gyroADC[X],gyro.gyroADC[Y],gyro.gyroADC[Z]├──> <using gyro lowpass 2 filter for downsampling>│ └──> lowpass2FilterApplyFn, gyro.sampleSum[X], gyro.sampleSum[Y], gyro.sampleSum[Z]└──> <using simple averaging for downsampling>└──> gyro.sampleCount++; gyro.sampleSum[X], gyro.sampleSum[Y], gyro.sampleSum[Z]
Acc任务
描述:主要获取x,y,z方向accADC值。
├──> 初始化│ ├──> [v]硬件初始化accDetect(icm20689SpiAccDetect)/mpuDetect(icm20689SpiDetect)│ └──> [v]业务初始化pgResetFn_accelerometerConfig/accInit├──> 任务│ ├──> [x]实时任务│ ├──> [x]事件任务│ └──> [v]时间任务[TASK_ACCEL] = DEFINE_TASK("ACC", NULL, NULL, taskUpdateAccelerometer, TASK_PERIOD_HZ(1000), TASK_PRIORITY_MEDIUM),├──> 驱动│ ├──> [v]查询mpuAccReadSPI│ └──> [x]中断└──> 接口└──> bool accGetAccumulationAverage(float *accumulationAverage)
taskUpdateAccelerometer函数分析
这个函数太简洁了,貌似都感觉应该直接用accUpdate;不过这里的问题是任务通用函数格式与accUpdate不一样,所以有了一个转换。
注:从设计的角度,如果能够整理抽取一个private data指针指向任务各自特殊的数据区(通常OS会这么做),就更加简洁明了。
taskUpdateAccelerometer└──> accUpdate(currentTimeUs, &accelerometerConfigMutable()->accelerometerTrims);
accUpdate函数分析
这里的数据主要是采集获取,并未涉及到使用,所以整体结构比较清楚和容易理解。
accUpdate├──> <!acc.dev.readFn(&acc.dev)>│ └──> return├──> acc.isAccelUpdatedAtLeastOnce = true;├──> 赋值acc.accADC[axis] = acc.dev.ADCRaw[axis];├──> <accelerationRuntime.accLpfCutHz>│ └──> 滤波acc.accADC[axis] = biquadFilterApply(&accelerationRuntime.accFilter[axis], acc.accADC[axis]);├──> <ALIGN_CUSTOM>│ └──> alignSensorViaMatrix(acc.accADC, &acc.dev.rotationMatrix);├──> <其他acc.dev.accAlign>│ └──> alignSensorViaRotation(acc.accADC, acc.dev.accAlign);├──> <!accIsCalibrationComplete()>│ └──> performAcclerationCalibration(rollAndPitchTrims);├──> <featureIsEnabled(FEATURE_INFLIGHT_ACC_CAL)>│ └──> performInflightAccelerationCalibration(rollAndPitchTrims);├──> applyAccelerationTrims(accelerationRuntime.accelerationTrims);└──> 累计测量值更新├──> ++accelerationRuntime.accumulatedMeasurementCount;└──> accelerationRuntime.accumulatedMeasurements[axis] += acc.accADC[axis];
BetaFlight模块设计之十一:GyroAcc任务分析相关推荐
- BetaFlight模块设计之八:GPS任务分析
BetaFlight模块设计之八:GPS任务分析 GPS任务 gpsUpdate函数分析 gpsNewData函数分析 gpsNewFrame函数分析 onGpsNewData 函数分析 基于Beta ...
- BetaFlight模块设计之七:LEDSTRIP任务分析
BetaFlight模块设计之七:LEDSTRIP任务分析 1. LEDSTRIP任务 2. ledStripUpdate函数分析 2.1 StatusProfile 2.2 SimpleProfil ...
- BetaFlight模块设计之十:磁力计任务分析
BetaFlight模块设计之十:磁力计任务分析 磁力计任务 taskUpdateMag函数分析 compassUpdate函数分析 磁力计配置 基于BetaFlight开源代码框架简介的框架设计,逐 ...
- BetaFlight模块设计之二:SERIAL任务分析
BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...
- BetaFlight模块设计之九:气压计任务分析
BetaFlight模块设计之九:气压计任务分析 气压计任务 taskUpdateBaro气压计任务函数 baroUpdate气压计数据更新函数 气压计配置 基于BetaFlight开源代码框架简介的 ...
- BetaFlight模块设计之二十六:接收机任务分析
BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...
- BetaFlight模块设计之十二:电传任务分析
BetaFlight模块设计之十二:电传任务分析 电传任务 taskTelemetry任务分析 subTaskTelemetryPollSensors函数分析 telemetryProcess函数分析 ...
- BetaFlight模块设计之十七:pinioBox任务分析
BetaFlight模块设计之十七:pinioBox任务分析 pinioBox任务 业务配置 硬件配置 pinioBoxUpdate任务分析 基于BetaFlight开源代码框架简介的框架设计,逐步分 ...
- BetaFlight模块设计之二十四:transponder任务分析
BetaFlight模块设计之二十四:transponder任务分析 transponder任务 配置情况 硬件配置 驱动配置 业务配置 初始化 MSP协议 三种IR transponder type ...
- BetaFlight模块设计之三十五:RSSI信号强度链路稳定性分析
BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析 1. RSSI信号强度 1.1 RSSI Value 1.2 RSSI dBm Value 2. 链路稳定性 3. RS ...
最新文章
- Mestasploit 客户端渗透
- 全球黑客盛会:2008年黑帽大会要闻摘要(2)
- 【GAN优化】如何选好正则项让你的GAN收敛
- (3)Node.js APIS
- caffe data层_Caffe Softmax层的实现原理?
- mac学python_新手小白学Python必备编程利器Pycharm快捷键大全(Win+Mac)
- 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)
- 【CCCC】L2-006 树的遍历 (25分),根据后序与中序遍历建立二叉树(我讨厌树,系列1)
- 【java读书笔记】——java开篇宏观把控 + HelloWorld
- 谷歌有情怀!谷歌开放大规模音频数据集 AudioSet
- 【TWVRP】基于matlab节约算法求解带时间窗的电动车路径规划问题【含Matlab源码 1169期】
- html编写注册页面
- 计算机毕业设计Java-ssm博物馆交流平台源码+系统+数据库+lw文档
- masm32基础使用(win10+cmd)
- 阿里云无影云桌面服务关联角色设置及删除方法
- mac打开airplay(隔空播放)
- 史上最简单的Linux内核IIO子系统入门demo_内核版本4.4.194
- 食物链(带权并查集)
- GIS毕业生经典笔试、面试题汇总(待续)
- 宝塔一个服务器创建多个站点
热门文章
- GMT、UTC、DST、CST时区
- 靠谱测试人员需要团队协作能力
- Bing必应来帮忙之-查询虚拟主机服务器上的同IP网站
- 苹果笔记本没有计算机管理员,Mac管理员账户丢失怎么办
- c语言 美元符号,汇编语言 美元符号
- 软考网络工程师备考建议【经验教训】
- css logo划一道光,[前端]纯css实现图片自动闪耀闪光划过效果css3特效logo | 尽享网...
- 反射+泛型+注解(demo)
- 架构系列---QR二维码和扫描二维码登陆原理
- arkit 人脸捕捉_iPhone X上的ARKit人脸追踪