码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 通过热敏电阻计算温度(二)---ODrive实现分析


    文章目录

    • 通过热敏电阻计算温度(二)---ODrive实现分析
      • 测量原理图
      • 计算分析
        • 计算拟合的多项式系数
        • 根据多项式方程计算温度的函数
        • 温度计算调用函数

    通过热敏电阻计算温度(二)—ODrive实现分析

    ODrive计算热敏电阻的温度采用的时B值的方式计算的。首先根据公式计算出一系列的温度和测量点电压比例的点,然后通过多项式拟合曲线,得到三阶多项式的系数。后面便可以通过此三阶多项式来求解温度数据

    测量原理图

    请添加图片描述
    ODrive板卡上使用的热敏电阻的型号为NCP15XH103F03RC,10KΩ,25-80℃的B值为3428

    计算分析

    计算拟合的多项式系数

    在tools->odrive->utils.py文件中有如下计算多项式系数的函数:

    def calculate_thermistor_coeffs(degree, Rload, R_25, Beta, Tmin, Tmax, thermistor_bottom = False, plot = False):
        import numpy as np
        T_25 = 25 + 273.15 #Kelvin
        temps = np.linspace(Tmin, Tmax, 1000)
        tempsK = temps + 273.15
    
        # https://en.wikipedia.org/wiki/Thermistor#B_or_%CE%B2_parameter_equation
        r_inf = R_25 * np.exp(-Beta/T_25)
        R_temps = r_inf * np.exp(Beta/tempsK)
        if thermistor_bottom:
            V = R_temps / (Rload + R_temps)
        else:
            V = Rload / (Rload + R_temps)
    
        fit = np.polyfit(V, temps, degree)
        p1 = np.poly1d(fit)
        fit_temps = p1(V)
    
        if plot:
            import matplotlib.pyplot as plt
            print(fit)
            plt.plot(V, temps, label='actual')
            plt.plot(V, fit_temps, label='fit')
            plt.xlabel('normalized voltage')
            plt.ylabel('Temp [C]')
            plt.legend(loc=0)
            plt.show()
    
        return p1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    np.linspace(start, stop, num)函数用于以均匀间隔创建对应num数的数值序列。
    np.polyfit(x,y,deg)函数用于对一组数据采用最小二乘法进行多项式拟合,返回值为多项式系数,deg表示多项式的阶数
    np.poly1d(c)c表示多项式系数,用于根据多项式系数生成多项式(这里介绍的是仅有一个参数的情况)

    根据多项式方程计算温度的函数

    在MotorControl->utils.hpp文件中根据多项式系数计算温度的函数

    // Evaluate polynomials in an efficient way
    // coeffs[0] is highest order, as per numpy.polyfit
    // p(x) = coeffs[0] * x^deg + ... + coeffs[deg], for some degree "deg"
    inline float horner_poly_eval(float x, const float *coeffs, size_t count) {
        float result = 0.0f;
        for (size_t idx = 0; idx < count; ++idx)
            result = (result * x) + coeffs[idx];
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    数组coeffs[4]存储了多项式的系数,coeffs[0]表示最高阶的系数。

    温度计算调用函数

    void ThermistorCurrentLimiter::update() {
        const float normalized_voltage = get_adc_relative_voltage_ch(adc_channel_);
        float raw_temperature_ = horner_poly_eval(normalized_voltage, coefficients_, num_coeffs_);
    
        constexpr float tau = 0.1f; // [sec]
        float k = current_meas_period / tau;
        float val = raw_temperature_;
        for (float& lpf_val : lpf_vals_) {
            lpf_val += k * (val - lpf_val);
            val = lpf_val;
        }
        if (is_nan(val)) {
            lpf_vals_.fill(0.0f);
        }
        temperature_ = lpf_vals_.back();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    normalized_voltage为根据adc的值转化过来的0-1之间的值。代入horner_poly_eval()函数可以的得到原始的温度数据。后面的部分是对温度数据的低通滤波处理。

  • 相关阅读:
    (免费分享)基于springboot,vue高校就业管理平台(带论文)
    数据结构实战开发教程(四)线性表的链式存储结构、单链表的具体实现、单链表的遍历与优化、典型问题分析(Bugfix)
    产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)
    支付官方解析
    Spring MVC文件上传
    网络安全(黑客)小白自学
    Cocos Creator3.8 项目实战(十)使用 protobuf详细教程
    react如何阻止父容器滚动
    Vue2源码学习笔记 - 20.渲染与编译—createComponent 创建组件VNode
    基于opencv的缺陷检测
  • 原文地址:https://blog.csdn.net/xiaoyuanwuhui/article/details/133994566
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号