CNCの実験6:2010.01.02(土)〜 CNCの実験1:2005.10.29(土)〜 / スピンドル交換。P_CAD。CardNC。
関連ページへリンク CNCの実験5:2008.01.22〜2009.12.31 V形カッター加工機。P_CAD作成。 CNCの実験4:2007.01.01〜2007.09.19 BLモータ。SAL7078。V形カッター。 CNCの実験3:2006.07.03〜2006.12.31 CNC App作成。XYZ送り精度。基板パターン切削。スピンドル。SLA7078。基板の平面度補正。 CNCの実験2:2006.01.03〜2006.06.30 CNC App、DXF2NC App、HPGL2NC Appなどの作成。-- CNCの実験1:2005.09.04〜2005.12.31 X,Y,Z軸改造。CNC App作成。 マイクロフライス盤の改造 CNCソフトの作製 VC#で作製。 コード変換ソフトの作製 DXFコードをNCコードに変換。 V型カッターの実験(1) V型カッターの実験(2)
2013.04.21(日) 1相駆動と2相駆動のステップ対回転角の測定 1相駆動 2相駆動 ステップ対回転角の直線性がよく、高トルクが期待できます。 2013.04.06(土) 1/16分割ステップ対回転角の測定 回転角補正無し 回転角補正有り 2013.03.31(日) 1/8分割ステップ対回転角の測定 回転角補正無し 回転角補正有り 2013.03.23(土) 1/2分割ステップ対回転角の測定 PWMの補正なしでも直線性の良い特性です。 2013.03.09(土) 回転角測定の方法 アクリル板の先端をUSBカメラで撮ります。 計測ソフトのスケール較正は直尺(JIS 1級)で行います。 赤い線の上端から下端までが垂直方向の1mmです。 計測ソフトで見たアクリル板の先端 一相のみ励磁しアクリル板の先端に十字の基準線を設定します。 分割ステップ毎に基準線からアクリル板の先端迄の距離を計測します。 回転角(度)=ASIN(L/R)*180/PI()=ASIN(0.262/32.897)*180/PI()=0.456(度) L=基準線から先端迄の距離(mm) R=モータ軸中心から先端迄までの半径(=32.897mm) 2013.03.02(土) 回転角補正 分割ステップ毎にPWM変調率を調整しました。 2013.02.24(日) 分割ステップ対回転角の測定。 計算値のグラフは、4分割目の回転角の平均値=1.73度を均等に4分割して プロットしました。 理想的な4分割目の回転角は1.8度ですが、測定精度や読み取りの誤差により 1.7度付近でばらつきます。 2013.01.27(日) ステップモータの回転数対電流特性の測定。 CL=電流制限(Current Limit)はPWM変調率を変えて電流を制限。プログラムで 回転数98rpm以下を検出しCLをオン。実験で回転数73rpm以下でCLの効果を確認。 停止電流は各回転数で回し、停止させた時の値。停止位置は不定。 電流はモータシリーズに挿入した0.1Ω端をテスタの電圧レンジで測定。 モータ仕様 2相ユニポーラー。200ステップ。1.8度/ステップ 巻線:4.2Ω/巻線。(定格電流=1A/相) 2013.01.19(土) モータ電流波形測定 測定回路 ┌───────────> モータへ │ ─┴─ 12V ┬ │ ●─────┐ │ ┌─┴─┐ 0.1Ω │DSO│or デジタルテスタ(電圧レンジ) │ └─┬─┘ └─────●─────> GND 位相基準PWMモード(三角波状のタイマカウント) モータ軸回転数=289rpm PWM繰り返し周期=64μsec(15.6KHz) 高速PWMモード(ノコギリ波状のタイマカウント) モータ軸回転数=289rpm PWM繰り返し周期=32μsec(31.3KHz) タイマカウンタのオーバーフロー毎のグリッチ電流が目立ちます。 このグリッチ電流でステッピングモータの回転音やモータ電流(平均値)に変化は ありません。 2013.01.12(土) ステッピングモータを回す モータ軸回転数=289rpm モータ電源電圧=12V モータ電流(テスタの10Aレンジで測定) 回転時=1.21A 停止時=2.14A モータ仕様 2相ユニポーラー。200ステップ。1.8度/ステップ 巻線:4.2Ω/巻線。(定格電流=1A/相、17PM-J149U相当品?) モータ相制御 ATtiny2313:メインプログラムを定期的に繰り返して回転信号を出力 PWMモード :位相基準PWM PWM繰り返し周期=64μsec(15.6KHz) 1ステップを4分割駆動 モータスイッチング MP4401:モータドライブ FET 4回路入り モータドライブブロックダイア / S1 ┌──────┐ ┌──────┐ ┌──────┐ ┌○○─┤モータ相制御├─+a─┤モータ駆動用├─+A─┤ステッピング├┐モータ │ / S2 │4相のPWM生成├─-a─┤スイッチング├─-A─┤モータ │├─電源 ├○○─┤ ├─+b─┤ FET 4回路 ├─+B─┤1.8°/step ││ │ │ATtiny2313A ├─-b─┤ MP4401 ├─-B─┤ ├┘ ┴ └──────┘ └──────┘ └──────┘ S1=モータ回転スタート/ストップスイッチ S2=回転方向切換えスイッチ 2013.01.09(水) 4相のPWM信号波形。 1ステップを4分割駆動。 1ステップ期間=1.038msec。(+a相頂点から+b相頂点までの期間) 分割期間=0.258msec。 200ステップモータで軸回転数=289rpmに相当。 時間軸拡大。PWMデータの切換わり。 4分割PWMデータ $FF,$EC,$B4,$62,$00,$00,$00,$00 $00,$00,$00,$00,$00,$62,$B4,$EC PWMモード 位相基準PWM。 PWM繰り返し周期=64μsec(15.6KHz)。 2012.12.29(土) 位相基準PWMモードの出力 上:+a相。PWM比較レジスタ=$FF(常時Hi出力) 下:+b相。PWM比較レジスタ=$00(常時Lo出力) +b相に高速PWMモードで発生したタイマオーバーフローのグリッチがありません。 但し、PWMの周期が高速PWMモードの2倍に長くなります。 上:+a相。PWM比較レジスタ=$FF 下:+b相。PWM比較レジスタ=$01 +b相のPWMパルスを拡大。 +b相PWM比較レジスタ=$01に対応したパルス幅が出力されます。 位相基準PWMモードのタイマカウントの変化は、$FFまでインクリメント するとデクリメントに切換わる三角波状です。 /\ /\←タイマカウンタの変化 / \ / \ / \ / \ / \ / PWM比較値 \/ \/ \/  ̄ ̄ ̄ ̄ ̄ ̄ ┌─┐ ┌─┐ ┌─┐ ─┘ └─────┘ └─────┘ └─ PWM波形 │ │ │ ──┴───────┴───────┴── TOV割り込み要求 高速PWMモードのタイマカウンタの変化は、オーバーフローすると $00にリセットさるノコギリ波状です。 / / / / / │ / │ / │ / │ / \ / │ / │ / │ / │ / PWM比較値 \/ / / / /  ̄ ̄ ̄ ̄ ̄ ̄ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ──┘└──┘└──┘└──┘└──┘└─ PWM波形 │ │ │ │ │ ──┴───┴───┴───┴───┴── TOV割り込み要求 │ │ │ │ │ ──┴───┴───┴───┴───┴── グリッチ 2012.12.25(火) PWMの出力。 高速PWMモードの場合。 上:+a相。PWM比較レジスタ=$FF(常時Hi出力) 下:+b相。PWM比較レジスタ=$00(常時Lo出力) タイマカウンタがオーバーフローした時に+b相にグリッチが出ます。 +b相の誤パルスを拡大。 タイマカウンタの1カウントクロック幅に相当します。 オーバーフローのグリッチで、例えば+A相をオンしている間に+A相の磁力を打ち消す 一瞬の電流が-A相に流れます。 +b相PWM比較レジスタ=$01にした時。+a相PWM比較レジスタ=$FF。 オーバーフローのグリッチが加わって、本来あるべきPWMパルスの2倍になります。 PWMを出力反転に設定し、PWM比較レジスタの設定値を反転すると 上:+a相。PWM比較レジスタ=$00(出力反転でHiを出力) 下:+b相。PWM比較レジスタ=$FF(出力反転でLoを出力) Lo出力にオーバーフローのグリッチは無くなりますが、Hi出力にオーバーフローグリ ッチスが出ます。 +a相の誤パルスを拡大。 磁力を打ち消すような電流は流れませんが、Hiパルスの幅がタイマカウンタの1クロ ック分短くなります。 PWMを出力反転に設定で、 +a相比較レジスタ=$01にした時。+b相比較レジスタ=$FF。 Lo期間=グリッチ幅+PWMパルス幅 2012.12.16(日) ステッピングモータドライブ回路を検討中のブレッドボード。 手前にATtiny2313。奥(ジャンパー線の影)にMP4401。 ステップパルスはタクトスイッチで入力。 回転方向はトグルスイッチで入力。 2012.12.09(日) Card_NC用のステッピングモータドライブの検討。 C_NCブロックダイア ┌──────┐ ┌──────┐ ┌────┐ ┌──────┐ │Card_NC │ │モータ相制御│ │モータ │ │ステッピング│ │G-CODE解析 ├─┤ATtiny2313 ├─┤スイッチ├─┤モータ │ │CLK,DIR生成 │ │ │ │ング │ │ │ │ATmega1284 │ └──────┘ └────┘ └──────┘ └──────┘ ├←───────────→┤ モータドライブ モータ相制御 入力:CLK(ステップパルス) DIR(回転方向) 出力:4相(+a,-a,+b,-b)のPWM信号 分割:1、2、4、8 (ステッピングモータの1ステップの分割数) モータスイッチング 入力:4相のPWM信号(+a,-a,+b,-b) 出力:4相のモータ駆動(+A,-A,+B,-B) (〜2A) ステッピングモータ 1) 巻き線はユニポーラータイプ。 2) 1ステップ角=1.8°(200ステップで1回転) モータドライブブロックダイア ┌──────┐ ┌──────┐ ┌──────┐ CLK ──┤モータ相制御├─+a─┤モータ駆動用├─+A─┤ステッピング├┐モータ │4相のPWM生成├─-a─┤スイッチング├─-A─┤モータ │├─電源 DIR ──┤ ├─+b─┤ FET 4回路 ├─+B─┤1.8°/step ││ │ATtiny2313A ├─-b─┤ MP4401 ├─-B─┤ ├┘ └──────┘ └──────┘ └──────┘ 2012.08.08(水) Card_NC、MMCソケット、キー基板を製作しました。 2012.07.09(月) 基板カット台を製作しました。 1. 基板縦100mm×横60mm以上をセットします。 常用の生基板は100mm×150mm。 2. 直尺の縁にカッターを沿わせV溝を切ります。 3. 基板を裏返しV溝を切ります。 4. V溝で基板を折ります。 出来上がりは縦100mm×横50mm。 加工範囲 X:Y=100mm:45mm の小型CNCフライス盤用です。 2012.06.28(木) ボールペンホルダーを製作しました。 C_NC基板の切削ルートを描画。 ボールペンの傾きは約60度。アクリル板t8mm。44mm×65mm。 外形、コラムへの取付穴、ボールペンの取付用長穴をCNCで切削。 F100、5000rpm、切込量0.2mm。 2012.06.18(月) C_NC基板を作図しました。 2012.05.23(水) シミュレーションAppにステップパルス発生方式の選択を追加しました。 P1からP5のラジオ釦で選択します。 アクセル/ブレーキをONすると ch0:X軸パルス。ch1:Y軸パルス。 ch2,ch3:アクセル終了とブレーキ開始の各ポイント。ch2=X軸,ch3=Y軸。 原点から G00 X3.00 Y0.10 で移動した場合。 アクセルとブレーキのパルス出力タイミングが非対称です。 また、X軸とY軸のパルス出力タイミングがずれるため、移動の軌跡が非直線です。 計算精度を倍精度浮動小数点(P1,P2)と8ビット固定小数点(P3)で比較しても同様の 結果です。 有効な処理方法が見つかるまでアクセル/ブレーキはOFFにします。 2012.03.07(水) アクセルの速度変化をシミュレーションしました。 1) 倍精度浮動小数点精度で基準を計算。 青でプロット。比較のため+側にオフセット。 2) 固定小数点以下8ビットの精度で計算。 赤でプロット。 3) 固定小数点以下16ビットの精度で計算。 緑でプロット。比較のためー側にオフセット。 アセンブラで扱いやすい固定小数点以下8ビットを用いる予定です。 2012.02.18(土) LCDモジュールの制御系とデータバスを1ポートに集約。 集約前のポートマップ b7 b6 b5 b4 b3 b2 b1 b0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ PORTC │ │ │ │ │ │E │RW│RS│ └─┴─┴─┴─┴─┴─┴─┴─┘ b7 b6 b5 b4 b3 b2 b1 b0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ PORTD │D7│D6│D5│D4│ │ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┘ 集約後のポートマップ アセンブルスイッチ LCD_PORT_SET で設定を切換え。 LCD_PORT_SET = 0 b7 b6 b5 b4 b3 b2 b1 b0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ PORTD │ │E │RW│RS│D7│D6│D5│D4│ └─┴─┴─┴─┴─┴─┴─┴─┘ LCD_PORT_SET = 1 (LCDモジュールと合わせた配置) b7 b6 b5 b4 b3 b2 b1 b0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ PORTD │ │D7│D6│D5│D4│E │RW│RS│ └─┴─┴─┴─┴─┴─┴─┴─┘ b7は単独でI/Oのビット操作が可能。 RS=Register Select RW=Read/Write E = Enable D4-D7 = LCDモジュールを4ビットモードで使用。 2012.02.07(火) 4軸の増速、減速時のステップパルスです。 実測値:増速期間=1.67s。減速期間=1.61s。 計算値:停止から定格速度(F1000)までと、定格速度(F1000)から停止までの 所要時間は共に1.67s。 加速度=10mm/ss。 問題点:1)各軸間のパルス終了位置がずれる。 A軸のパルスが終了してからX軸のパルスが停止するまで約96msec。 A軸の停止からX,Y,Zが停止するまでのパルス数は X=39パルス、切削距離で0.0975mmに相当。 Y=21パルス、切削距離で0.0525mmに相当。 Z=9パルス、 切削距離で0.0225mmに相当。 2)減速不足でパルスが終了する。 パルス周期(ms)で比較 増速初期値 減速最終値 X= 14.96 14.97 Y= 14.92 3.19 Z= 14.95 3.41 A= 14.96 4.11 原因 :増減速中は各軸ごとにパルス周期を積み上げて計算するため誤差が累積。 対策案:各軸が共通で使用するタイムベースを増減速に合わせて可変にする。 実行したGCODEは、 g01 x50.0 y40.0 z30.0 a20.0 F1000 g00 x0.0 y0.0 z0.0 a0.0 ステップモータ: 各軸共に200step/r。 ステップ倍率 : X=2,Y=4,Z=8,A=16。 送りねじリード: X=1mm,Y=2mm,Z=4mm,A=8mm。 バックラッシュ: X=0,Y=1,Z=2,A=3 (パルス)。 2011.12.31(土) X軸の立上がりに加速処理を追加しました。 加速度=10mm/ss。定常速度=200mm/min。初速度=5mm/min。 加速期間 実測値=0.333s 計算値=0.325s =(定常速度-初速度)÷加速度÷60 加速中のステップパルス周期は、パルス出力開始前に求めた係数(K)を経過時間で 割って求めます。 Ta = K÷Tt 但し、K = 41667*Tp*F÷α K=係数 F=定常速度(mm/min) Tp=定常時のパルス周期(t_count) Ta=加速中のパルス周期(t_count) Tt=加速開始からの経過時間(t_count) α=加速度(mm/ss) 20000000=タイマ分周器のクロック周波数(Hz) 8=タイマ分周比 t_count=タイマカウント値 加速中のステップパルス周期計算式の展開 定常速度>初速度 で初速度は省略。 Tp*F 20000000*Tp*F 41667*Tp*F K Ta = ----------------- = ----------------- = -------------- = ------ Tt*8*60*α Tt*8*60*α Tt*α Tt ------------- 20000000 2011.11.26(土) CNCパラメータファイルをカードから読出しEEPROMに保存しました。 マイコン起動後にEEPROMのデータをチェックし、保存されていない場合に、 ファイルの読出しを促します。 EEPROMのデータはSRAMにコピーし、パルス係数などを計算します。 Root DIRにSETTINGのSUB DIRを設けました。 SETTING DIRの内容 拡張子が"SET"の時、CNCパラメータファイルとします。 SETTING.SETファイルを選択し、データを読出します。 データをSRAMとEEPROMに保存し、パルス係数などを計算します。 SETTING.SETの記述例: ; CNCパラメータ ; ステッピングモータのステップ数(step/rev) X_MOTOR_STEP=200 ; Y_MOTOR_STEP=200 ; Z_MOTOR_STEP=200 ; A_MOTOR_STEP=1000 ; ; ステッピングモータの1ステップ倍率 X_STEP_MULTI=2 ; Y_STEP_MULTI=4 ; Z_STEP_MULTI=8 ; A_STEP_MULTI=16 ; ; 送りねじのリード(mm) X_SCREW_LEAD=1.000 ; Y_SCREW_LEAD=2.000 ; Z_SCREW_LEAD=5.000 ; A_SCREW_LEAD=10.000 ; ; バックラッシュ・パルス数 X_BL_PULSE=5 ; Y_BL_PULSE=6 ; Z_BL_PULSE=7 ; A_BL_PULSE=8 ; ; 送りの速度 AER_MOVE =200 ; ツール移動速度(mm/min) CUT_SPEED =1000 ; 切削速度(mm/min)(GCODEのF値が優先) ACCELE_BRK=10 ; スタート・ストップ増減速(mm/sec^2) 2011.11.19(土) Card初期化、MasterBootRecordとBiosParameterBlockの読出し DIR(Root)の読出し ファイル数を表示 Root DIRの表示 ファイル名で昇順バブルソート(DIR優先) SUB_DIR1の表示 Root DIRに戻しGCODE1.TXTを実行 GCODE1.TXTの実行終了 2011.11.09(水) ステップパルスとDIR出力を確認。 ステップパルスは観測用に下図のように出力しました。 ┌┐ ┌┐ ┌┐ ┌┐ 本来のパルス ──┘└───┘└───┘└───┘└── ┌────┐ ┌────┐ 観測用 ──┘ └────┘ └─── 実行したGコード。 F1000。GコードはCardから読み込み。 g01 x0.1 y0.1 z0.1 a0.1 g01 x0.0 y0.0 z0.0 a0.0 パラメータ 軸 | モータ |μstep |ねじリード|バックラッシュ |step/rev| 倍率 | mm |パルス数 ----+--------+-------+----------+--------------- X 200 2 1 5 Y 200 4 2 6 Z 200 8 5 7 A 200 16 10 8 2011.11.05(土) CardNC用各種サブルーチン。 名前: gcode_check 機能: Gコードの解析 引数: str_bufに1行分のGコード文字列 戻値: 切削の有無(CUT_ON_FLG)。X,Y,Z,Aの移動先(x,y,z,a_next_pos)。 名前: nc_exec 機能: Gコードの実行 引数: x,y,z,a_pulse_intv。 x,y,z,a_tcnt_cmp 出力: DIR、CLOCK 名前: get_max_diff 機能: 移動長(差分の絶対値)の最大値を求める 戻値: max_diff=各軸のなかで最大の移動長(絶対値) dir_flg=各軸の移動方向フラグ設定。1=-方向。 名前: move_time_cal 機能: 移動時間計算 (タイマカウント) 引数: max_diff 戻値: move_time_cnt 名前: x,y.z.a_pulse_diff_cal 機能: 移動分(差分)のパルス数を計算 引数: x,y,z,a_cur_pos。x,y,z,a_next_pos 戻値: x,y,z,a_pulse_count X,Y,Z,A_MOVE_ONフラグ設定 名前: x,y.z.a_pulse_diff_cal 機能: パルス周期を計算 (タイマカウント) 引数: cal_00-02=pulse_count(移動分の絶対値) 戻値: x,y,z,a_pulse_intv。 x,y,z,a_tcnt_cmp 名前: x,y.z.a_step_pulse_out 機能: ステップパルス出力(CLOCK) 引数: x,y,z,a_pulse_intv。 x,y,z,a_tcnt_cmp 2011.11.04(金) マイコンによるパルス数とパルス周期の計算結果。表計算と一致しました。 左から、パルス数(3byte)、パルス周期(5byte) 計算条件: 上から -----------+----+----------+--------+--------- モータ | μ |ねじリード|移動距離| F (step/rev) |step| (mm) | (mm) |(mm/min) -----------+----+----------+--------+--------- 200 2 1 10 1000 200 4 2 9 200 8 5 8 1000 16 10 7 2011.11.04(金) CardNC 実験の様子 2011.11.02(水) パルス数を表計算。 モータのステップ数、ステップの倍率、送りねじリード、移動距離、移動速度を入力 すると、移動時間、パルス数、パルス周期などが求まります。 マイコンの計算ルーチンの検証に使用します。 2011.10.31(月) CNCパラメータの読出しと設定。 パラメータファイルをring_bufに読出し、文字列を数値に変換してパラメータ変数に 格納します。次にパルス係数Kaを計算します。 サブルーチン: 名前: setting 戻値: x〜a_motor_step, x〜a_step_multi, x〜a_screw_lead : x〜a_backlash, aer_move_speed, cut_move_speed, accele_brake : x〜a_pulse_Ka ファイルの記述例 (デバッグ用にフラッシュROMに記述) ; CNCパラメータ ; ステッピングモータのステップ数(step/rev) ; 2 4 6 8 0 2 4 6 8 (byte) .db "X_MOTOR_STEP=200",$0D,$0A ; .db "Y_MOTOR_STEP=200",$0D,$0A ; .db "Z_MOTOR_STEP=200",$0D,$0A ; .db "A_MOTOR_STEP=1000 ",$0D,$0A ; ; ステッピングモータの1ステップ倍率 ; 2 4 6 8 0 2 4 6 8 (byte) .db "X_STEP_MULTI=2",$0D,$0A ; .db "Y_STEP_MULTI=4",$0D,$0A ; .db "Z_STEP_MULTI=8",$0D,$0A ; .db "A_STEP_MULTI=16 ",$0D,$0A ; ; 送りねじのリード(mm) ; 2 4 6 8 0 2 4 6 8 0(byte) .db "X_SCREW_LEAD=1.000",$0D,$0A ; .db "Y_SCREW_LEAD=2.000",$0D,$0A ; .db "Z_SCREW_LEAD=5.000",$0D,$0A ; .db "A_SCREW_LEAD=10.000 ",$0D,$0A ; ; 送りのバックラッシュをパルス数で与える ; 2 4 6 8 0 2 4 6 8 (byte) .db "X_BL_PULSE=5",$0D,$0A ; X軸バックラッシュパルス数 .db "Y_BL_PULSE=6",$0D,$0A ; Y軸バックラッシュパルス数 .db "Z_BL_PULSE=7",$0D,$0A ; Z軸バックラッシュパルス数 .db "A_BL_PULSE=8",$0D,$0A ; A軸バックラッシュパルス数 ; 送りの速度関連を与える ; 2 4 6 8 0 2 4 6 8 (byte) .db "AER_MOVE =200",$0D,$0A ; ツール移動速度(mm/min) .db "CUT_SPEED =1000 ",$0D,$0A ; 切削速度(mm/min)(NCコード記述優先) .db "ACCELE_BRK=10 ",$0D,$0A ; スタート・ストップ増減速(mm/sec^2) .dw $0000 ; 2011.10.26(水) パルス係数Kaをパルス数計算の精度向上のため変更。パルス係数Kbは廃止。 Ka(pulse/μm)=モータステップ数×ステップ倍率×16777216÷送りねじリード(μm) パルス数=移動距離(μm)×Ka÷16777216 ÷16777216は積の下位3バイトを切り捨てる。 2011.10.15(土) パルス数の計算。 P=D×M×S÷L P=パルス数(pulse) D=移動距離または原点からの距離(mm) M=ステッピングモータの基本ステップ数(step/rev) S=1ステップ当たりのパルス数(pulse/step)(マイクロステップ比) L=送りネジのリード(mm/rev) M×S÷Lは各軸の係数でKa(pulse/mm)とすると P=D×Ka 整数計算のためmm単位の小数点数字文字列をμm単位の数値に変換 d(μm)=1000×D(mm) P=d×Ka÷1000 ATmega1284に除算命令が無いので2進数の割り算に適した式に変形 P=d×Ka×1.024÷1024 (1024は2の10乗) 計算精度向上のため P=d×Ka×16777.216÷16777216 (16777216は2の24乗) 16777.216×Kaの積を小数点以下第一位で四捨五入し、Kbとする P=d×Kb÷16777216 ÷16777216は、d×Kbの積の下位3バイトを切捨てればよく、÷1000より処理が速い。 KaとKbはシステムの起動時に計算しておき、パルス数やパルス周期を求める時に利用 する。 Ka、Kbの計算例: M=200(step/rev) S=2(pulse/step) L=1(mm/rev) Ka=200×2÷1=400(pulse/mm) Kb=Ka×16777.216=400×16777.216=6710886 小数点以下第一位で四捨五入 サブルーチン: 名前: pulse_cal 引数: cal_00-02=dを設定。原点からの距離又は移動距離。符号付き24ビット。 cal_10-13=Kbを設定。パルス係数。符号無し32ビット。 戻値: cal_00-02=パルス数。符号付き24ビット dの範囲: -8,388,608〜8,388,607(μm)。(0x800000〜0x7FFFFF) dの範囲は戻り値の制限から-1,000,000〜1,000,000(mm)で使用。 μmからmmへの変換はサブルーチン内で実施。 Kbの範囲: 4,294,967,295以下。(0x00000000〜0xFFFFFFFF) (Kaは255,999以下。) 実行時間: 6.24μsec。 (d=1,000,000μm,Ka=400,Kb=6710886で結果が400,000pulseの時) 2011.10.05(水) 数字文字列を数値に変換。 10進数の数字文字列を16進数の数値に変換します。 1) 正数 ┌───────────────── ─ ─┐ str_temp│1123\00 │ └───────────────── ─ ─┘ ↓4バイトの16進数をレジスタcal_00〜cal_03に格納。 ┌─┬─┬─┬─┐ レジスタ│00│00│04│63│ └─┴─┴─┴─┘ cal_03 _02 _01 _00 2) 負数 ┌───────────────── ─ ─┐ str_temp│-1123\00 │ └───────────────── ─ ─┘ ↓4バイトの16進数(2の補数)をレジスタcal_00〜cal_03に格納。 ┌─┬─┬─┬─┐ レジスタ│FF│FF│FB│9D│ └─┴─┴─┴─┘ cal_03 _02 _01 _00 サブルーチン: 名前: num2val 引数: str_temp=数字文字列。文字列の終端は$00。 戻値: cal_00-cal03に変換した数値。 数値の範囲: -2147483648〜2147483647(0x80000000〜0x7FFFFFFF) 実行時間: 11.7μsec。 2011.09.25(日) 数字文字列を整形。 単位1mmの数字文字列を、単位1μmに変更します。 1) 小数点を削除 ┌───────────────── ─ ─┐ str_temp│1.123\00 │ └───────────────── ─ ─┘ ↓ ┌───────────────── ─ ─┐ str_temp│1123\00 │ └───────────────── ─ ─┘ 2) 少数点以下3桁に整形し、小数点を削除 ┌───────────────── ─ ─┐ str_temp│10.\00 │ └───────────────── ─ ─┘ ↓ ┌───────────────── ─ ─┐ str_temp│10000\00 │ └───────────────── ─ ─┘ サブルーチン: 名前: num_trim 引数: str_temp=数字列 戻値: str_tempに整形した数字文字列。文字列の終端は$00。 : 小数点以下を3桁に調整。元の数字文字列が3桁未満なら末尾に'0'を追加。 : 整形した数字文字列は1μm単位。 : 数字文字列の終端は$00。 実行時間:3.8μsec(10.を10000に整形した場合) 2011.09.22(水) 数字文字列のコピー。 軸名までをオフセットし、続く数字文字列をstr_tempにコピーします。 ┌───────────────── ─ ─┐ str_buf │G00 X1.123 Y0.456 Z0.5\00 │ └───────────────── ─ ─┘ ├→│str_bufの先頭から'X'までのオフセット ↓ 'X'に続く数字文字列をコピー。 ┌───────────────── ─ ─┐ str_temp│1.123\00 │ └───────────────── ─ ─┘ サブルーチン: 名前: num_copy 引数: str_buf=コピー元の文字列。文字列終端=$00 : acc=軸名までのオフセット=str_cmpの戻り値。 戻値: str_tempに数字文字列をコピー。オフセット位置の文字は除く。 : 数字文字列の終端は$00。 : temp=コピーした文字数。'.'も含む。終端の$00は除く。 実行時間:3.96μsec 2011.09.18(日) 文字列の検索。 str_tempの文字列と一致する文字列をstr_buf内で検索します。 1) 1文字検索 ┌────── ─ ─┐ str_temp│X\00 │ └────── ─ ─┘ └→┐ ┌───────────────── ─ ─┐ str_buf │G00 X1.123 Y0.456 Z0.5\00 │ └───────────────── ─ ─┘ ↓ 'X'1文字が一致すれば、str_bufの先頭から'X'までのオフセットを求 め、Cflg=1を返します。 1) 複数文字検索 ┌────── ─ ─┐ str_temp│G00\00 │ └────── ─ ─┘ ↓ ┌───────────────── ─ ─┐ str_buf │G00 X1.123 Y0.456 Z0.5\00 │ └───────────────── ─ ─┘ ↓ 'G00'の3文字が一致すれば、str_bufの先頭から'G00'の先頭までの オフセットを求め、Cflg=1を返します。 サブルーチン: 名前: str_cmp 引数: str_buf=検索される文字列。文字列終端=$00 : str_temp=検索する文字列。文字列終端=$00 戻値: Cflg=0 文字列不一致 : Cflg=1 文字列一致 : acc=str_bufの先頭から一致した文字列の先頭までのオフセット : temp=一致文字数。文字列終端=$00は除く。 実行時間: 17.6μsec (オフセット=20で一致した場合) 2011.09.14(水) 英小文字を英大文字に変換します。 ┌───────────────── ─ ─┐ str_buf │g00 x1.123 y0.456 z0.5\00 │ └───────────────── ─ ─┘ ↓ ┌───────────────── ─ ─┐ str_buf │G00 X1.123 Y0.456 Z0.5\00 │ └───────────────── ─ ─┘ サブルーチン: 名前: str2upper 引数: str_buf=変換対象の文字列。文字列終端=$00 戻値: str_buf=変換後の文字列。 : temp=str_buf内の文字数(終端の\00は除く)。 実行時間: 15.2μsec 2011.09.10(土) MMCからNCコードファイルの1セクタ分をSRAM(ring_buf)に読出します。 1セクタは512バイト、ring_bufは2セクタ分の領域を確保します。 ring_bufに1セクタ分以上の空きがあれば続きのセクタを読出します。 次に、ring_bufから1行分の文字列をstr_bufに取り出します。 ファイルの1行の終端は\0D\0Aで、str_bufでは文字列の終端を\00に置き換えます。 ┌───┐ │ MMC │ └───┘ ↓ ┌────────────────────── ─ ─ ─ ─┐ ring_buf│g00 x1.123 y0.456 z0.5\0D\0Ag01 Z-0.5 ・・・・・・・・・│ └────────────────────── ─ ─ ─ ─┘ │←──────────── 1024Byte ─────────→│ ↓ ┌───────────────── ─ ─┐ str_buf │g00 x1.123 y0.456 z0.5\00 │ └───────────────── ─ ─┘ │←─────── 81Byte ───────→│ 2011.09.07(水) MMCの実験の応用編。 CardNC(C_NC)の実験。 仕様: NCコード記録媒体 = Multi Media Card。1GByte or 2GByte。 媒体記録フォーマット= FAT16。 使用マイコン = ATmega1284P。クロック=20MHz。 フラッシュ=128Kバイト。SRAM=4Kバイト。 プログラム言語 = アセンブラ。 制御軸数 = 3軸。X、Y、Z。 出力形式 = ステップビット+移動方向ビット。 計算上の最小分解能 = 1μm。 最大移動範囲 = ±1000mm。 送り速度目標 = 200mm/min以上。 対応NCコード = G00、G01、(G02、G03)。 表示 = 4行20桁LCDモジュール。ファイルの選択などに使用。 構成: ┌──────┐ ┌───────┐ ┌────┐ ┌────┐ │PC(Windows) │ ┌──┐ │C_NC │ │ステップ│ │フライス│ │CADで作図 │→│MMC │→│NCコード解析 ├─┤モータ駆├─┤盤 │ │NCコード生成│ └──┘ │ステップパルス│ │動 │ │ │ │Card書込み │ │生成 │ │ │ │ │ └──────┘ │LCD制御 │ └────┘ └────┘ └───────┘ │←─────→│ 実験をする部分 2011.05.15(日) 絶縁物の平面度測定冶具を製作しました。 先端を約0.6mm押し込むとオンし、この時の押力は約6.8g。 押し込み量はノギスで、押力は100円硬貨(4.8g)×1+1円硬貨(1g)×2)で測定。 基板の平面度を40mm×40mmピッチ10mmで測定。 真鍮製の探針(上)と冶具(下)との比較。 冶具の方が数値が多少大き目ですが、実用の範囲です。 2011.05.08(日) 弁当箱の蓋を3CH_DRO用の操作パネルに加工しました。 LCDの窓やスイッチの取付け穴等はΦ1mmのエンドミルで切削。 文字列はV形カッターで彫刻。切込みは0.2mm。 墨入れが充分で無い為に文字がかすれています。 Y軸の移動範囲が狭いので、弁当箱の蓋を2回に分けてずらして加工しました。 2011.04.30(土) CNC Appの平面度測定の設定パネルを変更しました。 XとYそれぞれに測定ピッチの設定を追加。 次の測定ポイントへ移動する時のツール先端の高さの設定を追加。 その他デバッグ。 1)平面度測定中に[中止]をした後に、手動でZを上昇させたとき、X0,Y0に戻る件を修 正。 対策:平面度測定ルーチンで[中止]検出後にG00 X0 Y0を発行する前に、同ルーチン を終了する様に判定文を追加。 2)切削中、移動中、平面度測定中などで[中止]をしたときに次のGコードが即終了す 件を修正。 対策:Gコード実行前にmill_brakeフラグをfalseに書き換え。 2011.04.23(土) 基板切削 字高=約2.2mm。 切削幅=約0.25mm。 60度Vカッター(超鋼H10F)。切削速度=F100。スピンドル回転数=7,000rpm。 2011.04.21(木) プリント基板の平面度を測定。 測定範囲40mm×80mm。X,Y方向各10mm間隔で測定。 基板:紙フェノール片面基板。t1.6mm。 1枚目。最大で-35μm。 2枚目。最大で-53μm。 3枚目。最大で-63μm。 2011.04.19(火) 破損した継ぎ手の代替品を製作し、減圧吸着テーブルに取り付けました。 Φ10mmのPOM材を加工。チューブ取付部Φ5mm、内径Φ2mm、フランジΦ10mm。 12mm │←────→│ Φ2mm │ ┌┐ │ ↓ ┌──┘└──┐── ──└──────┘ ↑ ──┌──────┐ ↓Φ5mm ↑ └──┐┌──┘── └┘ ││ →││← 2mm 2011.04.17(日) Zの軸受けにスラストベアリングを採用。 1日以上放置した後でZ軸を上昇させたときに1回だけ発生する脱調が無くなりました。 変更前のZ軸受けは滑り軸受けのため、滑り出しの負荷が重かったようです。 上からスラストベアリング(T1260、内径6Φ、外形12Φ)、 下からボールベアリング(696ZZ、内径6Φ、外形15Φ、幅5)、 でZ軸の軸受板を挟んでいます。 Z軸のモータ取付板を0.9mmの鉄板から3mmのアルミ板に変更。 2011.04.14(木) バックラッシュの測定と設定。 X:10ステップ=25μm Y:9ステップ=22.5μm Z:10ステップ=25μm 2011.04.12(火) X軸の回転にゴリ感があり脱調した為、ベアリングを交換しました。 軸受け板を左からボールベアリング(TAMIYA 53065、内径6Φ、外形12Φ)で、 右からスラストベアリング(T1260、内径6Φ、外形12Φ)で挟みました。 2011.04.08(金) Y軸受ベアリングとモータ取付板の交換を完了しました。 2011.03.18(金) Y軸モータ取り付け板が変形して衝撃を吸収した様です。 Y軸の軸受けブロック。軸の回転にゴリ感があります。ベアリング要交換。 送りねじの変形は無いようです。 Y軸の軸受けブロックを取り付けるネジ穴。 強引にネジが引き抜かれたため、ネジ山がバカになっています。 2011.03.12(土) 地震でCNCフライス盤がテーブルから落下。 Y軸のモータ取り付け板が曲がり、Y軸の送りネジが変形したもよう。 2010.11.19(金) テスト切削。 ピン間2本相当。 L1=切削の幅。L2=部品リード穴。L3=パターン幅(ピン間2本相当)。 切削速度=F100。切削深度=70μm。スピンドル回転数=10,000rmp。 V形カッター(60度、材質=H10F)。 2010.11.18(木) スピンドルをルーターに変更しました。 POM製固定リングにルーターを挿入し、 左からボトルで固定。 固定リングは上下2箇所のベアリングホルダー部分に使用。 芯振れは約15μm。回転数は1,000〜20,000rpm。 カバーに穴あけ。 取外した回転数制御基板、モータ、スピンドル。 2010.02.15(月) P_CADの図面拡大・縮小をマウス・ホイール回転に連動するようにしました。 向こう側回転で拡大。手前側回転で縮小します。 2010.02.02(火) P_CADに相対位置表示を追加しました。 グラフ内でマウスの左ボタンをクリックした位置を基点にして、 マウスカーソルまでの相対位置と距離を表示します。 x=,Y=はグラフの原点からの位置。 ()の左が相対位置。 ()の中の()は基点から相対位置までの距離。 2010.01.23(土) 線の連結チェックの設定メニューを追加しました。 「端と端で連結]のチェックは線の中間での接続を除きます。 幹は2本の線で中央付近で連結しています。 「全ての連結]のチェックは、線の中間での接続も含めて検出します。 枝先をクリックしても、連結する全ての線を検出します。 2010.01.02(土) 図面スクロールを追加しました。 図形表示領域の上下左右の枠にマウスカーソルを近づけると、表示中の図面をスクロ ールします。
CNCの実験へ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system