FreeBSD上でSH2の開発環境構築とSH2を使ったDCサーボモータの制御のページ
その2
SH2の開発環境とDCサーボモータを制御する方
法を紹介してきます。
2005年
10月2日
DCモータのドライブ回路の実験を行ないました。H型ドライブ回路で必要なDC-DCコンバータをプロセッサボードの下に実装します。これは5Vから絶縁された5Vを作ります。
H型の上側のFETは12+5=17Vをゲートに加えます。
先週、間違っていたGALの修正版を実装し、オープンコレクタのドライバ(7406)も追加します。実験なので、H型ドライブ回路はバラックで作りました。
写真はバラックで
作ったH型のドライブ回路です。テスト用にロータエンコーダでパルス幅を調整できるようにして、モータを回します。12Vは5Aのスイッチング電源ですが、少し容量が足らないようで、急加速すると保護回路が働いて、12Vが落ちます。ゆっくり加速すれば、パルス幅に応じて回転数が制御できることが確かめられました。後で、実験用電源を変更します。写真ブレてます。
下はH型のモータドライバのブロック図です。FETはたまたまあったモトローラのMTB75N03HDLという型番です。25V75A、オン抵抗9mΩです。ちょっと電圧が低めですが、これを使って実際の回路も作る予定です。DC-DCコンバータの5Vは12Vに上乗せして17Vにして、上側のFETのゲートに接続されるプルアップ抵抗の電源に使います。
10月8日
左は拡張ボード上に作製した12Vから5Vを生成するDC-DCコンバータです。右側は先週バラックで実験をしたH型ドライバを2組拡張ボード上に作ります。モータを接続する端子台も追加ました。
モータを2つ接続してボード上のH型ドライバの動作テストを行います。正常に回りました。モータの
正転/反転もテストしておきます。電源は12Vのバッテリから取りました。恵梨沙
フォントからASCII文字だけ抜き出したフォントを組
込んでテストを行いました。機構の方も少し作業をしました。ここを
クリックしてください。
2006年2月11日
ソフト開発とCADの図面入力用に購入したThinkPadのT22です。スペックはP3−1G、384Mバイト、32G、
DVD-ROM、1400x1050液晶です。処理速度は自宅アパートのPCとほぼ同スペックです。オークションで購入した時にOSが付属していなかったため、潔く全領域をFreeBSD6.0にしました。DVDが付いているので、雑誌の付録のDVDから簡単にBSDがインストールできました。小型のUSBマウスも付ておきました。
これまでにインストールした主なソフトウェアは以下です。
・機械系
qcad - 2D 製図
mged - 3D-CG
・電気系
kicad - 回路図、PCBアートワーク
xcircuit - 回路図
oregano - 回路図
spice3 - 回路シミュレータ
・文書系
openoffice - ワープロ+表計算+図
acroread7 - アクロバットリーダ
firefox - WEB閲覧
・音楽系
xmms - mp3プレイヤ
・開発環境
sh用gcc - sh2クロス環境
ddd - デバッカ
先週、CNC用のPCにネットワークカード入れたのですが認識できなかったので新品を
購
入しました。700円でした。双方ともRealTeckのカニマークのイーサネットのコントローラですが、新品で購入した方は3139が載っています。失
敗したものは3039?で違うップが載っていまた。これが認識できなかった原因と思われます。しかし、新品の方は認識には成功したものの、SCSIコント
ローラとIRQが重なっていてMACアド
レスが全て0の表示になってしまい、取りあえずSCSIカードを外しました。
CNC用PCにDHCPサーバをインストールし、クロスのLANケーブルで接続し
てping、
telnetとftpの接続テストを行ないます。正常に通信できることを確認しました。
付属品もネットオークションで購入しました。DVDと排他的に使えるFDと予備バッテリ。
予備のHDDマウントと英語キーに交換して外した日本語キー。
2月18日
Xの"-display"を使って、ノートPC側でフラ
イスの制御プログラムを表示/入力するテストを行ないました。"popen"で起動している"gnuplot"もノートPC側に表示されます。
ノートPC側
$ xhost +192.168.0.2
$ telnet 192.168.0.2
CNC用PC側
$ xmodrv -display
192.168.0.8:0.0 &
2月19日
オークションで購入した、USB-シリアル変換ケーブルのテストをします。SH2ボードはデバッグ時にはgdbとコンソールの2チャネルが必要ですが、ノートPCにはシリアルが1つしか無いため、ハブを介してUSB-シリアル変換を使います。"uplcom"ドライバをロードしてUSB-シリアル変換ケーブルを挿すと、"cuaU0"と
いうデバイスが使え
るようになります。FreeBSD6.0はdevfsのため、/dev下はデバイスが認識されてデバイスファイルが出現します。なので、MAKEDEVも
存在しません。4.11から移行してくると、ちょっと馴れが必要です。ゆくゆくはmozのドライバも6.0系で動かす必要が出てくると思います。dddの
方は通常のcuaa0を使いました。
$
kldload uplcom
$ cu -l /dev/cuaU0 -s 19200
$ ddd --debugger "sh-hitachi-elf-gdb -x gdbstartup jsp"
3月18日
サーボモータ制御のテストプログラムを作成して実験を行ないました。下がメインループを抜粋したプログラムです。TOPPERSのサンプルプログラムのメインループを以下のサーボプログラムに変更しました。プログラムは目標値と現在値の差分を2倍してPWMのカウンタに設定する簡単なP制御を行ないます。PWMに設定できる範囲は+−1000ですが、あまり大きくするとオーバシュートが
大きくなるので、+−600に制限しています。LEDをスクロールしている周期関数で目標値を変更して自動で移動動作させます。10000回に1回は状態をシリアル出力します。動画をリンクしておきます。動画は約4Mバイトです。
// 自動移動テストプログラムのメインループの抜粋
#define COUNTER_MAX
600
#define
COUNTER_MIN -600
#define
MOTOR2_DIR 0x0008
// P制御定数
Kp = 2;
while (1) {
// モータ2の現在値を得る
Count2 = (short)*TCNT2;
// 周期関数から目標値を得て設定値を計算する
Err = (M_y - Count2) * Kp;
// 設定値を制限する
if (Err >= COUNTER_MAX) {
Err = COUNTER_MAX;
}
else if (Err <= COUNTER_MIN) {
Err = COUNTER_MIN;
}
// 設定値をモータ2ドライバへ出力する
if (Err < 0) {
// 反転
sil_wrh_mem (PEDR, sil_reh_mem (PEDR) & ~MOTOR2_DIR);
sil_wrh_mem (TGR4B, (Err * -1));
}
else {
// 正転
sil_wrh_mem (PEDR, sil_reh_mem (PEDR) | MOTOR2_DIR);
sil_wrh_mem (TGR4B, Err);
}
// 10000回に1回はシリアルへ出力する
if (!(Loop % 10000))
syslog(LOG_INFO, "Count=%d State=%d Err=%d\n", Count1, Y_state, Err);
Loop++;
}
次に使っていない方のロータリエンコーダから手動で
設定値を設定できるプログラムに変更します。ロータリエンコーダを回転させると追従してモータが回り
ます。これは実際にミッションに取りつけて移動量を調べるためのプログラムです。調子づいてエンコーダを反復してぐるぐる回していたら、ボードの電
源に入っている15Aのヒューズが飛びました。トルクが
かかると大電流が流れるようです。タミヤのページにスペックがあります。ここをクリックしてください。こちらも動画をリンクしておきます。動画は約6Mバイトです。
//
手動移動テストプログラムのメインループの抜粋
早速、実際にミッションに付けて実験します。ミッションを台車に乗せてPCの近くまで移動し、モータベースをミッションに取り付けます。
とりあえず、トルクが足りるか心配のある前後の移動の実験を行ないます。回転方向は3速―4速に固定して、モータも外しておきます。
予め手動のロータリエンコーダで移動させ3速ー4速間の移動量を調
べます。結果は+−550となりました。プログラムを変更して自動的に+−550移動するように周期関数に設定します。現在のモータの減速比は75:1ですが、タミヤでは特注で納期はかかるものの、60:1、36:1などのモータも売っています。少し動作が遅いような感じですので、減速比の小さなモータでも実
験する予定です。減速比を小さくするとトルクも小さくなるので、この辺は色々と実験する必要がありそうです。以下のプログラムは周期関数の先頭部分で3速ー4速の目標値を設定
している部分です。これも動画をリンクしておきます。動画は約7Mバイトです。
//
LEDスクロール周期関数の先頭の抜粋
// ニュートラルから開始
Tloop++;
if (!(Tloop % 10)) {
if (Y_state == 0) {
M_y = -550; // 3速に移動
Y_state = 1;
}
else if (Y_state == 1) {
M_y = 550; // 4速に移動
Y_state = 2;
}
else if (Y_state == 2) {
M_y = 0; // ニュートラルに移動
Y_state = 0;
}
}