STM32F746 기반 UART-CAN 브리지 펌웨어입니다. 컴퓨터에서 받은 6개 모터 명령을 CAN 명령 프레임으로 변환해 각 모터로 보내고, 모터에서 받은 피드백은 필요한 값만 모아 경량 UART 메시지로 컴퓨터에 전달합니다.
- 컴퓨터와 보드는
USART3로 통신합니다. - 보드와 모터는
CAN1으로 통신합니다. uart_to_can태스크는 UART DMA로 받은 명령을 CAN 메시지로 변환해 모터에 전송합니다.can_to_uart태스크는 CAN으로 받은 모터 피드백을 모아 UART DMA로 컴퓨터에 전송합니다.- 현재 설정은
MOTOR_NUM = 6이므로 모터 6개를 대상으로 합니다.
- 포트:
USART3 - Baud rate:
1,000,000 - 데이터 비트: 8 bit
- Stop bit: 1
- Parity: none
- RX: DMA circular
- TX: DMA normal
- 포트:
CAN1 - 모드: normal
- 필터: 모든 표준 ID 수신
- RX interrupt:
CAN_IT_RX_FIFO0_MSG_PENDING - 모터 CAN ID:
1부터6까지 사용
컴퓨터는 UART로 6개 모터의 경량 명령 프레임을 보냅니다. 보드는 프레임 헤더와 모터 개수를 확인한 뒤, 모터별 데이터를 CAN 8바이트 명령으로 변환합니다.
현재 MOTOR_NUM = 6, DATA_SIZE = 4이므로 UART 수신 프레임 크기는 28바이트입니다.
| Byte | 내용 |
|---|---|
| 0 | 0xFF header |
| 1 | 모터 개수 (6) |
| 2-25 | 모터별 4바이트 명령 데이터 |
| 26 | reserved |
| 27 | 0xFC tail |
모터별 4바이트 명령 데이터는 다음 순서입니다.
| Offset | 내용 |
|---|---|
| 0 | position high 8 bit |
| 1 | position low 8 bit |
| 2 | effort high 4 bit |
| 3 | effort low 8 bit |
보드는 각 모터 명령을 다음 CAN 명령 프레임으로 변환합니다.
| CAN byte | 내용 |
|---|---|
| 0 | position high 8 bit |
| 1 | position low 8 bit |
| 2 | velocity high 8 bit (0x7FF 고정값의 상위부) |
| 3 | velocity low 4 bit + kp high 4 bit |
| 4 | kp low 8 bit |
| 5 | kd high 8 bit |
| 6 | kd low 4 bit + effort high 4 bit |
| 7 | effort low 8 bit |
제어 게인은 effort 값에 따라 다르게 설정됩니다.
- effort가
0x7FF이면kp = 0x000,kd = 0x000 - 그 외에는
kp = 0x333,kd = 0xFFF - velocity는
0x7FF로 고정됩니다.
모터에서 CAN 피드백이 들어오면 보드는 모터 ID별로 피드백을 모읍니다. 모든 모터 피드백이 모이면 전체 피드백 프레임을 UART DMA로 컴퓨터에 전송합니다.
현재 UART 송신 프레임 크기도 28바이트입니다.
| Byte | 내용 |
|---|---|
| 0 | 0xFF header |
| 1 | 모터 개수 (6) |
| 2-25 | 모터별 4바이트 피드백 데이터 |
| 26 | 0xFF |
| 27 | 0xFC tail |
모터별 피드백 데이터는 수신된 CAN 버퍼에서 다음 위치를 사용합니다.
- 모터 ID:
can_rx_buffer[0] - position:
can_rx_buffer[1],can_rx_buffer[2] - velocity:
can_rx_buffer[3],can_rx_buffer[4]
TX DMA 전송 중에는 uart_tx_flag로 중복 전송을 막고, UART TX 완료 콜백에서 다시 송신 가능 상태로 전환합니다.
uart_to_can 태스크 시작 시 다음 순서로 주변장치와 모터를 준비합니다.
- CAN 필터 설정
- CAN RX FIFO0 인터럽트 활성화
- CAN 시작
- 각 모터에
MotorExit,MotorZero,MotorInit순서로 초기화 명령 전송 - UART DMA 수신 시작
motor_uart_can_bridge/Core/Src/freertos.c: FreeRTOS 태스크, UART-CAN 변환 로직, DMA/CAN 콜백motor_uart_can_bridge/Core/Src/can.c: CAN1 설정motor_uart_can_bridge/Core/Src/usart.c: USART3 및 DMA 설정