首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Arduino编码器中断损坏的串行数据

Arduino编码器中断损坏的串行数据
EN

Stack Overflow用户
提问于 2012-03-28 13:44:30
回答 2查看 3K关注 0票数 1

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

代码语言:javascript
运行
复制
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将停止接收串行输入上的完整命令,几个字符将被丢弃。显然,中断运行得相当快,并且由于某些原因,这导致命令被破坏。有什么办法可以解决这个问题吗?从架构上讲,我做得对吗?我的主要直觉是在主运行循环中调用updatePositions(),比方说,以100ms为间隔,这会显著减少中断开销吗?我想我的问题归根结底是,即使所有6个编码器都在脉冲离开,我如何将可靠的串行命令放入Arduino?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-28 18:58:10

正交编码器设计为可由硬件计数器读取。当电机全速运行时,脉冲频率通常很高。1兆赫的频率并不少见。脉冲数越高,伺服回路工作得越好,电机的定位就越准确。

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

你绝对不能更新中断处理程序中的伺服循环,所以先把它去掉。将ISR保持在最小,只计算位置,不计算其他。伺服回路应该是独立的,由定时器中断或节拍驱动。你不能用100毫秒的伺服更新来正确地控制机器人,除非它很大很慢,这最多需要几毫秒才能获得平滑的加速度和稳定的反馈。

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-28 19:54:05

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

在中断中做的尽可能少。

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9901766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档