Stepper Motor의 Holding Current 제어 회로 – 2

개요

이번 글은 Stepper Motor의 Holding Current 제어 회로 -1 에 이어서 펌웨어를 어떻게 작성해야 하는지에 대해 검토해 보고자 합니다.
해당하는 펌웨어는 printRun() 프로시저이고 인쇄용지와 리본을 feeding하면서 프린터 헤드의 448dot에 라인별로 인쇄를 하는 기능을 하는 프로시저입니다.
총라인은 712라인인데 800라인을 인쇄를 하고 1/2 microstep이니까 펄스는 1600 pulse를 발생 시킵니다.

펌웨어 수정

Stepper Motor Enable and Disable

본 기기의 MCU는 STMicroelectronics사의 STM32F446ZET6를 사용하기 때문에 이 MCU를 기준으로 펌웨어가 작성 됩니다.
Stepper Motor를 구동하는 부분은 인쇄 프로시저내에 있습니다.
아래 코드는 해당하는 프로시저에 대한 코드 입니다.

case 5에서 “Printer_Motor(_ENABLEN, _On)” 코드로 stepper motor를 enable 시킵니다.

case 6에서 “Printer_Motor(_ENABLEN, _Off)”코드로 Disable 시키고 있습니다. Disable 됨과 동시에 모터가 자유회전을 하게 되어 Backlash가 발생합니다.
이 싯점은 한장만 인쇄가 종료 된 것이고 모든 인쇄가 종료된 것이 아닙니다. 이 코드를 삭제하여 enable 상태를 유지하고 모든 인쇄가 종료 되면 이 코드를 삽입하여
stepper motor를 disable 시키는 것으로 바꿉니다.

RREF 저항연결 제어 코드

아래는 DRV8886 stepper motor 드라이버 IC의 RREF 핀의 저항 연결을 선택하는 코드 입니다.
3개의 GPIO로 선택을 하도록 하였습니다. 3개의 FET 중 반듯이 한 개만 On 이 되도록 하여야 합니다.

// Ensure only one pin is HIGH at a time
void set_run_current(void) {
HAL_GPIO_WritePin(Q1_PORT, Q1_PIN, GPIO_PIN_SET); // 15k
HAL_GPIO_WritePin(Q2_PORT, Q2_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Q3_PORT, Q3_PIN, GPIO_PIN_RESET);
}

void set_hold_current(void) {
HAL_GPIO_WritePin(Q1_PORT, Q1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Q2_PORT, Q2_PIN, GPIO_PIN_SET); // 30k
HAL_GPIO_WritePin(Q3_PORT, Q3_PIN, GPIO_PIN_RESET);
}

void set_extra_low_hold(void) {
HAL_GPIO_WritePin(Q1_PORT, Q1_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Q2_PORT, Q2_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Q3_PORT, Q3_PIN, GPIO_PIN_SET); // 45k
}

set_run_current()는 case 5의 motor enable 전에 삽입하고 set_hold_current()는 case 6에서 disable 코드 대신 삽입하면 됩니다.
set_hold_current()를 할 것인가 아니면 set_extra_low_hold()로 할 것인가는 실제 구동을 해서 발열이 많이 발생하지 않으면서 적정하게 Hold를 하는 쪽으로 선택을 하면 됩니다.

댓글 남기기