작성
·
513
0
학습한 내용을 바탕으로 STM32F446RE MCU를 이용하여 BLDC 모터 3개를 동시에 CAN 통신으로 메시지를 주고받아 제어하고자 합니다. 모터 1개에 관해서는 CAN 통신으로 제어가 잘 되는 것을 확인하였는데, 3개를 동시에 제어하니, ID가 작은 순 (우선순위가 높은 순서)대로 RxData값을 받아오는 것을 확인하였습니다. 해당 문제를 해결하기 위해 검색을 하였는데, 이를 위해서는 CANopen: Inhibiting time이라는 전송금지시간을 설정하는 방법으로 하나의 ID가 bus를 점령하지 않도록 할 수 있다고 하였는데, 이를 어떤 방식으로 코드를 작성해야 할지 아이디어가 떠오르지 않습니다. 어떤 방식으로 해결할 수 있을까요?
답변 1
0
메시지를 수신후 특정 ID를 수신하지 않게 하려면 List 모드로 수신하는 3개를 설정 후, 1번을 수신하면 1번 ListID1=0, ListID2, ListID3는 수신하려는 ID를 입력하면 되지 않을까요?
(2번을 수신하면 ListID2=0, ListID1, ListID3은 수신하려는 ID 입력 ~)
그러나 수신을 안하는 것 뿐이지, 통신 라인상에서는 계속해서 전송하면 라인이 busy상태에 있지 않을까요?
제 생각에 통신속도를 증가시키는 것이 가능하면, 통신 속도를 증가하는 것이 좋을 것 같네요
예전 경험에 비추어 보면, 수신쪽에서 메시지를 받지 못하는 경우는 없었습니다.
단지 메시지를 놓치는 경우가 발생했습니다.
즉 상대방에서 메시지를 계속 보내는 데, 몇개의 메시지를 놓치는 일이 있었습니다.
분석해 보니, 메시지를 받고 뭔가를 처리하면서 그 다음 들어오는 메시지를 수신처리 하지 못하는 문제였습니다.
그래서 해결방법은 수신 sw 버퍼를 만들고 can 수신 인터럽트에서는 수신 버퍼에 들어오는 대로 계속해서 쌓고, 수신 데이터를 처리하는 것은 main에서 수신 버퍼 데이터를 하나씩 꺼내서 처리하는 것으로 해결이 되었습니다.
참고하세요 ~!!
Time Triggered Communication Mode를 사용해보았지만 아직 문제는 해결되지 않는 것 같습니다. 혹시 특정 ID를 받고 나면 특정 ID가 보내는 메시지를 수신하지 않는 코드를 작성할 수는 없을까요?