打印
[牛人杂谈]

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

[复制链接]
264|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
classroom|  楼主 | 2025-4-9 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、位运算与布尔代数应用场景:寄存器配置、通信协议解析、硬件状态管理
数学原理:通过逻辑与(&)、或(|)、异或(^)及位移(<< / >>)实现位级操作,属于布尔代数的实际应用。
源码实例:// 位反转函数
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;
    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;
}
该实现通过离散化公式将连续系统转化为嵌入式可执行的迭代算法。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

469

主题

2664

帖子

2

粉丝