我是靠谱客的博主 鲜艳小蝴蝶,最近开发中收集的这篇文章主要介绍IMU 加热,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

// 在此处设置引脚
void Util::set_imu_temp(float current)
{
#if HAL_HAVE_IMU_HEATER
    if (!heater.target || *heater.target == -1) {
        return;
    }

    // average over temperatures to remove noise
    heater.count++;
    heater.sum += current;
    
    // update once a second
    uint32_t now = AP_HAL::millis();
    if (now - heater.last_update_ms < 1000) {
#if defined(HAL_HEATER_GPIO_PIN)
        // output as duty cycle to local pin. Use a random sequence to
        // prevent a periodic change to magnetic field
        bool heater_on = (get_random16() < uint32_t(heater.output) * 0xFFFFU / 100U);
        hal.gpio->write(HAL_HEATER_GPIO_PIN, heater_on);
#endif
        return;
    }
    heater.last_update_ms = now;

    current = heater.sum / heater.count;
    heater.sum = 0;
    heater.count = 0;

    // experimentally tweaked for Pixhawk2
    const float kI = 0.3f;
    const float kP = 200.0f;
    float target = (float)(*heater.target);

    // limit to 65 degrees to prevent damage
    target = constrain_float(target, 0, 65);
    
    float err = target - current;

    heater.integrator += kI * err;
    heater.integrator = constrain_float(heater.integrator, 0, 70);

    heater.output = constrain_float(kP * err + heater.integrator, 0, 100);
    
    //hal.console->printf("integrator %.1f out=%.1f temp=%.2f err=%.2fn", heater.integrator, heater.output, current, err);

#if HAL_WITH_IO_MCU
    if (AP_BoardConfig::io_enabled()) {
        // tell IOMCU to setup heater
        iomcu.set_heater_duty_cycle(heater.output);
    }
#endif
#endif // HAL_HAVE_IMU_HEATER
}

最后

以上就是鲜艳小蝴蝶为你收集整理的IMU 加热的全部内容,希望文章能够帮你解决IMU 加热所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部