光栅编码器闭环运动重复定位时偶尔出现20um误差原因分析

  • 用的光栅尺栅距是20um,误差刚好是一个栅距,要么尺子有问题,要么计算错误,重复运动同一个位置,不是每次都出错,很显然是计算错误。
  • 当出现误差时读取此时用于计算的光栅信号sincos数据,用matlab plot一下,选取了三张比较常见的错误数据的图像。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 从图1-图3可以看出参与计算的sincos数据出现了坏点,看起来有数据丢了,才会出现红色框中那种不规则图形。
  • 那么造成这种丢数据的原因是什么?
    首先理清整个系统的框架,每个环节数据是怎么交换的。
    我的系统数据交换如下图。定位平台控制器有3路,XYZ,图中的X代表X路,还有YZ路都是一样的。X部分是从机,这个从机比较忙,有2个SPI,1个UART和三方面进行数据传输。
    在这里插入图片描述

问题分析分两个方向,一是硬件,二是软件。
硬件方面
1、梳理系统中的数据传输线,有哪些传输总线,他们在PCB上是如何走线的。我的系统中输出传输总线有USB、485、SPI、UART。USB用作虚拟串口,理论上速度是USB2.0的速度12Mbps,实际上没那么快,但也比普通串口快很多。485速率是2250000bps,也挺快的。他俩离X路都挺近的,第一回合猜测是来自USB,485的干扰。切割PCB走线把他们断开用飞线绕成双绞线连接,让他们离X路远一点。测试发现问题依旧,那不是他俩的问题。
2、X路旁边有个高压模块用的电感,高压大概100V。我把示波器探头放在电感周边,发现在X路也能探测到电感耦合进来的干扰。第二回合猜测是电感的干扰。我用小铁盒把电感罩住,X路上探测不到干扰了,再次测试问题依旧,那也不是电感的问题。
3、第三回合猜测是各环节数据收发速率太快,尤其是SPI用的时钟是9Mhz的,然后把他们降速,问题依旧。
软件方面
这篇文章放草稿箱里好久了,就不分析了,直接上答案:是uart发送的问题。
红色是uart波形
1、一个完整帧的波形宽度是图中的“波形3”,但是发送过程中,会出现一个完整帧先发送一部分隔一段时间再发剩下的部分,如图中的“波形1”“波形2”,代码中串口发送的代码是这样的:USART1->DR = (数据) & 0xFF; while(((USART1->SR&0X40)==0)&&count--);
为了防止串口陷入死循环,在while里加入了&&count--,“count”值一到就跳出循环,但是定义的这个count值太大了,是0x1FFF;图片中耽误的这个空挡,差不多就是这个“0x1FFF”持续的时间。
2、这个大空挡会带来哪些危害呢?
a)、这个串口发送的是位移数据。下一级要利用这个位移数据做pid控制。下载因为这个“大空挡”的问题,pid迟迟得不到新鲜的数据,所以运动就出错了;
b)、可以把运动速度降低,这样串口发送的位移数据就基本能代表当前的位置了,pid计算就不会出错了。但是如果把这个串口大空挡解决掉,那么运动速度就会大幅提升。
依然没明白串口发送的过程中为什么会陷入while死循环,如果不是有count限制的话,肯定陷入死循环了。
就写成这样吧,涉及很多细节有些地方也表达不清,好歹问题解决了,运动速度也大幅提升。遗留的串口问题有懂的可以留言提点一下

猜你喜欢

转载自blog.csdn.net/aqwtyyh/article/details/108818137