AVRでアセンブラーの練習 2008.09.29(月)〜LessonA_09。 パワーフィードの実験。
著作者名: 中野 良知 作成開始: 2008.09.28(日) 更新 : 2009.05.02(土) △1 取扱い説明書(ATmega88用)作成。
目次 1. 目的 2. 機能 3. 使用マイコン 3.1. 動作クロック 3.2. ヒューズビット 4. ゼネラルフローチャート 4.1. mainフロー 4.2. タイマー0割込みフロー 5. アセンブリスイッチ 5.1. タイマー0 5.2. 四捨五入 5.3. しおり機能のデバッグ 5.4. カウント値表示 6. ロータリーエンコーダー 6.1. 出力信号 6.2. チャタリング処理 6.3. Aの立下りエッジチェック 7. ステップパルス 8. しおり 8.1. 「しおり」の操作と動作 8.2. 「しおり」の設定 8.3. 「しおり」位置の検出 9. 送り速度の設定 9.1. デフォルトの送り速度 9.2. 高速送り速度の設定 9.3. 低速送り速度の設定 9.4. 送り速度の計算式 10. 増速・減速 11. 数値の範囲 12. 乗算 12.1. 計算のフロー 13. 各部の所要時間 14. 実験回路 15. プログラムソースリスト 16. 経過 1. 目的 ロータリーエンコーダーとステッピングモーターを使ってパワーフィードの実験。 手動パルス発生装置です。 2. 機能 1. ロータリーエンコーダーの1クリック毎に1個のステップパルスを出力。 2. FF釦で+方向に、FR釦で−方向にそれぞれ高速移動のステップパルスを出力。 3. ステップパルス出力前に移動方向に対応したディレクション信号を出力。 4. SPEEDスイッチで移動速度を高速(空送り)と低速(切削)に切換え可能。 5. バックラッシュ補正可能。 補正量はステップパルス数で設定。 6. 1ステップパルス当たりの送り量の表示をnm単位で設定が可能。 7. 6桁の7セグメントLEDで移動量(mm)を表示。-99.999〜999.999。 8. しおり機能付き。 指定位置で送り停止。 往復の繰り返し切削に便利。 9. FFとFRの移動開始と停止で増速と減速が可能。 10. 表示のリセットが可能。 3. 使用マイコン ATtiny2313を使用します。 全てのデバッグが終了した段階でヒューズビットを書き換えてRESET端子を汎用ポート PA2に切換えます。 PA2は「しおり」スイッチ入力ポートです。 3.1. 動作クロック ATtiny2313の内蔵RC発信器をクロック分周比=1/1。動作クロック=8MHzで使用します。 基本命令サイクルは0.125usecで実行されます。 3.2. ヒューズビット 1) 内蔵RC発信器。 下位ヒューズバイトのCKSEL0〜3は0100(工場出荷時の値)です。 較正済みの8MHzを使用します。 2) クロック分周比=1/1。 下位ヒューズバイトのCKDIV8を1に設定します。 3) RESET端子を汎用ポートに設定。 デバッグ中はRESET仕様にしておきます。「しおり」の機能は「SPEED」スイッチで 代用してデバッグし、プログラムのデバッグが終了した段階でRESET端子を汎用ポ ートのPA2に切換えます。 上位ヒューズバイトのRSTDISBを0に設定します。 拡張、上位、下位の各ヒューズバイトは以下の値です。 ; FUSE BIT : Pin No.1=RESET=FFDFE4 ; : Pin No.1=PA2 =FFDEE4 (注)RESET端子をPA2に切換えると、以後シリアル書込みが出来なくなります。 RESET仕様には、パラレル書込みで戻します。 4. ゼネラルフローチャート 4.1. mainフロー (スタート) │ 各種初期設定 │ バックラッシュ分のCW移動 ├←──────────────┐ (main10) │ │ 0 │ <PULSE_ON_FLGフラグ?> →──┐ │ ↓1 │ │ カウントを移動長に変換 │ │ │ │ │ 10進数変換 │ │ 表示RAM設定 │ │ │ │ │ 0と負号の右寄せ │ │ │ │ │ パルス出力 │ │ バックラッシュ処理 │ │ ├←───────────┘ │ (main30) │ │ │ 7segLED表示 │ │ │ カウンターリセットチェック │ │ │ しおりスイッチチェック │ │ │ └───────────────┘ 4.2. タイマー0割込みフロー (intr_t0ovf) │ ステータスを退避 │ タイマ0カウンタ設定 │ 1msecカウンタ更新 │ 1msec割込みフラグセット │ 1 <PULSE_ON_FLGフラグ?> →──────────┐ ↓ │ │ yes │ <FFオン?>→─ speedカウンタ更新 ────┐ │ ↓ yes │ │ <FRオン?>→─ speedカウンタ更新 ──┐ │ │ ↓ │ │ │ Rotary A,B入力 │ │ │ チャタリング処理 │ │ │ │ no │ │ │ <立下がりエッジり?>─(終了) │ │ │ │ ccw │ │ │ <回転方向>→────────────┤ │ │ ↓cw │ │ │ ├←───────────────│─┘ │ │ │ │ (cw_count) │ │ │ │ │ PULSE_ON_FLGセット │ │ │ │ │ CW回転方向出力 │ │ │ │ │ しおり検出チェック │ │ │ │ │ 正転カウント │ │ │ │ │ └────────────────│───┤ │ │ ┌────────────────┘ │ (ccw) │ │ │ PULSE_ON_FLGセット │ │ │ CCW回転方向出力 │ │ │ しおり検出チェック │ │ │ 逆転カウント │ │ │ ├────────────────────┘ │ ステータスを復帰 │ (終了) 5. アセンブリスイッチ アセンブル疑義命令 .if〜.else〜.endifを使用してアセンブルするルーチンを選択 します。 タイマー0の割込み周期選択、四捨五入のオン・オフ、しおり機能デバッグ、 カウント値表示などを切換えてアセンブルを行います。 5.1. タイマー0 タイマー0の割込み周期を選択します。 定数PRE_SCALE_SELに設定する値(0〜3)によりタイマー0の割込み周期が変わります。 0:1msec 1:0.5msec 2:0.25msec 3:0.125msec またこの値によりロータリーエンコーダーのチャタリング処理回数が変わります。 例: .equ PRE_SCALE_SEL = 0 ; プリスケーラーの選択。0=1/64,1=64,2=1/8 ; TCNT0の設定。0=1msec,1=0.5msec,2=0.25msec .if PRE_SCALE_SEL == 0 ; .equ PRE_SCALE = $03 ; 1/64。タイマスタート .equ TCNT0_SET = 256 - 125 ; msec、CLOCK=8MHz、Pre Scale=1/64、8usec .endif ; 5.2. 四捨五入 定数ROUNDに0を設定すると少数点4桁目での四捨五入をOFFにします。 1を設定すると四捨五入をONします。 例: // 四捨五入 .equ ROUND = 1 ; 四捨五入。0=OFF,1=ON // 四捨五入 .if ROUND == 1 ldi num20,$64 ; 分母=100 ldi num21,$00 ; ;ldi num22,$00 ; div_2digの使用により省略 ;ldi num23,$00 ; div_2digの使用により省略 rcall div_2dig ; rcall sub_round ; .endif 5.3. しおり機能のデバッグ 「しおり」機能のデバッグをSPEEDスイッチで代用します。 定数B_MARK_DEBUGに1を設定すると、SPEEDスイッチONで「しおり」スイッチオンと 同じ動作をします。 (注意)ヒューズビットのRSTDISBLを0に書き換えるまで「しおり」スイッチはマイコ ンのリセットスイッチとして機能します。 例: // しおり機能デバッグ .equ B_MARK_DEBUG = 0 ; SPEED SWで代用 .if B_MARK_DEBUG == 1 sbic PIND, SPEED_SEL ; デバッグ暫定入力 .else sbic PINA, B_MARK_SW ; .endif 5.4. カウント値表示 6桁7segLEDにロータリーエンコーダーのカウント値を表示します。 例: // カウント値表示 .equ COUNT_DISP = 1 ; パルスカウントの表示 .if COUNT_DISP == 1 rcall count2decimal ; パルスカウント値表示 .else // カウントを移動長に変換 // COUNT×5000(nm) 6. ロータリーエンコーダー端子は左からA、C、B ATtiny2313 ┌────┐ │ │4 B┌────┐ │ PA1├─────┤Rotary │ │ │5 C┌─┤encoder │ │ PA0├─────┤ │ │ │ │ A└────┘ └────┘ │ ──●── GND ポートPA0とPA1はATtiny2313内部でプルアップします。 6.1. 出力信号
10msec/div。パルス幅は回転速度で変化します。 A:右回転A信号。 B:右回転B信号。 1:左回転A信号。 2:右回転B信号。 右回転 ↓ ↓クリック安定点 ─────┐ ┌───────────────── A └───┘ │ ─────┐ ┌─────────────── B └─────┘ │ │ │ 左回転 │ │クリック安定点 ─────┐ ┌──────────── A └────────┘ │ ─────────┐ ┌──────────── B │ └────┘ │ │ └ Aの立下り検出後、Bの状態で回転方向を決定します。 6.2. チャタリング処理 A信号のチャタリング。
50usec/div。 説明で使用しているacc、new、fixはATtiny2313のレジスターに付したラベルです。 1) ポートAを1msec毎にサンプリングします。 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ─────┐ ┌───────────────── A └───┘ ─────┐ ┌─────────────── B └─────┘ 2) サンプリングしたデータの下位2ビット以外をマスクします。 in acc, PINA ; ポートA入力 andi acc, $03 ; 下位2ビット以外をマスク accのb0,b1に入力状態が反映します。 ┌─┬─┬─┬─┬─┬─┬─┬─┐ │ 0│ 0│ 0│ 0│ 0│ 0│b1│b0│ └─┴─┴─┴─┴─┴─┴─┴─┘ 3) accと1回前にサンプリングしたデータ(new)と比較します。 a) 不一致ならば、今回サンプリングしたデータを(new)へ代入し、 チャタリング処理を終了します。 b) 一致ならばチャタリング除去が完了、入力が確定します。 4) 前回確定したデータ(fix)とaccでデータを交換します。 データ交換にpush,pop命令を使いました。 push acc ; push rotary_fix ; pop acc ; pop rotary_fix ; チャタリング処理のサンプル回数はチャタリングカウンター(chat_cnt)で設定可能で す。 デフォルトは1です。 A,Bの入力信号に対してfixの変化は1msecから2msec遅れます。
5msec/div 上:A入力信号。 下:fixのb0。 6.3. Aの立下りエッジチェック チャタリング処理で入力の変化が確定したあと、Aの立下りエッジをチェックします。 acc=前回確定した入力状態。 fix=今回確定した入力状態。 ↓b0 ┌─┬─┬─┬─┬─┬─┬─┬─┐ acc │ 0│ 0│ 0│ 0│ 0│ 0│b1│ 1│ └─┴─┴─┴─┴─┴─┴─┴─┘ ↓ ┌─┬─┬─┬─┬─┬─┬─┬─┐ fix │ 0│ 0│ 0│ 0│ 0│ 0│b1│ 0│ └─┴─┴─┴─┴─┴─┴─┴─┘ │ ↓ ↓ └ 立下りエッジ └ ディレクション accとfixのb0が1と0の時がAの立下りエッジで、fixのb1がディレクションです。 7. ステップパルス ステッピングモータ駆動用IC(サンケン SLA7078)に供給するステップクロックパルス と回転方向信号を出力します。 ├──┤2μsec ┌──┐ ┌──┐ CLOCK ──────┘ └─────────┘ └────── ┌────────────┐ CW・CCW ───┘ └──────────── ├──┤2μsec CLOCK立上りの2μsec手前でCW・CCWを出力します。 CLOCK幅は2μsecを確保します。 ロータリーエンコーダーを右回転した時にCW・CCW=1を出力します。 2μsecの遅延は、rcallとretを含めて16命令サイクルを消化するサブルーチンを使用 します。 16(命令)×0.125(μsec/命令)=2μsec。 CW・CCWはタイマー0の割込み処理で、ロータリーエンコーダーの回転方向やFFまたは FRスイッチオンにしたがって出力します。 CLOCKはmainルーチンで出力します。 mainルーチンへの出力指令は PULSE_ON_FLGフラグで伝達します。 PULSE_ON_FLGフラグはタイマー0の割込み処理で生成します。 タイマー0の割込み処理で、ロータリーエンコーダーの回転、FF又はFRスイッチオン 等を検出しPULSE_ON_FLGフラグをセットします。 PULSE_ON_FLGフラグはCLOCK出力の他に、パルスカウントのnm変換や表示データ生成 ルーチン等の実行を指令します。 8. しおり 「しおり」で設定した位置で移動を停止する機能です。 CW移動方向のA点と、CCW移動方向のB点の2つのしおり位置設定が可能です。 8.1. 「しおり」の操作と動作 「しおり」SWをオンにします。 (-) → A (+) ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─ CW方向に移動し、A点で「RESET/B_SET」SWをオンします。 "-A-"が表示され、「しおりA」が設定されます。 (-) A (+) ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─ ○←→× 「しおり」SWがオンの時、A点から左へ移動可能です。 A点から右へは移動できません。 (-) B A (+) ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─ ←←←←←←←← CCWでB点まで移動し、「RESET/B_SET」SWをオンします。 "-b-"が表示され、「しおりB」が設定されます。 B点から左へは移動できません。 (-) B A (+) ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─ ←←←←←←←← →→→→→→→→ 「しおり」SWがオンの時、AB間の移動が可能です。 1) A点のみまたはB点のみの設定が可能です。 2)「しおり」SWをオフにすると、A点およびB点での自動停止がなく、A点、B点を超え た移動が可能です。 3)「しおり」SWを再びオンにすると、A点およびB点の設定が復活します。 4)「しおり」SWがオフで「RESET/B_SET」SWをオンすると、「しおりA/B」の設定を 解除します。 8.2. 「しおり」の設定 サブルーチン(b_mark_sw_check)で、 1) 「しおり」SWがオンで「RESET/B_SET」をオンすると、現在位置をSRAMの4バイト に保存します。 2) 「しおり」オンフラグをセットします。 現在位置は、ロータリーエンコーダーの回転、FFスイッチオン、FRスイッチオンなど で更新するカウンターの値です。 8.3. 「しおり」位置の検出 ロータリーエンコーダーの回転、FFスイッチオン、FRスイッチオンなどで現在位置カ ウントを更新する前にサブルーチン(b_mark_det_check)で、 1) 「しおり」スイッチがオンで、 2) 移動中の方向の「しおり」設定フラグがセットされていれば、 3) SRAMに保存した「しおり」位置と現在位置を比較します。 比較の結果を戻り値(キャリーフラグ)に設定します。 サブルーチン(b_mark_det_check)の戻り値(キャリーフラグ)が 1 ならば、しおり位置一致 → 移動停止 → 現在位置カウント更新禁止。 0 ならば、しおり位置不一致 → 移動許可 → 現在位置カウント更新。 です。 9. 送り速度の設定 FFまたはFRスイッチをオンした時の送り速度をSPEEDスイッチで切換えます。 切換えは低速と高速の2通りです。 アセンブル時の定数値を変更する事で送り速度を変更します。 9.1. デフォルトの送り速度 SPEED High:ステップパルス周波数=6KHz(F1800) SPEED Low :0.6KHz(F180) です。 F値は 1) 送りねじリード8mm。 2) ステップモータ200パルス/回転。 3) 8分割マイクロステップ。 の条件で計算しました。 9.2. 高速送り速度の設定 定数MAX_SPEED_SELに設定した数値で最大送り速度を設定します。 設定値は10〜60で増分は5ステップです。(10,15,20,25,30,35,40,45,50,55,60) 例1: .equ MAX_SPEED_SEL = 60 ; ×100Hz。10〜60。 でステップパルス周波数を6KHzに設定します。 例2: .equ MAX_SPEED_SEL = 15 ; ×100Hz。10〜60。 でステップパルスを1.5KHzに設定します。 定数 SPEED_HIGHは1(固定値)を設定します。 .equ SPEED_HIGH = 1 ; 高速側。1/1。1に固定。 定数MAX_SPEED_SELの値により 定数PRE_SCALE = タイマー0のプリスケーラー設定値 定数TCNT0_SET = タイマー0のカウント値 定数FADE_AREA = 増速・減速領域を指定 が決定します。 PRE_SCALEとTCNT0_SETでタイマー0の割込み周期が決まり、タイマー0の割込み毎に PULSE_ON_FLGフラグをセットし、mainルーチンに対してステップパルスの出力を指令 します。 9.3. 低速送り速度の設定 定数SPEED_LOWで、低速送り速度を設定します。 高速送り速度÷SPEED_LOWで低速送り速度が求まります。 SPEED_LOW=10で低速送り速度は、高速送り速度の1/10です。 定数SPEED_LOWの設定範囲は、1〜255です。 定数SPEED_LOWの値を変数speedに設定し、タイマー0の割込み毎にデクリメントし ます。 変数speedが0になるとPULSE_ON_FLGフラグをセットし、mainルーチンに対し てステップパルスの出力を指令します。 例1: .equ MAX_SPEED_SEL = 60 ; ×100Hz。10〜60。 で .equ SPEED_LOW = 10 ; 低速側。1/10。1〜255で設定。 ならば高速送りのステップパルス周波数は6KHzで、低速送り速度のステップパルス周 波数は0.6KHzです。 9.4. 送り速度の計算式 送り速度F(mm/min)=1÷(T×N)×S×60 T=割込み周期 N=SPEED_LOW(1〜255)またはSPEED_HIGH(=1)の値。 S=1ステップパルス当たりの送り量(0.005mmなど)。 S=L÷K÷M L=送りねじリード(8mmなど) K=ステップモータの1回転当たりのフルステップ数(200ステップ/回転など) M=マイクロステップ分割比(2分割、4分割、8分割、16分割など) 計算例: S=L÷K÷M=8mm÷200ステップ/回転÷8分割=0.005mm N=10 T=1msec F=1÷(T×N)×S×60=1÷(1msec×10)×0.005mm×60sec/min=30mm/min 10. 増速・減速 FFとFRの移動開始と停止の時のステップモータの脱調を防止する為に、徐々にステッ プモータの回転数を上昇させたり降下させたりします。
縦軸はステップパルスの周波数。 横軸はステップパルスの発生順。 .equ FADE_AREA = 30 ; ステップ数・増速・減速処理カウンタ この定数はいくつかの設定項目に共通で使用します。 1) 移動開始から高速送り速度に至る迄のステップパルス数に用います。 2) 高速送り速度から移動停止に至る迄のステップパルス数に用います。 3) 移動開始時のステップパルス周波数設定に用いて、高速送り速度の1/FADE_AREAに 設定します。 4) 停止直前のステップパルス周波数設定に用いて、高速送り速度の1/FADE_AREAに設 定します。 移動開始: 1) FADE_AREAの値を変数fade_countと変数speedに代入します。 2) タイマー0の割込み毎にspeedをデクリメントします。 3) speed=0になるとPULSE_ON_FLGフラグをセットし、fade_countをデクリメントし、 speedにfade_countをコピーします。 4) 高速送りでは、fade_countが1になるまでステップパルス周波数が上昇します。 低速送りでは、fade_countがSPEED_LOWになるまでステップパルス周波数が上昇し ます。 (参考) 低速送り速度=高速送り速度÷SPEED_LOW です。 移動停止: 1) speedにfade_countをコピーします。 送り速度が定常状態に達している場合、fade_countの値は高速送りで1、低速送り でSPEED_LOWです。 2) タイマー0の割込み毎にspeedをデンクリメントします。 3) speed=0になるとPULSE_ON_FLGフラグをセットし、fade_countをインクリメントし 、speedにfade_countをコピーします。 4) fade_countがFADE_AREAになるまでステップパルス周波数が降下します。 注意) 低速送り速度を設定するSPEED_LOWの値は、SPEED_LOW<FADE_AREA に設定する 必要があります。これは、低速送り速度が増速および減速の最低速度より速い 事を意味します。 FADE_AREAの値は、アセンブルスイッチ(.ifk〜.endif)によってMAX_SPEED_SELの値に 応じて決定します。 11. 数値の範囲 1) nm変換の乗算結果は32ビット長。 数値範囲は0〜4294967295nmで0〜4294.967295mm。 乗算前にロータリーエンコーダーのカウント値を絶対値に変換し、負数は符号フ ラグで取り扱う為、上記の数値範囲は正負の移動方向で共通です。 2) ロータリーエンコーダーのクロックカウントは32ビット長。 1ステップ当たりの移動量が5000nmの場合のロータリーエンコーダーのクロックカ ウント値は 4294967295nm / 5000nm = 858993.459 = $D1B71 4バイトで間に合います。 1ステップ当たりの移動量が1000nmの場合のロータリーエンコーダーのクロックカ ウント値は 4294967295nm / 1000nm = 4294967.295 = $418937 こちらも4バイトで間に合います。 3) 7segLEDは符号を含めて6桁で、-99.999〜999.999を表示。 表示範囲を超える場合のロータリーエンコーダーのカウントに制限はありません。 12. 乗算 変数1=変数1×変数2 を実行します。 変数1=32ビット長(被乗数) 変数2=16ビット長(乗数) 変数1にロータリーエンコーダーのクロックカウント値を代入し、 変数2にnm変換用の係数を代入します。 12.1. 計算のフロー 1) 答えをクリアします。 2) 変数2を右へ1回シフトしてLSBをキャリーフラグへ送ります。 変数2(16ビット) キャリーフラグ ┌───────┐ ┌─┐ │MSB LSB│→│ │ └───────┘ └─┘ 右シフト 3) キャリーフラグが a) 1なら変数1を答えに加えて4)へ。 b) 0なら4)へ。 4) 変数1を左へ1回シフトします。 変数2(32ビット) ┌──────────────┐ │MSB LSB│ └──────────────┘ 左シフト 5) 16回 2)〜4)を繰り返します。 6) 繰り返しが終了したら、答えを変数1にコピーします。 参考:変数2が5000の場合、繰り返しの回数を13にすると計算が早く終了します。 5000(10進)=1388(16進)=0001001110001000(2進) 2進の上位3ビットが0の為、繰り返しを省略できます。 13. 各部の所要時間 ルーチン名 所要時間 内容 -----------+-----------+------------------------------------------ multi 55.2usec 乗算。乗数が変数タイプ(デフォルトで使用) X5000 *26.8usec 乗算。乗数が定数タイプ hex2decimal 25.6usec 表示=0.000mmの時。除数の桁数を最適化。 60.8usec 表示=999.995mmの時。除数の桁数を最適化。 *66.4usec 除数桁が4桁で固定。 intr_t0ovf 7.4usec タイマー0割込み。FFスイッチオン。 led_drive 6.2usec 7segLED 6桁。 main20〜 122.0usec nm変換から表示バッファー設定まで。 *印の値は参考値です。 デフォルトでは、X5000の代わりにmultiを、hex2decimalでは除数の桁数の最適化を 使用します。 ロータリーエンコーダーのカウント値(P_CNT0-3)に、 表示=0.000mmで$00000000。 表示=999.995mmで$00030D3F。 を代入して測定。 14. 実験回路 ATtiny2313 ┌────┐ │ │20 │ VDD├───────────────●───────┬─ +5V │ │ │ │ │ │ │┴│100u/10V │ │ │ └┬┘ │ │ │10 │ │ │ GND├───────────────●─────●─── 0V │ │ │ │ │ │4 B┌────┐ │ │ │ PA1├─────────┤Rotary │C │ │ │ │5 │encoder ├──────● │ │ PA0├─────────┤ │ │ │ │ │ A└────┘ │ │ │ │ │ │ │ │ │ │ │ │1 / しおり │ │ │ (PA0├─────○ ○─────────────● │ │ │ │ │ │ │2 ─┴─ RESET/B_SET │ │ │ PD0├─────○ ○─────────────● │ │ │ │ │ │ │3 ─┴─ FF │ │ │ PD1├─────○ ○─────────────● │ │ │ │ │ │ │6 ─┴─ FR │ │ │ PD2├─────○ ○─────────────● │ │ │ │ │ │ │7 / SPEED │ │ │ PD3├─────○ ○─────────────● │ │ │ │ │ │ │ ┌────┐ ┌──────┐ │ │ │ │8 │SLA7078 │ │ステッピング│ │ │ │ PD4├─────┤CLOCK │ │モーター │ │ │ │ │9 │ ├─┤1.8度/STEP │ │ │ │ PD5├───●─┤CW/CCW │ │ │ │ │ │ │ │ └────┘ └──────┘ │ │ │ │ │ │ │ │ │ └───────┐ │ │ │ │ CCW │ CW │ │ │ │ ┌─┐ │ ┌─┐ │ │ │ │ ┌┤>├─ R4.7K─●─ R4.7K─┤>├─┘ │ │ │ │└─┘ └─┘ │ │ │ └────────────────────┘ │ │ │ │19 ┌─────────────────── CA1 │ PB7├───●──R470────────┓a │ │18 ┌────────────┃────── CA2 │ PB6├───●──R470────────┨b │ │17 ┌────────────┃────── CA3 │ PB5├───●──R470────────┨c │ │16 ┌────────────┃────── CA4 │ PB4├───●──R470────────┨d │ │15 ┌────────────┃────── CA5 │ PB3├───●──R470────────┨e │ │14 ┌────────────┃────── CA6 │ PB2├───●──R470────────┨f │ │13 ┣━━━━━━ a〜dt │ PB1├──────R470────────┨g │ │12 ┃ │ PB0├──────R470────────┛dt │ │11 │ PD6├──────R470─────────────── FB │ │ └────┘ 注意) PA2を有効にすると以後シリアルプログラミングが利用できなくなります。 シリアルプログラムを利用出来る状態に戻す為には、パラレル書込みで ヒューズビットを書換える必要があります。 CA1───────────────────────┐ CA2───────────────────┐ │ CA3───────────────┐ │ │ CA4───────────┐ │ │ │ CA5───────┐ │ │ │ │ CA6───┐ │ │ │ │ │ │ │ │ │ │ │ ┌┴─┐┌┴─┐┌┴─┐┌┴─┐┌┴─┐┌┴─┐ │7seg││7seg││7seg││7seg││7seg││7seg│ │LED ││LED ││LED ││LED ││LED ││LED │ └┬┰┘└┬┰┘└┬┰┘└┬┰┘└┬┰┘└┬┰┘ │┃a〜e│┃a〜d│┃a〜c│┃a〜b│┃a │┃b〜g │┃g │┃f〜g│┃e〜g│┃d〜g│┃c〜g│┃dt a〜dt │┃dt │┃dt │┃dt │┃dt │┃dt │┃ ━━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛ │f │e │d │c │b │a FB ───●───●───●───●───●───┘ CAxはコモンアノードでxは桁No。 a〜dtは信号バス。 FBはFloat Bit。 15. プログラムソースリスト LHZ形式で圧縮してあります。 TePa2_20081204 *1 ATtiny2313用です。 *2 RESETポートをしおりスイッチ入力に使用します。 *3 送り速度、mm換算係数、バックラッシュ、スタート・ストップの増減速傾斜等の 設定変更は、プログラム変更で対応します。 16. 経過 △1 2009.05.02(土) 取扱い説明書(ATmega88用)を作成しました。 2009.05.01(金) 回路図にマウント図を追加しました。 ATmega88用回路図・マウント図 2009.04.27(日)
左端にスピード切換えスイッチとスピード調節用ボリュームを追加しました。 スピード調節ボリュームはATmega88のADC5(28pin)に接続し、直近8回分のAD変換デ ータの移動平均で耐ノイズ性能を向上。 周波数切換わりの境界に閾値を設け、ステップモータの安定した回転を実現。 ボリュームの摺動範囲を32等分し、ステップパルスの出力周波数を200Hzきざみで調 節可能。 調節範囲は200Hzから6.4KHz。 2009.04.17(金) ATmega88用回路図を作成しました。 2009.04.09(木) ATtiny2313用からATmega88用へのプログラム移植検討。 1) .includeを"tn2313def.inc"から"m88def.inc"に 2) PORT割付 3) 割込みベクタ 4) ヒューズビット などを変更し、ATmega88で従来からの動作を確認。 次に 1) 外部セラミック発振子(16MHz)の使ってCLOCK出力の高速化。 2) 「しおり」スイッチを追加して操作性改善。 の実験しました。 ROM容量の増加と命令実行時間の高速化で、プログラムの改善が容易になります。 2008.12.21(日) ロックヒルさんロックヒルさんの工房でX3に実装してテストをしました。 結果: 8分割マイクロステップでF400(5.4KHz、MAX設定)。走行音が静かです。 2分割(1-2相励磁)でF1200(4KHz)。走行音が少し大きくなります。 脱調することなくステップモーターが回りました。 条件: X軸送りねじ=リード2mm。バックラッシュ30μm。 相電流設定=3A。 増速・減速傾斜係数=1次×3。2008.12.18(木)の特性図を参照。 2008.12.18(木) 増速・減速の方式検討。
方式1:前回検討した2次曲線的な増速・減速特性。 方式2:今回検討した直線的な増速・減速特性。 ロックヒルさんの工房でX3に実装。(投稿No.664から画像をお借りしました。)
方式1で実験し、高速送りになる手前で脱調しました。 方式2を後日テストさせて頂ければと思います。 2008.12.04(木) 本資料に増速・減速の項目を追加。 2008.11.26(水) モータの回転開始と停止で、増速と減速の処理を検討しました。
起動時のモータ脱調が無くなりました。 2008.11.16(日) SPEED High/Low、1ステップ当りの移動長換算係数、バックラッシュパルスカウント 等をEEPROMに保存し、各ルーチンで読み出して使用する実験と、カウンターリセット スイッチの長押しで分岐し、EEPROMのデータを変更する実験をしました。 .def acc = R16 ; 汎用ローカル変数 .def temp = R17 ; 一時処理用ローカル変数 EEPROMから1バイト読出し 引数=accにEEPROMのアドレスを設定 戻値=accに読出したデータ eeprom_read: sbic EECR, EEPE ; 書込み中? rjmp PC-1 ; 書込み終了待ち out EEAR, acc ; アドレス設定 sbi EECR, EERE ; 読出し許可 in acc, EEDR ; データ読出し ret ; EEPROMに1バイト書込み 引数=accにEEPROMのアドレスを設定 引数=tempに書込みデータを設定 eeprom_write: sbic EECR, EEPE ; 書込み中? rjmp PC-1 ; 書込み終了待ち sbi EECR, EEMPE ; 主書込み許可 out EEAR, acc ; アドレス設定 out EEDR, temp ; データセット sbi EECR, EEPE ; 書込み許可 sbic EECR, EEPE ; 書込み終了? rjmp PC-1 ; 終了待ち cbi EECR, EEMPE ; 主書込み禁止 ret ; 2008.11.06(木) 初期化にバックラッシュ分のCW移動を追加しました。 2008.11.03(月) CW/CCWの表示LEDを追加しました。 2008.10.31(金) 「しおり」の操作と動作を変更しました。 2008.10.29(水) FUSE BITにFFDEE4を書込み、汎用ポートPA2で「しおり」の動作確認をしました。 2008.10.25(土) 移動長の測定
LED表示をステップカウント数(-99,999〜999,999)に変更しています。 1/8分割マイクロステップで駆動。送りねじリード8mm。 バックラッシュの影響を無くす為、+方向移動からの測定に統一しています。 1) 1ステップ当たりの移動長が2μから6μの範囲でばらつきます。 等分割の5μに対する誤差範囲は-40%〜+20%。 2) -10μから40μの移動の繰り返しで、表示0μの時-2ステップの誤差があります。 3) ステップパルスを+20印加、次に-20パルス印加そして表示0μに合わせると-1ス テップの誤差です。 4) 停止中のモータ振動で、ピックテスタの指針が2μ程度徐々に変化する事があり ます。 5) 1,000ステップの移動量は-5.03mm。+5.05mm。 送りネジのリード補正で、1/100mm桁の表示精度が向上します。 取り付け予定の基板カッター研削機
1)と2)の状況から、50μの逃げ代研削は残念な結果になりそうです。 2008.10.24(金) ケース内部配線の様子。
2008.10.19(日) アルミケースの穴あけ完了。部品を仮止めしました。
縦110mm×横150mm×高65mm。 2008.10.15(水) 動作テスト。
移動範囲=約32mm。 移動速度=F30,F60,F300,F600,F1200,F2400で確認しました。 送りネジリード=8mm。 四条ネジ。 1/8マイクロステップ駆動。 5um/ステップ。 モータドライバー(SLA7078)供給電圧=24V。 励磁電流=約0.8A。 2008.10.13(月) 機構部品揃い。
スライドガイド。カップリング。ステッピングモーター。 ブラケット部材(受け板、支柱)。 2008.10.07(火) 表示範囲を変更しました。 -99.999〜99.99 → -99.999〜999.999。 2008.10.03(金) 「しおり」位置設定と「しおり」位置での移動停止機能を追加しました。 デバッグは「しおり」SWをSPEED SWで代用しました。 // しおり機能デバッグ .equ B_MARK_DEBUG = 1 ; SPEED SWで代用 .if B_MARK_DEBUG == 1 sbic PIND, SPEED_SEL ; デバッグはSPEED SWで代用 .els sbic PINA, B_MARK_SW ; PA2を使用(RESET端子) .endif (注意) PA2を使用する場合は、ヒューズビットを書き換えてRESET端子をPA2に切換える必要 があり、以後シリアルプログラミングが出来なくります。 2008.09.27(土) nm変換乗算ルーチンを変更しました。 DROでは(変数1)=(変数1)×(固定値)を使用しました。 これを(変数1)=(変数1)×(変数2)に変更しました。 変数1は32ビット、変数2は16ビットです。 コーディング例 .equ PER_STEP = 5000 ; 5000nm=5um // 可変乗数設定 ldi num20, low(PER_STEP) ; ldi num21, high(PER_STEP) ; // 乗算 rcall multi ; 乗数は可変 バックラッシュ処理を追加。クロックパルス数で0〜65535の設定が可能です。 バックラッシュ設定を5に設定した場合、回転方向を切換えると6個のクロックパル スを出力します。
1msec/div。 PER_STEP = 5000で、25umのバックラッシュを補正します。 2008.09.26(金) 早送り(FF)、早戻し(FR)機能を追加しました。 送り速度はF30またはF300を切換え可能です。 2008.09.25(木)
右:民生用ロータリーエンコーダー。24クリック/回転。 左:産業用ロータリーエンコーダー。100クリック/回転 民生用ロータリーエンコーダーの出力信号波形です。
10msec/div。パルス幅は回転速度で変化します。 上:右回転。A=クロック。B=ディレクション。 下:左回転。1=クロック。2=ディレクション。 クリック手前でパルスが出力され、クリックポイントではA,BともにHiレベルです。 民生用ロータリーエンコーダーの端子接続 ┌───┐ │ │ A:クロック │ ○ │ B:ディレクション │ │ C:コモン └┬┬┬┘ B C A チャタリング処理 右回転 ─────┐ ┌───────── A └───┘ ─────┐ ┌─────── B └─────┘ サンプリング │ │ │ │ │ │ │ │ │ │ ┴─┴─┴─┴─┴─┴─┴─┴─┴─┴ チャタリング処理後の右回転信号 ────────┐ ┌──── A └─────┘ ↓ ────────┐ ┌──── B └─────┘ 左回転 ───┐ ┌────── A └────────┘ ───────┐ ┌────── B └────┘ サンプリング │ │ │ │ │ │ │ │ │ │ ┴─┴─┴─┴─┴─┴─┴─┴─┴─┴ チャタリング処理後の左回転信号 ──────┐ ┌──── A └───────┘ ↓ ──────────┐ ┌──── B └───┘ チャタリング処理のサンプリング間隔は1msec。 2回一致で入力信号の確定としま した。 A立下りエッジ後のBで回転方向を決定します。 以後入手が容易な民生用ロータリーエンコーダーで実験を継続します。 2008.08.14(木) ロータリーエンコーダーのクロックをATtiny2313でカウントし表示しました。
クロックカウントを長さ(mm)に換算して表示しました。
条件:送りネジリード=1.5mm。 ステッピングモーター=200ステップ/回転。 マイクロステップ駆動=16分割。 2008.08.13(水) ロータリーエンコーダーの出力信号をSLA7078基板に直結してステッピングモーター を回しました。
2008.08.12(火) ロックヒルさんから提供された産業用ロータリーエンコーダーの出力信号を測定し ました。
5msec/div。 パルス幅は回転速度とは無関係です。 上:右回転。A=クロック。B=ディレクション。 下:左回転。1=クロック。2=ディレクション。
LessonAのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。