前提・実現したいこと
stm32について、esp32経由でコントローラーからstm32にUART通信でアナログスティックの情報を送り、その値の大きさによってモーターの回転の方向を変えるプログラムの作りたいと考えています。モーターの制御にはモータードライバーを使います。
main文のwhile文の中を
発生している問題・エラーメッセージ
エラーメッセージはありません。モーターの挙動がおかしいです。速度が明らかに遅かったり、不安定です。なんかひっかかっているような挙動です。
該当のソースコード
//正常にモーターが回転するコードです。正常に回転しますがこれがゴールではないです。3つのモーターが1.5s間正回転→1.5s停止→1.5s反回転→1.5s停止以下ループ(main文のwhile文の中身です。)ちなみにこのプロジェクトはhttps://drive.google.com/file/d/1CsN6_AK7SkRTE7gxDjKHYAXUYAZMxKEi/view?usp=sharing からダウンロードできます。 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,500); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,500); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,500); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); HAL_Delay(1500); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); HAL_Delay(1500); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 500); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 500); HAL_Delay(1500); //ちゃんとモーターが回らないプログラム(先ほどとは異なり、while文には何も書かれていません。 esp32経由で、UART通信でコントローラーのLスティックのx座標をrcv_data[2]に格納します。 また100Hz周期のタイマ割り込みによって、rcv_data[2]の大きさによってモーターの回転方向を変える。 ちなみにこのプロジェクトはhttps://drive.google.com/file/d/1CpN5fp9asHR5MFpdKcraJvAp3cvjacx2/view?usp=sharingからダウンロードできます。 uint8_t rcv_data[6]; void HAL_UART_RxCpltCallback(UART_HandleTypeDef* UartHandle) { if (UartHandle->Instance == USART1) { HAL_UART_Receive_IT(&huart1, rcv_data, 6); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(rcv_data[2]>=168) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); } else if(rcv_data[2]<=88) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500); } }
試したこと
プログラムをできるだけ簡素化することで、原因究明を図りましたがまだ発見に至っていないです。
補足情報(FW/ツールのバージョンなど)
ちなみにうまくいかないプログラムについて、タイマ割り込みよりUART割り込みの方が優先度が高くなるようにしており、イマ割り込みは100Hzにしています。
また、うまくいくプログラムとうまくいかないプログラム両方において、tim2、tim3のPrescalerは83、counterperiodは999に設定しています。
rcvdata[2]の値は期待通りになっていることは確認されているのでしょうか。
HAL_TIM_PeriodElapsedCallback()は確実に呼ばれていますか。
上のコードでは正転は
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1,500);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,500);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,500);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0);
ですが、下のコードでは
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 500);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
のみで正転あるいは逆転することになっているようです。上のコードは動いた実績があるようですが、下のコードでモーターが回ることは確認されているのですか?
ありがとうございます!
今ハードはないですが、上記が確認できるプログラムを書いて、ハードの持ち主に送ってみます。
あと、タグESP32は違いますね。STM32はタグはない様子。