Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serial port Arduino编码器中断损坏串行数据_Serial Port_Arduino_Encoder - Fatal编程技术网

Serial port Arduino编码器中断损坏串行数据

Serial port Arduino编码器中断损坏串行数据,serial-port,arduino,encoder,Serial Port,Arduino,Encoder,我有一个Arduino Mega连接到一个6轴机械臂。所有6个中断都连接到编码器(一个中断上的一个编码器引脚,另一个在普通数字输入上)。中断由以下代码处理: void readEncoder1(){ //encoders is a 2d array, where the first d is the axis, and the two pin numbers //first pin is on an interrupt (CHANGE), and second is a standard dig

我有一个Arduino Mega连接到一个6轴机械臂。所有6个中断都连接到编码器(一个中断上的一个编码器引脚,另一个在普通数字输入上)。中断由以下代码处理:

void readEncoder1(){
//encoders is a 2d array, where the first d is the axis, and the two pin numbers
//first pin is on an interrupt (CHANGE), and second is a standard digital in
  if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) {
   positions[0]++;
  } else {
   positions[0]--;
  }
 if(servoEnable){
  updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly
 }
}
这是为了保持手臂锁定在某个位置-如果arduino检测到电机的位置关闭了某个阈值,它会更新电机的电源,以保持手臂的位置


问题是,如果两个或三个(或更多)轴处于负载状态(需要不断更新以保持位置)或正在移动,Arduino将停止接收串行输入的完整命令,几个字符将丢失。中断显然运行得相当快,出于某种原因,这会导致命令损坏。这有什么办法吗?在建筑上,我这样做对吗?我的主要本能是在主运行循环中以100毫秒的间隔调用updatePositions(),这会显著减少中断开销吗?我想我的问题归根结底是,即使所有6个编码器都在脉动,我如何将可靠的串行命令输入Arduino?

正交编码器设计为由硬件计数器读取。电机全速运行时,脉冲率通常较高。一兆赫并不罕见。脉冲数越高,伺服回路工作得越好,电机的定位也越精确

在低功耗cpu的软件中实现这一点很有挑战性。当ISR花费的时间超过脉冲之间的间隔时,它将崩溃。你会失去脉搏,从而失去位置。尤其糟糕,因为您无法检测到这种错误情况。这种损失发生在机器人快速移动时,这是失去控制的最坏情况

您绝对无法更新中断处理程序中的伺服循环,因此请先去掉它。将ISR保持在最低限度,只计算位置,不计算其他。伺服回路应分开,由定时器中断或滴答声驱动。你不能用100毫秒的伺服更新来正确地控制机器人,除非它是一个大的、缓慢的,这最多需要几毫秒来获得平滑的加速和稳定的反馈


花40美元来控制价值数千美元的机器人硬件,智慧有限。无法跟上伺服回路是可以检测到的,当位置误差累积太多时,关闭它。你对失去脉搏无能为力,那是一场灾难。获取硬件计数器

嵌入式系统的第一条规则:

在中断时尽量少做

在您的情况下,只需更新中断中的位置,并在后台或以较低优先级运行位置/速度控制回路

旁白:我假设您知道您正在“丢失”编码器脉冲,因为其中一个通道上没有中断

此外,中断驱动的编码器分析非常容易产生噪声。如果你得到一个噪声脉冲,你可能只会看到其中一条边的中断,因为它们太近了,无法同时处理这两条边

一种更可靠的方法是使用状态机来监视所有4个转换,但这需要在两个通道的两个边缘上都中断,或者以足够快的速度进行轮询,以确保不会错过任何您期望看到的速率