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任务分析相关推荐

  1. BetaFlight模块设计之八:GPS任务分析

    BetaFlight模块设计之八:GPS任务分析 GPS任务 gpsUpdate函数分析 gpsNewData函数分析 gpsNewFrame函数分析 onGpsNewData 函数分析 基于Beta ...

  2. BetaFlight模块设计之七:LEDSTRIP任务分析

    BetaFlight模块设计之七:LEDSTRIP任务分析 1. LEDSTRIP任务 2. ledStripUpdate函数分析 2.1 StatusProfile 2.2 SimpleProfil ...

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

    BetaFlight模块设计之十:磁力计任务分析 磁力计任务 taskUpdateMag函数分析 compassUpdate函数分析 磁力计配置 基于BetaFlight开源代码框架简介的框架设计,逐 ...

  4. BetaFlight模块设计之二:SERIAL任务分析

    BetaFlight模块设计之二:SERIAL任务分析 SERIAL任务 1.总体情况 2.主要函数分析 2.1 taskHandleSerial任务 2.2 命令行处理函数cliProcess 2. ...

  5. BetaFlight模块设计之九:气压计任务分析

    BetaFlight模块设计之九:气压计任务分析 气压计任务 taskUpdateBaro气压计任务函数 baroUpdate气压计数据更新函数 气压计配置 基于BetaFlight开源代码框架简介的 ...

  6. BetaFlight模块设计之二十六:接收机任务分析

    BetaFlight模块设计之二十六:接收机任务分析 接收机任务 配置情况 硬件配置 软件配置 驱动配置 sbus驱动函数分析 sbusDataReceive函数 sbusFrameStatus函数 ...

  7. BetaFlight模块设计之十二:电传任务分析

    BetaFlight模块设计之十二:电传任务分析 电传任务 taskTelemetry任务分析 subTaskTelemetryPollSensors函数分析 telemetryProcess函数分析 ...

  8. BetaFlight模块设计之十七:pinioBox任务分析

    BetaFlight模块设计之十七:pinioBox任务分析 pinioBox任务 业务配置 硬件配置 pinioBoxUpdate任务分析 基于BetaFlight开源代码框架简介的框架设计,逐步分 ...

  9. BetaFlight模块设计之二十四:transponder任务分析

    BetaFlight模块设计之二十四:transponder任务分析 transponder任务 配置情况 硬件配置 驱动配置 业务配置 初始化 MSP协议 三种IR transponder type ...

  10. BetaFlight模块设计之三十五:RSSI信号强度链路稳定性分析

    BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析 1. RSSI信号强度 1.1 RSSI Value 1.2 RSSI dBm Value 2. 链路稳定性 3. RS ...

最新文章

  1. Mestasploit 客户端渗透
  2. 全球黑客盛会:2008年黑帽大会要闻摘要(2)
  3. 【GAN优化】如何选好正则项让你的GAN收敛
  4. (3)Node.js APIS
  5. caffe data层_Caffe Softmax层的实现原理?
  6. mac学python_新手小白学Python必备编程利器Pycharm快捷键大全(Win+Mac)
  7. 最少硬币找零系列问题(01背包,完全背包,多重背包动态规划)
  8. 【CCCC】L2-006 树的遍历 (25分),根据后序与中序遍历建立二叉树(我讨厌树,系列1)
  9. 【java读书笔记】——java开篇宏观把控 + HelloWorld
  10. 谷歌有情怀!谷歌开放大规模音频数据集 AudioSet
  11. 【TWVRP】基于matlab节约算法求解带时间窗的电动车路径规划问题【含Matlab源码 1169期】
  12. html编写注册页面
  13. 计算机毕业设计Java-ssm博物馆交流平台源码+系统+数据库+lw文档
  14. masm32基础使用(win10+cmd)
  15. 阿里云无影云桌面服务关联角色设置及删除方法
  16. mac打开airplay(隔空播放)
  17. 史上最简单的Linux内核IIO子系统入门demo_内核版本4.4.194
  18. 食物链(带权并查集)
  19. GIS毕业生经典笔试、面试题汇总(待续)
  20. 宝塔一个服务器创建多个站点

热门文章

  1. GMT、UTC、DST、CST时区
  2. 靠谱测试人员需要团队协作能力
  3. Bing必应来帮忙之-查询虚拟主机服务器上的同IP网站
  4. 苹果笔记本没有计算机管理员,Mac管理员账户丢失怎么办
  5. c语言 美元符号,汇编语言 美元符号
  6. 软考网络工程师备考建议【经验教训】
  7. css logo划一道光,[前端]纯css实现图片自动闪耀闪光划过效果css3特效logo | 尽享网...
  8. 反射+泛型+注解(demo)
  9. 架构系列---QR二维码和扫描二维码登陆原理
  10. arkit 人脸捕捉_iPhone X上的ARKit人脸追踪