質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

1回答

1249閲覧

stm32について、モータードライバーによってモーターが正常に回転しない

yuga1223

総合スコア2

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/12/09 18:56

編集2021/12/09 18:58

前提・実現したいこと

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に設定しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/12/10 13:42

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); のみで正転あるいは逆転することになっているようです。上のコードは動いた実績があるようですが、下のコードでモーターが回ることは確認されているのですか?
yuga1223

2021/12/11 01:31

ありがとうございます! 今ハードはないですが、上記が確認できるプログラムを書いて、ハードの持ち主に送ってみます。
thkana

2021/12/11 03:35

あと、タグESP32は違いますね。STM32はタグはない様子。
guest

回答1

0

こういうハードウエア絡みの制作物を作る場合は、オシロスコープを用意しましょう。
どういう出力がなされているかってのは、それで見るとすぐわかります

コードを組む場合には動作チェックをするために、統合開発環境とかデバッガを用意して、それでどういうふうに動いてるのか、ってのを見ていくと思いますが、
ハードウエアの動作をさせるときにはそれと同様に、どういう信号が実際にどう出ているかってのを見る手段が必要です

投稿2021/12/10 00:31

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuga1223

2021/12/11 01:27

回答ありがとうございます! 困ったことに、今ハードが手元にないので、 後日オシロスコープで確認してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問