2012-03-28 2 views
1

6 축 로봇 팔에 연결된 Arduino Mega가 있습니다. 6 개의 모든 인터럽트는 인코더에 연결됩니다 (인터럽트에 하나의 인코더 핀, 바닐라 디지털 입력에 다른 하나의 인코더 핀). 인터럽트는이 코드로 처리됩니다이는 아두 이노 모터의 위치가 특정 임계 값으로 해제되어 있음을 감지하면 특정 위치 -에서 고정 팔을 유지하도록 설계되어Arduino 인코더가 직렬 데이터 손상을 방해합니다.

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는 직렬 입력에서 손쉽게 명령을받는 것을 중지합니다. 문자가 삭제됩니다. 인터럽트는 분명히 매우 빠르게 실행되고 있으며, 어떤 이유로 명령이 손상 될 수 있습니다. 이 주위에 어떤 방법이 있습니까? 구조적으로, 내가이 일을 제대로하고 있는가? 필자의 본능은 주 실행 루프에서 updatePositions()를 호출하는 것입니다. 예를 들어 100ms 간격으로 인터럽트 오버 헤드를 크게 줄일 수 있습니까? 내 질문에 무슨 일이 일어나는 것 같아요 경우 모두 6 인코더 멀리 pulsing 경우에도 나는 Arduino에 안정적인 직렬 명령을 어떻게합니까?

답변

2

구적 엔코더는 하드웨어 카운터로 읽도록 설계되었습니다. 펄스 속도는 모터가 최대 속도로 작동 할 때 일반적으로 높습니다. 1 메가 헤르쯔는 특별하지 않습니다. 펄스 수가 많을수록 서보 루프가 잘 작동하고 모터의 위치를보다 정확하게 지정할 수 있습니다.

이 작업을 수행하는 것은 저전력 CPU를 사용하는 소프트웨어입니다. ISR이 펄스 간격보다 오래 걸리면 분해됩니다. 펄스를 잃어 버리고 위치를 잃을 것입니다. 이 오류 상태를 감지 할 수있는 방법이 없기 때문에 특히 좋지 않습니다. 그리고이 손실은 로봇이 빠르게 움직일 때 발생합니다. 최악의 상황은 통제력을 잃습니다.

서보 루프를 인터럽트 핸들러에서 업데이트 할 수는 없으므로 먼저 제거하십시오. ISR은 최소한으로 유지하고 위치 만 계산하면됩니다. 서보 루프는 타이머 인터럽트 또는 틱 (tick)에 의해 구동되어야합니다. 로봇이 느리게 움직이지 않는 한, 100msec 서보 업데이트로 로봇을 적절하게 제어 할 수 없습니다. 부드러운 가속과 안정적인 피드백을 얻으려면 기껏해야 수 밀리 초 정도가되어야합니다.

수천 달러 상당의 로봇 하드웨어를 제어하는 ​​데 40 달러를 소비하는 데는 지혜가 부족합니다. 서보 루프를 따라갈 수 없다는 것은 감지 할 수있는 것입니다. 위치 오차가 너무 커지면 종료하십시오. 펄스를 잃어버린 것에 대해 할 수있는 일은 없습니다. 그것은 잔해입니다. 하드웨어 카운터를 가져옵니다. 임베디드 시스템의

1

첫 번째 규칙 :

인터럽트 가능한 한 작은 마십시오.

경우에 따라 인터럽트 위치를 업데이트하고 위치/속도 제어 루프를 백그라운드에서 또는 낮은 우선 순위로 실행하십시오.

참고 : 채널 중 하나에서 인터럽트가 없으므로 인코더 펄스가 "손실"된다는 것을 알고 있다고 가정합니다.

또한 인터럽트 구동 인코더 분석은 잡음이 발생하기 쉽습니다. 노이즈 펄스가 발생하면 가장자리를 너무 가깝게 처리하기 때문에 둘 중 하나의 에지에만 인터럽트가 표시됩니다.

보다 강력한 방법은 4 개의 모든 전환을 감시하는 상태 시스템을 사용하는 것이지만 두 채널의 양쪽 가장자리에서 인터럽트가 필요하거나 예상되는 속도를 초과하지 않도록 충분히 빨리 폴링해야합니다.

관련 문제