その62 フィードバック無しモーター制御(ダイセンのモーター) - ロボボボいじりにうってつけの日

記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

その62 フィードバック無しモーター制御(ダイセンのモーター)

その61に書きましたが、OmnimOにおいてエンコーダーがいまいちうまくいきません。
そこでいっそのことエンコーダーなしで行くことにしました。

だからといってなんの工夫もないのではエンコーダーの立場がないので、ちょっとは工夫します。

目標は「目的の速さでモーターを回転させるためのデューティを知る」ことです。

エンコーダーを使えることには使えるので回転数はかなり正確に測れます。
そこで、モーターにさまざまなデューティをかけながら、AD変換から計算した「電源電圧」、「デューティ」、「速さ」の3種類の値をパソコンに出力しました。

電源電圧はVcc(mV)
速さはタイヤ径などをふまえてマイコン上で計算したもので、V(mm/s)です。
デューティは1024段階のどれか。

そして、V vs Vcc×Dutyのグラフを書きました。

62-1

以前その53で書いたものよりもだいぶまともですね。

このグラフの式を

Vcc×Duty = f(V)

とすると、モーターに与えるべきDutyは

Duty = f(V)/Vcc

でわかります。

実際のプログラムではこのグラフをいくつかの直線の集まりとして近似して次のようなコードになっています。

------------------------------------------------------

int16_t Calculate_Duty_From_V(int16_t v) //目標速度からdutyを計算する関数
{
int16_t duty;
int32_t duty_Vcc;
if(v == 0) duty_Vcc = 0;
else if(v < 800 ) duty_Vcc = 4949*v - 307036;
else if(v < 1150) duty_Vcc = 5234*v - 567453;
else if(v < 1500) duty_Vcc = 5492*v - 895085;
else if(v < 1630) duty_Vcc = 6749*v - 3000000;
else if(v < 1690) duty_Vcc = 3011*v + 3000000;
else if(v < 1730) duty_Vcc = 7139*v - 4000000;
else if(v < 1850) duty_Vcc = 4944*v + 186952;
else if(v < 1940) duty_Vcc = 3911*v + 2000000;
else duty_Vcc = 8395*v - 7000000;

if(duty_Vcc < 0) duty_Vcc = 0;
duty = duty_Vcc/VccValue;

return duty;
}

---------------------------------------------------------

当然電圧をかけてすぐにモーターが反応するわけじゃありませんし、この通りの速度が出せるわけじゃありません。
まぁただ電圧に比例すると考えるよりはましかなぁというレベルのものですね。

以上、その62 フィードバック無しモーター制御(ダイセンのモーター)
スポンサーサイト

コメント

コメントの投稿

非公開コメント

プロフィール

Author:たけもり
ブログ新設しました-->メカトロニクスにうってつけの日


「しゃれたロボットをつくりたい」と思いながらも大学生になってやっとのんびり勉強始めました.
勉強のためにロボトレースというロボコンに参加して,全方向移動型ロボトレーサー"OmnimO-2"を制作しました.
大学ではヘビ型ロボットについて研究しています.
個人的課外活動としてエンタメ志向のロボットを製作中.最新作のMimebotはこちら

ロボコン時代のロボットはこちらにまとめています.

アクセスカウンター

カレンダー

08 | 2017/03 | 09
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。