본문 바로가기
뻘소리

모터 4개 동시에 돌아간다.

by mokhwasomssi 2021. 2. 20.
이대로 괜찮은가

HAL_TIM_PWM_Start_DMA 함수를 사용했을 때

같은 타이머에 다른 채널일 때 첫번째만 PWM이 전송되고 두 번째는 전송이 안됐다.

 

HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, motor2, DSHOT_FRAME_SIZE);
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, motor3, DSHOT_FRAME_SIZE);

 

찾아보니까 htim->State가 HAL_TIM_STATE_READY라서 HAL_BUSY를 리턴하는데

이유를 내가 알 턱이 있나?

 

HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
{
  uint32_t tmpsmcr;

  /* Check the parameters */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  if (htim->State == HAL_TIM_STATE_BUSY) //여기서 걸린다. 
  {
    return HAL_BUSY;
  }
  else if (htim->State == HAL_TIM_STATE_READY)
  {
    if ((pData == NULL) && (Length > 0U))
    {
      return HAL_ERROR;
    }
    else
    {
      htim->State = HAL_TIM_STATE_BUSY;
    }
  }
  else
  {
    /* nothing to do */
  }

...생략

 

구글에 찾아보니 나랑 똑같은 질문한 사람이 있더라

https://community.st.com/s/question/0D50X0000BMEgMo/is-there-impossible-to-start-pwm-dma-on-several-channels-of-same-timer-in-hal

 

Is there impossible to start PWM DMA on several channels of same timer in HAL?

Cookie Notice This website uses cookies. By continuing to visit our website, you are consenting to ST's Cookie Policy. To see what cookies we serve and to set your preferences, click here

community.st.com

 

답변 중에 하나가 타이머 상태를 임의로 바꾸라는 답변이 있었다.

"it may be safe to set htim->State = HAL_TIM_STATE_READY manually after first HAL_TIM_PWM_Start_DMA call."

그래서 나는 상태 리셋 매크로 써서 해봤는데 전송 잘 되는 것 같더라

HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, motor2, DSHOT_FRAME_SIZE);
__HAL_TIM_RESET_HANDLE_STATE(&htim5); //추가
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, motor3, DSHOT_FRAME_SIZE);

이렇게 하는게 맞는건지는 모르겠는데 일단 되니까 패스

이거 모터 따로따로 제어