2017-12-16 3 views
1

Beaglebone Black 용 장치 드라이버를 작성하여 ULN2003A 보드를 통해 연결된 28BJY-48 스테퍼 모터를 단순히 회전시킵니다. 모든 것이 잘 작동하지만, 모터는 회전하지만, 각 핀이 모터로 신호를 "포착"하기 위해 HIGH로 스위칭 된 후에 msleep(1)을 사용해야 할 필요가 있음을 발견했습니다. 잠자기 시간없이 루프를 돌리면 모터에 아무런 변화가 없습니다.Beaglebone Black 스테퍼 모터를 매우 천천히 실행하는 GPIO 제어. 속도를 어떻게 향상시킬 수 있습니까?

모터 회전을 가속화하려고합니다.

내 논리는 신호가 너무 빨라 응답 할 수 없다는 것입니다. 모터 코일과 직렬로 연결된 LED에 불이 들어 오기 때문에 신호가 전송되고 있음을 알고 있습니다.

나는 Elegoo found here for referene에서 제공 한 데이터 시트와 지침을 읽었습니다.

GPIO11 - IN1 - BLUE wire (coil 4) 
GPIO12 - IN2 - PINK wire (coil 3) 
GPIO15 - IN3 - YELLOW wire (coil 2) 
GPIO16 - IN4 - ORANGE wire (coil 1) 

나는 GPIO를 제어를하고있는 방법은 것입니다 : 내가 컨트롤로 P8의 다음의 GPIO를 할당 Driver diagram

:

은 이해를 돕기 위해, 나는 배선 다이어그램을 첨부 ioremap()을 사용하십시오.

static ssize_t motor_rotate(int i) { //0 rotates right, 1 rotates left 
    int c = 0; 

    motor_stop(); 

    while(c < 2000) 
    { 
     *gpio_dataout_addr |= PIN11; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN16); 
     *gpio_dataout_addr |= PIN12; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN11); 
     *gpio_dataout_addr |= PIN15; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN12); 
     *gpio_dataout_addr |= PIN16; 
     //msleep(1); 
     *gpio_dataout_addr &= (0xFFFFFFFF^PIN15); 

     c++; 
    } 

    motor_stop(); 

    return 0; 
} 

static ssize_t motor_stop(void){ 
    *gpio_dataout_addr &= (0xFFFFFFFF^(PIN11 | PIN12 | PIN15 | PIN16)); 

    return 0; 
} 

내 모터가 Beaglebone의 5V의 전원 공급 장치 독립에 걸려 있습니다 여기에

모터를 제어하는 ​​코드의 일부입니다. 올바른 방향으로 도움이나 조언을 주시면 감사하겠습니다.

두 개의 핀을 동시에 LOW와 2에서 HIGH로 설정하는 방법이 있습니까? 내 코드는 한 핀을 로우로 설정 한 후에 다른 핀을 하이로 설정한다. 내가 한 걸음 다 할 수 있는지 알고 싶다. 나는 그것을 알아낼 수 없습니다.

답변

0

추가 검토 후 연구 결과 전압, 모터 또는 보드가 아닌 코드 자체에 문제가 있음을 발견했습니다.

As per this link msleep의 최소 제한은 약 20ms입니다. 20ms 이하 (내 경우에는 1ms)는 20ms에서 실행됩니다. 따라서 < 20ms 지연을 달성하는 적절한 기능은 다음 중 하나입니다.

범위를 1000-2000으로 사용하면 빠른 회전으로 좋은 결과를 얻을 수 있습니다. 그러나 모터를 잡고있는 동안, 나는 눈에 보이지 않지만 그것이 두 개의 단계를 건너 뛰는 것을 느낀다. 나는 이것이 전압 오류이거나 모터 제한이라고 생각한다. 건너 뛰기의 원인을 배제하려면 추가 분석이 필요합니다.

최적의 건너 뛰기가 아닌 범위가 무엇인지 파악하기 위해이 범위로 계속 놀고 있습니다.

udelay()는 그러나 시스템이 일부 영구 루프에서 동결 보인다 하드 재부팅이 필요하며, 작동합니다. 회전 루프가 완료된 후 정확히 시스템이 멈추는 원인을 파악하려면 추가 분석이 필요합니다.

관련 문제