2024年3月31日日曜日

自作CPUで遊ぶ 23

昔、DDS IPを作りその応用としてFUNCTION GENERATORを作った。その時に出力をオシロスコープにつないで幾つかのリサージュ図形を描画させたが、その一つに下図のような図形もあった。 そのデータがまだ残っていたので、これを変換してCNCで描画させてみたのだがうまく動かない。
スピンドルの動きを見ると図形通りに動いていない。 パルス生成部から出力されるPCNT値を抽出して表計算ソフトで散布図を描かせてみた。 UARTを追加してZumi32のソフトからprintfで値をダンプできるようにしたおかげでこのようなことは容易にできる。 描画結果は合っているので、FPGA部分は問題なさそうだ。
色々調べた結果、どうも電源の容量が足りていないようだ。 もっと容量の大きい電源に交換しなくては。。 


 ちょっとまだ速い気もするが、上記と平行してGUIアプリの画面を作り始めている。
なんかまだ機能を入れ忘れている気もしているのだが。。。

今作っているCNCの動作モードとしてはプログラムモードとマニュアルモードがある。前者はガーバープログラムを実行するモード、後者は手動でスピンドルの位置などを操作するモードだ。 画面の左側はプログラムモード用だ。ガーバープログラムは複数を登録できるようにする。最上段のChoice部で実行するプログラムを選択する。 選択されたプログラムの内容はその下のエディタ部に表示される。ここで編集も可能だ。最下部のボタン類でプログラムをロードしたり、編集したり、編集したものをファイルに出力したり、実行したり、中止したり出来る。 
画面の右側は主にマニュアルモード用だ。 最上部のEM STOPは非常停止用ボタンだ。その下の黒い部分はスピンドルの軌跡を描画する。その下のX lmt, ... はリミットスイッチ等の状態表示だ。このアプリはwxWidgets ライブライを使っているが、wxWidgetsにはLED表示器のようなのがないのでcheck boxで代用している。果たして旨く行くかどうか。。  その下の左側はX, Y, Zの移動量と速度、及び各軸の原点設定用のボタンだ。X/Y/Zボタンをクリックするとその時の各軸の位値が原点に設定される。ORIGINボタンをクリックすると3軸が同時に原点設定される。 右側のX+, X-, ...はスピンドルの位置を手動で移動させるためのボタンだ。ボタンを押下している間その方向に移動する。 最下部のModeボタンはプログラムモードとマニュアルモードを切り替える。Goto Zをクリックするとスピンドルを原点に移動する。Auto ZはZ軸の自動原点設定用ボタンだ。Spindleはスピンドルの回転のON/OFFを設定する。PumpはポンプのON/OFFを設定する。 
パルスモータの加速度やDI/DOの極性設定などは常時表示させる必要はないので別ダイアログで操作させるつもりだ。
このアプリはZYBOのPetalinux上で動かす。PetalinuxはSimpleframe bufferでX Windowも動くようになっているのでZYBOのHDMI出力にモニタをつないで表示させることも出来るし、別PCからssh -Xログインして別PC上のXサーバーに表示することも出来る。

… と、まぁこんな感じで構想しているのだが、うまく行くかな?

その前に電源をなんとかせねば。

2024年3月24日日曜日

自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。
Micro Stepが大きければ大きいほどパルス当たりの移動量が小さくなり分解能が上がるが、軸の移動速度とは反比例の関係になるので最高移動速度が下がってしまう。また、最高速度はパルスモーターの回転数の上限とも関係する。Micro Stepが800, 1600, 3200, 6400の場合の上限値を実機で探ってみたところ以下のような結果になった。但し、この値は無負荷(切削していない)状態の値なので、実負荷では下がる可能性がある。
3200以上のMicro Stepの場合の最高移動速度が遅く感じたので今回は1600を設定することにした。 
次に以下のプログラムをzumi32で走らせ、移動速度を色々と変えてX方向150mm, Y方向50mmの矩形を描画してみた。
X方向 60000 [pulse/sec]、Y方向 56000 [pulse/sec]の場合

実際に切削する場合はもっと遅い速度で動かすことになる。 X方向が脱調しているように見える部分もあるが描画した矩形の寸法はほぼ150mm×50mmだった。

2024年3月10日日曜日

自作CPUで遊ぶ 21

コロナに感染してしまった。 ... orz 
最初は妻が発熱の症状になり、二日後に私も発熱した。発熱の具合としては私のほうが重く40℃超まで上がった。全身は痛むし・ガタガタ震えるほど悪寒はするしで非常にシンドかった。熱は3日目位から下がり今は平熱に戻っている。鼻水や喉の痛みや疲労感があり、頭が少しクラクラしているが回復して来ている。 5日間の休養期間も終わったので月曜からは仕事に復帰できそうだ。


さて、CNCだが当初は下図のように*_en信号で動作のON/OFFを制御するようにしていた。
この方法だけだとX/Y軸を同時に加減速制御しながら正確にパルス数のパルスを発生させるのが面倒なので、生成するパルス数( = 移動量)と起動パルスを与えて動作するモードも追加することにした。また、手動送りで移動させる場合などは前者の方法が向いているので両方の制御方法に対応させることにした。前者が手動送り用、今回追加するのがプログラム動作用だ。
以下はプログラム動作モードをシミュレーションした結果だ。 スピンドルがP0(x0,y0)からP1(x1,y1)への移動指示が来た場合ソフトウェアはこれをX, Y各軸の移動量に変換しその値を設定してkickすることになるがこれをシミュレートした。 この例ではXの移動量(= パルス数)を1000、Yのそれを3000とした。P0→P1への送り速度を1000000、加速度を100とした。(テキトーな値) これからX/Y各軸の設定値を図のように求めた。
波形最下部のXY-AXIS speedはX/Y各軸の速度をテストベンチで合成(y = sqrt(X速度^2 + Y速度^2))した結果だ。 以下は加速部の拡大。X/Y軸の加速期間は一致しており、定速時の速度は設定値に一致している。
以下は減速部の拡大。X/Y軸の減速期間はほぼ一致しており、停止時の総パルス数(*_pcnt)は設定値(*_pnum)に一致している。
以下は手動送り動作をシミュレートした結果。 速度や加速度などのパラメータは上記のままで、x_feedを1にしてX軸のみを動作させている。x_feedが1になると加速し、設定速度に達すると定速動作に以降しx_feedが0になると減速して停止する。総パルス数は加速開始から減速終了(停止)までなので、この動作の場合はx_feedが1の期間よりも余分にパルスが発生(移動する)ことになる。
上記以外にもRTLに若干の変更を加えた。具体的にはzumi32のプログラムのデバッグ効率を上げるためにUARTを追加した。これをZYNQ-PSのUART0と接続した。
これでzumi32側のプログラムからのデバッグメッセージをPS側(Petalinux)で見ることができる。 以下はプログラムの例だ。1秒周期のタイマー割り込みの割り込みハンドラ内からprintf関数を使って"Hello World 数字\r\n"文字列を送信させている。 このprintfは30〜40年くらい前にスクラッチから作成したもので最終的にsend_str()をコールする。(引数は表示する文字列) 浮動少数型には対応していないが今回のようなデバッグ用途には十分使える。
Petalinux側はminicomを動かした。
正常にメッセージを受信している。

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...