jake tang 2023-10-08 11:37 采纳率: 25%
浏览 19
已结题

离轴编码器线性插值问题

使用线性插值法解决离轴编码器线性度差 间隔固定角度读取编码器值是发现编码出现类似于齿槽的波浪形波动 并且在补偿后也出来了波动 电机旋转是感觉有何补偿后波动相同的抖动

img

采样方法是给d轴一个电压 间隔同样时间增加固定的角度 然后读取编码器的返回值 建表

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-08 11:40
    关注

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    一种解决离轴编码器线性度差的方法是使用线性插值法。线性插值法可以通过已知的两个数据点来估计两点之间的数据值。首先,你需要获取足够的采样点,并存储在一个表格中。

    假设你的数据表格中包含了编码器读数和对应的角度。下面是一个简单的示例:

    #define MAX_SAMPLES 100
    
    typedef struct {
        int encoderValue;
        float angle;
    } Sample;
    
    Sample samples[MAX_SAMPLES];
    
    void addSample(int index, int encoderValue, float angle) {
        samples[index].encoderValue = encoderValue;
        samples[index].angle = angle;
    }
    
    int findClosestSample(float targetAngle) {
        int i;
    
        // 从数据表中找到最接近目标角度的两个样本
        for (i = 0; i < MAX_SAMPLES - 1; i++) {
            if (targetAngle >= samples[i].angle && targetAngle < samples[i+1].angle) {
                return i;
            }
        }
    
        return -1;  // 如果找不到符合条件的相邻样本,返回-1
    }
    
    float linearInterpolation(float targetAngle) {
        int index = findClosestSample(targetAngle);
    
        if (index != -1) {
            float x0 = samples[index].angle;
            float x1 = samples[index+1].angle;
            int y0 = samples[index].encoderValue;
            int y1 = samples[index+1].encoderValue;
    
            // 使用线性插值公式计算目标角度对应的编码器值
            return y0 + (targetAngle - x0) * (y1 - y0) / (x1 - x0);
        } else {
            return 0;  // 如果找不到相邻样本,返回0或其他默认值
        }
    }
    

    在上述代码中,addSample函数用于向数据表中添加样本。findClosestSample函数用于找到最接近目标角度的两个样本,返回较小的样本的索引。linearInterpolation函数用于进行线性插值计算,返回目标角度对应的编码器值。

    你可以在设置好采样点和角度的数据表格中,按照一定的步长逐步增加角度,如给d轴一个电压,然后进行数据采样和补偿。然后,使用线性插值法来估计任意角度的编码器值。

    希望这个解决方案能帮到你。不过需要注意的是,这只是一种简单的线性插值方法,实际应用中可能还需要考虑更复杂的情况和算法。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 关于#c++#的问题:(2)运算二叉树·表达式一般由一个运算符和两个操作数组成:(相关搜索:二叉树遍历)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)