• 正文
    • 一、位运算与布尔代数
    • 二、定点数运算
    • 三、模运算与环形缓冲区
    • 四、线性代数与滤波算法
    • 五、数值分析与控制算法
  • 相关推荐
申请入驻 产业图谱

分享5种嵌入式开发常用的数学原理

03/26 11:06
503
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是专注分享职业规划/技术科普/智能生活有关原创文章的allen康哥。

今天介绍下嵌入式系统中常见的基础数学算法。嵌入式数学的核心在于将理论抽象转化为资源受限环境下的高效实现。

一、位运算与布尔代数

应用场景:寄存器配置、通信协议解析、硬件状态管理

数学原理:通过逻辑与(&)、或(|)、异或(^)及位移(<< / >>)实现位级操作,属于布尔代数的实际应用。源码实例:

// 位反转函数
unsigned int reverse_bits(unsigned int num) {
    unsigned int numOfBits = sizeof(num) * 8;
    unsigned int reverseNum = 0;
    for (unsigned int i = 0; i < numOfBits; i++) {
        if (num & (1 << i)) 
            reverseNum |= (1 << ((numOfBits - 1) - i));
    }
    return reverseNum;
}

此函数通过遍历每一位实现二进制逆序,常用于数据编码(如CRC校验)或特殊外设(如LED矩阵驱动)。

二、定点数运算

应用场景:无浮点单元(FPU)的MCU中实现小数运算(如电机控制传感器校准)

数学原理:将浮点数映射到整数空间,通过缩放因子(如Q格式)保留精度,本质是线性变换。

源码实例:

// 定点数乘法
typedef int16_t fixed_t;
#define FIXED_SHIFT 8
fixed_t fixed_multiply(fixed_t a, fixed_t b) {
    return (fixed_t)(((int32_t)a * (int32_t)b) >> FIXED_SHIFT);
}

该代码通过32位中间结果避免溢出,适用于温度补偿、PID控制器等需高效计算的场景。

三、模运算与环形缓冲区

应用场景:串口数据缓存、循环任务调度

数学原理:利用取模(%)操作实现索引循环,避免缓冲区越界。

源码实例:

#define BUFFER_SIZE 64
uint8_t buffer[BUFFER_SIZE];
uint8_t read_ptr = 0, write_ptr = 0;

void push_data(uint8_t data) {
    buffer[write_ptr % BUFFER_SIZE] = data;
    write_ptr++;
}

uint8_t pop_data() {
    uint8_t val = buffer[read_ptr % BUFFER_SIZE];
    read_ptr++;
    return val;
}

此结构在UART接收中断服务程序中广泛使用,确保数据流的连续性。

四、线性代数与滤波算法

应用场景:传感器信号去噪(如加速度计陀螺仪

数学原理:滑动平均滤波、卡尔曼滤波等均基于矩阵运算和统计学原理。

源码实例:

// 滑动平均滤波
#define WINDOW_SIZE 5
float moving_average(float new_sample) {
    static float samples[WINDOW_SIZE] = {0};
    static uint8_t index = 0;
    samples[index] = new_sample;
    index = (index + 1) % WINDOW_SIZE;
    
    float sum = 0;
    for (uint8_t i = 0; i < WINDOW_SIZE; i++) 
        sum += samples[i];
    return sum / WINDOW_SIZE;
}

此算法通过窗口内数据均值抑制高频噪声,常见于ADC采样后处理。

五、数值分析与控制算法

应用场景:电机调速、温度闭环控制

数学原理:PID控制器依赖积分(误差累积)、微分(误差变化率)的离散化计算。

源码实例:

typedef struct {
    float Kp, Ki, Kd;
    float integral;
    float prev_error;
} PIDController;

float pid_update(PIDController *pid, float setpoint, float actual) {
    float error = setpoint - actual;
    pid->integral += error;
    float derivative = error - pid->prev_error;
    pid->prev_error = error;
    return pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
}

该实现通过离散化公式将连续系统转化为嵌入式可执行的迭代算法。

你好,我是Allen,CSDN博客专家,博客访问超千万。现任世界500强外企高级开发工程师,有多年国企和外企工作经验,擅长电子及嵌入式方向学习规划,简历优化及offer咨询,高考/考研咨询等,欢迎留言与我交流!

点赞
收藏
评论
分享
加入交流群
举报

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录