ようやく、目標値に近づける制御がうまくいったようです。こんな簡単なことが、なかなかうまくできない。。ショボいですね、自分。
黄色い線が、エンコーダ出力の周期(時間)ですね。赤がP制御、青がI制御の増減分(双方とも左軸)
mbedはfrdm-K64Fを使っています。500ステップ分を一度バッファに貯めてUSBシリアルでPCに転送してます。(この辺は、mbedならではの簡単さですね)
- DCモータ電圧制御にPWMOutを使用。10KHz=100us周期[period_us(100)]、オン時間を可変[pulsewidth( )])
- エンコーダは割り込み(↓)。Timerクラスを使用して、時間計測。割り込み入るとその時の時間[read_us()]を読んで、タイマリセット[reset()]を繰り返す。
- エンコーダ制御は、タイムベース周期[Ticker]を1msにして、pulsewidth()を増減
ここ、数週間ずっと同じことをやっていました。タイマを多用することになるのですが、周期算出とTimerの使い方で、なかなかうまくいかなくて・・・なんども作り壊して今日に至った。最後はなかなか収束させることができなくて試行錯誤しました。
会社の仕事やってても自分の身にならないが、こいったことは将来の自分に役に立つ、そう思うと、こっちばっかりやるようになってしまう。
やっぱり、もうちょっといいオシロが欲しい。
teratermでデータ取得してコピして、Windows10のOpenofficeで読み込み、これをxlsファイルで保存、Macに持ってきて編集、、、、うーん手間。。
mbedでpulsewidthを設定する時おかしな動きあります。これは、自分が間違えてるのかもしれないのですが、クラスライブラリの説明では、pulsewidthの設定は。「keeping same period」とあるので、周期を一定にしたままオン時間を変えることだと理解しましたが、pulsewidthで時間設定した直後にオン時間が出力されてしまいその瞬間だけ周期が狂います。
水色がpwm出力で、黄色がエンコーダ入力。pulsewidth設定した瞬間パルスがつながっているのが見れます。これは仕様なんでしょうか。
コメントを追加