1486 字
7 分钟
基于STM32的最小二乘法二次曲线拟合应用

硬件平台: STM32F4系列微控制器
开发工具: STM32CubeIDE, C语言
算法类型: 最小二乘法二次曲线拟合

背景概述#

在许多传感器应用中,精确度对系统的性能至关重要。然而,由于环境因素、传感器的固有误差或外部干扰,传感器采集的数据往往会发生偏移。为了矫正这些误差,我们通常需要通过标定过程来调整传感器输出,确保其数据的准确性。

对于计算机来说,标定过程中的曲线拟合通常很简单。然而,在嵌入式系统中,由于资源受限(如内存、计算能力等),尤其是在使用微控制器(如STM32)时,直接进行矩阵运算或者使用现成的拟合库并不总是可行。因此,我们需要设计一种适用于嵌入式环境的有效算法。

本文介绍了一种基于最小二乘法的二次曲线拟合方法,旨在通过STM32实现实时标定和曲线拟合,矫正传感器输出的误差。该方法不仅能提供高效的计算,还能够满足嵌入式系统的计算需求。


需求分析#

  1. 传感器标定: 在标定过程中,需要通过一组实际采集的数据与标准数据进行拟合,推导出传感器的修正曲线,以便矫正输出误差。

  2. 曲线拟合: 使用最小二乘法来拟合数据,这是一种优化方法,通过最小化误差平方和来得到最佳拟合曲线。目标是得到一个二次多项式

Y = a_0 + a_1 \cdot x + a_2 \cdot x^2 \

,其中 ( a_0, a_1, a_2 ) 是待定系数。

  1. 硬件实现: STM32作为一个性能优越的微控制器,具备DSP运算单元,适合用于实时计算和拟合。通过定制的最小二乘法算法,我们能够在没有复杂矩阵运算库的情况下实现二次曲线的拟合。

解决方案#

我们选择基于最小二乘法的二次多项式拟合算法来实现数据的标定。具体流程如下:

  1. 采集数据: 在现场采集传感器的实际输出和标准输出数据,取其中7个数据点进行拟合。

  2. 误差计算: 计算误差值,即标准输出减去实际采集到的输出。

  3. 最小二乘法拟合: 通过推导的二次曲线拟合公式,使用最小二乘法计算出待定系数 ( a_0, a_1, a_2 ),得到矫正函数。

  4. 在STM32中实现: 在STM32中通过手动计算的方式进行拟合,避免复杂的矩阵运算,适配嵌入式系统资源。算法实现采用了C语言,借助STM32的高效计算能力实现实时的曲线拟合。


算法实现#

  1. 标准和实际输入数据: 通过手动采集的传感器数据和标准数据进行处理。在MATLAB中验证过的标准数据和误差数据被带入STM32中进行相同的计算。

  2. 最小二乘法计算公式: 使用最小二乘法推导的代数公式计算待定系数。通过一系列代数求和和乘法操作,计算出系数 ( a_0 ), ( a_1 ), 和 ( a_2 ),然后构建二次多项式拟合函数。

  3. 在STM32中实现代码:

    void disposeHMI()
    {
        double b1=0, b2=0, b3=0, b4=0;
        double c1=0, c2=0, c3=0;
        double n = 7;
        double k = 0;
        unsigned char i;
    
        if (g_cUartData == 0xfe) {
            g_cUartData = 0;
            Bi = 0;
            delay_ms(200);
            Bi = 1;
    
            // 计算BCk系数
            for(i = 0; i < 7; i++) {
                b1 += g_dData[i]; 
                b2 += pow(g_dData[i], 2);
                b3 += pow(g_dData[i], 3);
                b4 += pow(g_dData[i], 4);
                c1 += g_dOut[i];
                c2 += g_dOut[i] * g_dData[i];
                c3 += g_dOut[i] * pow(g_dData[i], 2);
            }
    
            k = n * b2 * b4 + 2 * b1 * b2 * b3 - n * b3 * b3 - b1 * b1 * b4 - b2 * b2 * b2;
            
            // 计算系数a0, a1, a2
            a0 = ((b2 * b4 - b3 * b3) * c1 + (b2 * b3 - b1 * b4) * c2 + (b1 * b3 - b2 * b2) * c3) / k;
            a1 = ((b2 * b3 - b1 * b4) * c1 + (n * b4 - b2 * b2) * c2 + (b1 * b2 - n * b3) * c3) / k;
            a2 = ((b1 * b3 - b2 * b2) * c1 + (b1 * b2 - n * b3) * c2 + (n * b2 - b1 * b1) * c3) / k;
        }
    }

性能评估与优化#

  1. 运算效率: STM32的DSP单元可以高效地进行浮点运算,因此,即便是实时的数据拟合,性能也能得到保证。我们在计算过程中避免了矩阵运算,而是通过手动推导的代数公式计算系数,进一步减轻了计算负担。

  2. 实时性: 由于算法采用逐项累加的方式计算系数,且没有涉及大规模的矩阵运算,拟合过程非常高效,适合在嵌入式设备上进行实时处理。

  3. 精度: 虽然在资源有限的情况下使用了简化的算法,但通过最小二乘法的优化特性,拟合精度依然可以达到较高水平,满足传感器标定的要求。


结论#

本文介绍了基于STM32的最小二乘法二次曲线拟合方法,实现了传感器标定过程中数据的矫正。通过手动推导和简化的代数运算,我们在不依赖矩阵库的情况下成功实现了曲线拟合,适用于嵌入式设备中。该方法不仅提高了标定过程的效率,还能在资源有限的嵌入式平台上实时运行,为各种传感器应用提供了一个有效的解决方案。

未来的工作可以进一步优化算法的鲁棒性,并扩展到更复杂的曲线拟合任务,以适应更多类型的传感器和应用场景。


基于STM32的最小二乘法二次曲线拟合应用
https://hw.rscclub.website/posts/stm32zxecfsf/
作者
杨月昌
发布于
2018-12-16
许可协议
CC BY-NC-SA 4.0