BASIC4MCU | 질문게시판 | 모터 전진 후진 기본 주행구현 관련 질문
페이지 정보
작성자 MJAY 작성일2023-02-01 12:17 조회1,002회 댓글1건본문
안녕하세요 STM32로 AGV를 개발하고 있습니다. CAN통신으로 모터 드라이버를 통해서 BLDC 모터를 제어하고 있습니다. 모터 드라이버에서 이미 PID 제어가 되고 있어서 PID제어 부분은 소스에 삽입되지 않았습니다. AGV는 바닥의 QR코드가 열십자 형태로 부착되어 있어서 전진, 후진, 우회전, 좌회전, 정지 정도로 구현이 됩니다. 제가 아래 주행 소스를 구현을 했는데요. 주행 함수들에 대해서 궁금한 부분이 있습니다. #define SPEED 10 // 속도 조절 Rpm void Go_Forward()
{ canTxHeader.StdId = 0x01; canTxHeader.DLC = 8; can1Tx0Data[0]=0xcf; // PID = 207 can1Tx0Data[1]=0x01; // ID 1 = 1 (Enable) can1Tx0Data[2]=SPEED; // LEFT MOTOR = 10 RPM can1Tx0Data[3]=SPEED; // LEFT MOTOR = 10 RPM can1Tx0Data[4]=0x01; // ID 2 = 1 (Enable) can1Tx0Data[5]=-SPEED; // RIGHT MOTOR = 10 RPM can1Tx0Data[6]=-SPEED; // RIGHT MOTOR = 10 RPM can1Tx0Data[7]=0x00; TxMailBox = HAL_CAN_GetTxMailboxesFreeLevel(&hcan1); HAL_CAN_AddTxMessage(&hcan1, &canTxHeader, can1Tx0Data, &TxMailBox); } void Go_Backward() { canTxHeader.StdId = 0x01; canTxHeader.DLC = 8; can1Tx0Data[0]=0xcf; // PID = 207 can1Tx0Data[1]=0x01; can1Tx0Data[2]=-SPEED; // LEFT MOTOR = 10 RPM can1Tx0Data[3]=-SPEED; // LEFT MOTOR = 10 RPM can1Tx0Data[4]=0x01; // ID 2 = 1 (Enable) can1Tx0Data[5]=SPEED; // RIGHT MOTOR = 10 RPM can1Tx0Data[6]=SPEED; // RIGHT MOTOR = 10 RPM can1Tx0Data[7]=0x00; TxMailBox = HAL_CAN_GetTxMailboxesFreeLevel(&hcan1); HAL_CAN_AddTxMessage(&hcan1, &canTxHeader, can1Tx0Data, &TxMailBox); } void StopMotor() { canTxHeader.StdId = 0x01; canTxHeader.DLC = 8; can1Tx0Data[0]=0xcf; // PID = 207 can1Tx0Data[1]=0x01; can1Tx0Data[2]=0; // LEFT MOTOR = 0 RPM can1Tx0Data[3]=0; // LEFT MOTOR = 0 RPM can1Tx0Data[4]=0x01; // ID 2 = 1 (Enable) can1Tx0Data[5]=0; // RIGHT MOTOR = 0 RPM can1Tx0Data[6]=0; // RIGHT MOTOR = 0 RPM can1Tx0Data[7]=0x00;
TxMailBox = HAL_CAN_GetTxMailboxesFreeLevel(&hcan1); HAL_CAN_AddTxMessage(&hcan1, &canTxHeader, can1Tx0Data, &TxMailBox); } int main() { HAL_CAN_Start(&hcan1);
while(1) { Go_Forward(); Hal_Delay(5000); Go_Backward(); Hal_Delay(5000); } } 1. (1) 우회전, 좌회전도 별도 함수로 구현을 해야겠죠? 그렇다면 우회전 이후에 Go_Backward()까지 넣어서 직진까지 구현해야 하나요? Go_Backward() 없이 딱 우회전까지만 구현해야할까요? void Right_Turn() { 우측턴 구현 Go_Backward() } (2) 턴을 구현할 때, TURN_SPEED?, BRAKE_RATE?, TURN_BRAKE? 이라는 부분들이 필요한건가요? 다른 자료들 찾아보면 TURN_SPEED?, BRAKE_RATE?, TURN_BRAKE? 이런 단어들이 등장해서 질문 드립니다. 2. 속도 보정인가? 그런것이 필요한가요? 3. 저는 초보 입니다. 모터 주행을 제어를 할 때 더 필요한 부분이 있을까요? 다양하게 답변을 부탁 드립니다. (위치 제어는 턴 구현후 진행 예정) 감사합니다.
댓글 1
조회수 1,002master님의 댓글
master 작성일동작시키면서 고민하는 것이 좋습니다.