DROの実験 2007.11.01(木)〜
著作者名: 中野 良知 作成開始: 2007.11.01(木) 更新 : 2011.04.06(水) △1 3chDRO回路図変更
目次 1. 目的 2. デジタルノギス 2.1. 信号引出し用パターン配置 2.2. 電源供給 2.3. ノギス用電源のレギュレーション 2.4. 出力信号 2.5. タイミングチャート 3. データの取り込み 3.1. インターバル検出 3.2. INT0割込み設定 3.3. データ取り込みコーディング例 4. データの平均化 4.1. 結果 4.2. 平均値計算処理時間 4.3. 平均値計算のコーディング例 5. 負数処理 5.1. 負記号の点灯 5.2. 負数処理のコーディング例 6. 乗算 6.1. 最大桁数 6.2. 乗算処理時間 6.3. 乗算のコーディング例 7. 除算 7.1. 除算処理時間 7.2. 除算のコーディング例 8. 四捨五入 8.1. 10進補正 8.2. 四捨五入のコーディング例 9. -000.00mm表示 9.1. -000.00mm表示対策のコーディング例 10. カウンタリセット・高速モード設定 10.1. リセットスイッチ 10.2. リセットスイッチ入力コーディング例 11. 7セグメントLED 11.1. ダイナミック点灯走査信号 11.2. ブランキング 11.3. LEDの電流制限 12. 上位桁の0数字消灯 12.1. 点灯桁チェックのコーディング例 13. 負号の右寄せ 13.1. 負号右寄せのコーディング例 14. ゼネラルフローチャート 15. ソースリスト 15.1. DRO 15.2. DRO SIGNAL GENERATOR 16. 実験回路 16.1. threes/isagida用 I/F 回路 16.2. mitutoyo用 I/F 回路 16.3. 7segLED駆動回路 16.4. DRO SIGNAL GENERATOR 回路 17. マウント参考図 18. センサーの原理 18.1. mm換算係数による誤差 19. ノイズ対策 20. 実験の経過 21. 謝辞 1. 目的 デジタルノギスの測定値出力信号を読み取り、LEDで表示します。 2. デジタルノギス 1) プログラム作成に使用したデジタルノギス 発売元 (株)トップマン 生産国 CHINA 型名 DC-15 仕様 測定範囲 :0.01-150mm 最小読取値 :0.01mm 器差 :±0.03mm 最大応答速度:1.5m/sec 2) 動作を確認したデジタルスケール 400mm水平デジタルスケールDijiScalesH40(スリースカンパニー取扱品) 3) 対象外のノギスとスケール この資料はミツトヨ製、isagida販売のデジタル・ノギスやデジタル・スケールの 出力信号フォーマットには対応していません。 *1 isagida販売のフォーマットは「実験の経過」で2008.06.01(日)の記事を参照 してください。 *2 ミツトヨのファーマットは、製品の取扱い説明書にタイミングチャートが掲載 されています。 *3 実験では、threes,isagida,mitutoyoの3つのフォーマットに対応したプログ ラムを1個のATtiny2313に収納できました。 2008.07.01(火)時点のフラッシュROM使用率は94.9%(1944/2048)です。 2.1. 信号引出し用パターン配置 ┌─ 1) 0V │ ┌─ 2) DATA │ │ ┌─ 3) CLOCK │ │ │ ┌─ 4) +1.55V ↓ ↓ ↓ ↓ ┌─────────┐ │ ┌┐┌┐┌┐┌┐ │ │ ││││││││ │ │ ││││││││ │ │ │ 2.2. 電源供給 外部からノギスに電源を供給する場合は、信号引出し用パターンの 4) +1.55Vと 1) 0V 間に 外部電源を接続します。 2.3. ノギス用電源のレギュレーション Vcc=4.97V 負荷 出力 LED電流 負荷電流 レギュレーション ------+-------+----------+----------+-------------------- 解放 1.79V 3.18mA 1KΩ 1.76V (1.42mA) 1.76mA -0.017V/mA 負荷はノギス出力のCLOCKとDATAが3軸同時にHiになったときの全負荷を想定。 1個のI/F回路の入力抵抗 トランジスターのVBE=0.713V。 トランジスターの入力抵抗は Ri=0.713/((1.79V-0.713V)/4.7K)=3.1K。 ベースバイアス抵抗を含めると Rin=4.7K+3.1K=7.8K。 6個のI/F回路の合成入力抵抗 RL=7.8K/6=1.3K。 から1KΩとしました。 2.4. 出力信号 上:クロック 下:データ(クロックの立ち上がりエッジで変化) パケット構成 :第1ブロック24ビット。 :第2ブロック24ビット。(こちらを使用します) クロック幅 :H=7.28usec。L=5.76usec。周波数=76.69KHz。 パケット幅 :0.84msec。 パケット周期 :低速時=322msec。高速時=24.8msec。 データビットパターンがノギスの可動ジョーを移動すると変化します。 パケット ├───────..─────────────..────────┤ ┌──┐┌┐┌┐ ┌┐┌┐┌───┐┌┐┌┐ ┌┐┌┐┌───┐ ─┘ └┘└┘└..┘└┘└┘ └┘└┘└..┘└┘└┘ └ ┌───────..────┐ ┌────┐ ┌───┐ ─┴───────..────┴─┘ └─..┘ └──── ├───────..────┤ ├──────..────┤ 第1ブロック24ビット 第2ブロック24ビット 第2ブロックに、ノギスの表示"0.00mm"からの移動量のカウント値が、 LSBファーストで出力されます。出力は0と1が反転しています。 LSB MSB ┌┐┌┐┌┐┌┐┌┐┌....┐┌┐┌┐┌┐┌┐ ─┘└┘└┘└┘└┘└┘ └┘└┘└┘└┘└ ┌────────....───────── データ0x00001の場合 ───┘ クロックとデータの振幅0V-1.5Vをトランジスターで受けてレベルを5V系にシフトす る為、ATtiny2313の入力信号はノギスの出力に対して0,1が反転します。 LSB MSB ─┐┌┐┌┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌┐┌ └┘└┘└┘└┘└┘└....┘└┘└┘└┘└┘ ───┐ データ0x00001の場合 └────────....───────── クロックの立上りエッジ毎にデータを取り込んだ時の3バイトの値が、 ノギスの0点からの移動量(カウント値)です。 実験に使用したノギスは、1カウント当たり0.0012402mmに相当します。 カウント対mm変換係数: フルスケール時のカウント値=0x01E54E=124238(10進)。 変換係数=154.08mm/124238=0.0012402mm/カウント 2.5. タイミングチャート トランジスター出力のため、ノギスの出力と0,1が反転します。 │←─────12.9μ─────→│ │← 4.96μ →│←─ 7.94μ ─→│ ┌──────┐ ┌──────┐ CLOCK ─┘ └────────┘ └─── ──────────┐ ┌─ DATA └───────────────┘ │←──────→│7.68μ(DATA切換り) →│ │←2.72μ 立下りエッジから2.72μsec遅れてデータが出力される為、 立上りエッジに同期してデータを取り込みます。 ┌──────┐ ┌──────┐ CLOCK ─┘ └────────┘ └─── ──────────┐ ┌─ DATA └───────────────┘ │←────→│ データ取り込み期間 3. データの取り込み INT0の立ち上がりエッジ割り込みでPD3の値をキャリーフラグにコピーし、 レジスターの各ビットを順次右シフトします。 ┌──┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ │PD3 ├→┤Cf├→┤R5├→┤R4├→┤R3│ └──┘ └─┘ └─┘ └─┘ └─┘ MSD LSD ビットカウンタが48クロックをカウントすると、R5,R4,R3に第2ブロックのデータ が格納されます。R3にLSD、R5にMSD。 第1ブロックのデータは破棄します。 3.1. インターバル検出 パケットから次のパケットまでの期間を検出してビットカウンタをリセットしま す。 インターバルカウンタを1msecのタイマー0割込み毎にインクリメントし、 同カウンターが10msec経過したところでビットカウンタをリセットします。 インターバルカウンタのリセットは、クロックの立ち上がりエッジの割込み 毎に行います。 パケット インターバル パケット │←──────→│←───〜───→│←───── CLOCK ───┬┬┬┬┬┬┬┬┬┬────〜────┬┬┬┬┬┬┬ └┴┴┴┘└┴┴┴┘ └┴┴┴┘└┴ インターバル ───┐ ┌──┐ カウンタ ───┴────────┴──┴─〜─────────── →│──│←10msec経過 ↓ ┌───────────┐ ┌────── ビットカウンタ───┴───────────┴─〜────┴────── 3.2. INT0割込み設定 立上りエッジ選択: レジスターMCUCRのISC01ビットとISC00ビットを1に設定。 INT0割込み許可: レジスターGIMSKのINT0ビットを1に設定。 コーディング例: ; INT0立上りエッジ割り込みを許可 ldi acc,(1<<ISC01)|(1<<ISC00) out MCUCR,acc ; INT0 立ち上がり割込み選択 ldi acc,(1<<INT0) ; out GIMSK,acc ; INT0 割込み許可 3.3. データ取り込みコーディング例 ; ノギスデータ用 .def caliper0 = R3 ; ノギスデータ(LSD) .def caliper1 = R4 ; ノギスデータ .def caliper2 = R5 ; ノギスデータ(MSD) ;============================================================= ; INT0割込み ; クロック立上りエッジで割込み。PD3からデータを取り込む。 ;============================================================= intr_int0: sbrc flg,CLP_DATA_FLG ; ノギスデータ有り? rjmp int0_end10 ; Yes in sreg_save,SREG ; ステータスを退避 sec ; Cflgセット sbis PIND,PD3 ; ノギスデータ1? clc ; No。Clfgリセット ror caliper2 ; MSD右シフト ror caliper1 ; 右シフト ror caliper0 ; LSD右シフト inc bit_cnt ; ビットカウント更新 cpi bit_cnt,48 ; ビットカウント=48? brne int0_end ; sbr flg,(1<<CLP_DATA_FLG) ; ノギスデータ有り int0_end: eor intv,intv ; インターバルカウンタリセット out SREG,sreg_save ; ステータス復帰 int0_end10: reti ; 終了 4. データの平均化 7segLEDの数値のちらつきを改善する為に、ノギスデータの移動平均を計算します。 SRAMに3バイトごとで8個の区画を設けます。 取り込んだノギスデータは、Zレジスターを使用してSRAMに順次格納します。 この区画はリング状に使用し、ZレジスターはD0からはじめてD7まで進むと 再びD0に戻り、データを上書きします。 ノギスのデータ ┌┬┬┐ └┴┴┘ ↓ (Zレジスター) │ ┌──┬──┬──┬┴─┬──┬──┬──┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ D0 D1 D2 D3 D4 D5 D6 D7 ┌┬┬┼┬┬┼┬┬┼┬┬┼┬┬┼┬┬┼┬┬┼┬┬┐ └┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘ D0からD7までの合計を求めたあと、8で割って平均を求めます。 除算は合計値を右シフト3回で行います。 例: D0からD7までの合計が 0x0012345678 = 305419896(10進)の場合 . . . . . . . . . . 2進数では 0000000000010010001101000101011001111000 3回シフト 0000000000000010010001101000101011001111 結果は、0x0002468ACF=38177487(10進)です。 サンプルデータが2^N個の場合、除算はN回の右シフトで行います。 プログラムが簡潔で、計算が高速です。 4.1. 結果 サンプル数 ちらつき具合 ------------+---------------------------------------------------- 1 目立ちます。 4 改善されます。 8 ノギスのLCDより若干多目です。(実用範囲) 16 良好。ジョーの移動に対する追従が遅くなります。 32 良好。ジョーの停止後約0.84秒で表示が確定。 4.2. 平均値計算処理時間 ノギスデータのSRAM格納から、8個のサンプルデータの合計、割り算までの 処理時間を測定しました。 29.2μsecです。 4.3. 平均値計算のコーディング例 ; 平均値サンプル数 .equ AVE_SHIFT = 3 ; 平均算出時の右シフト数 .equ SAMPLE_CNT = 1<<AVE_SHIFT; 2^N。N=AVE_SHIFT // カウントの合計を計算 ldi acc,SAMPLE_CNT ldi ZL,low(sample_data) ; SRAMポインターを設定 ldi ZH,high(sample_data) eor num10,num10 ; 合計の答えを初期化 eor num11,num11 eor num12,num12 eor num13,num13 eor num14,num14 // 合計ループ ld num20,Z+ ; 下位バイト取得 ld num21,Z+ ; 中位バイト取得 ld num22,Z+ ; 上位バイト取得 sbrc num22,7 ; MSB? rjmp PC+4 ; 負数なら ldi num23,$00 ; 桁あわせバイトを初期化 ldi num24,$00 ; 桁あわせバイトを初期化 rjmp PC+3 ldi num23,$FF ; 桁あわせバイトを初期化 ldi num24,$FF ; 桁あわせバイトを初期化 clc adc num10,num20 ; 最下位バイト加算 adc num11,num21 adc num12,num22 adc num13,num23 adc num14,num24 ; 最上位バイト加算 dec acc ; サンプル数繰り返し? brne PC-17 ; No // カウントの平均を求める // 合計/SAMPLE_CNT // 平均値算出の割り算(右シフト) ldi acc,AVE_SHIFT ; 右シフト回数 sec ; 負数用にCflgセット sbrs num14,7 ; MSB? clc ; 正数用にClfgリセット ror num14 ; 最上位桁右シフト ror num13 ror num12 ror num11 ror num10 ; 最下位桁右シフト dec acc ; ÷2^N。N回右シフト brne PC-9 // 終了 5. 負数処理 ノギスデータのMSBが1ならばそのデータは負数で、絶対値に変換します。 16進数 2進数 10進数 ---------+---------------------+------------- 0x7FFFFF 0111 1111 1111 1111 +8,388,607 0x000002 0000 0000 0000 0010 +2 0x000001 0000 0000 0000 0001 +1 0x000000 0000 0000 0000 0000 0 0xFFFFFF 1111 1111 1111 1111 -1 0xFFFFFE 1111 1111 1111 1110 -2 0x800000 1000 0000 0000 0000 -8,388,608 ↑ MSBが1なら負数 MSBのビットをテストして、1ならsignフラグをセットします。 signフラグは、7segLEDのダイナミック点灯時に"−"記号LEDのオン・オフ決定時に 利用します。 2の補数処理で絶対値を求めます。 例) -1の場合 0x10000000 -) 0xFFFFFFF ---------------- 0x0000001 プログラムでは 0x000000 -) 0xFFFFFF ---------------- 0x000001 ... Cflg=1 答えは絶対値の1になります。 アンダーフローでキャリーが発生しますが、影響はありません。 5.1. 負記号の点灯 7segLEDの100mm桁と同じタイミングで負記号"−"のオン・オフを行います。 ┌──┐ ┌──┐ 100mm桁走査信号 ──┘ └──────────┘ └──── ────────────────┐ "−"点灯信号 └─────── │←→│オフ │←→│オン 正数 負数 負記号"−"LEDもダイナミック点灯にして、他の7segLEDの電流制限抵抗と同じ値を 使用します。 5.2. 負数処理のコーディング例 num10,num11,num12,num13,num14のノギスカウントデータを num20,num21,num22,num23,num24にコピーし、絶対値を求めます。 答えはnum10,num11,num12,num13,num14に格納します。 // 負数処理 cbr flg,(1<<SIGN_FLG) ; signフラグをリセット // 符号判定 sbrs num14,7 ; MSB?。負数? rjmp main15 ; No。正数ならジャンプ // 負数なら絶対値を計算 sbr flg,(1<<SIGN_FLG) ; signフラグセット mov num20,num10 ; データをコピー mov num21,num11 ; データをコピー mov num22,num12 ; データをコピー mov num23,num13 ; データをコピー mov num24,num14 ; データをコピー // 答えを初期化 eor num10,num10 ; = 0 eor num11,num11 ; eor num12,num12 ; eor num13,num13 ; eor num14,num14 ; // 2の補数処理 clc sbc num10,num20 ; 最下位桁減算 sbc num11,num21 ; sbc num12,num22 ; sbc num13,num23 ; sbc num14,num24 ; 最上位桁減算 // 終了 main15: // 乗算(X12402)へ進みます。 6. 乗算 読み込んだノギスのカウント値に係数を掛け合わせて、mm単位に換算します。 換算の基本式は、カウント値×0.0012402(mm)です。 これを整数演算で処理、カウント値×12402で(0.1nm)単位に換算します。 C=カウント値として 1) C×12402 2) 係数項を2進数の因数に分解します。 C×(8192 + 4096 + 64 + 32 + 16 + 2) 3) べき乗で表すと C×(2^13 + 2^12 + 2^6 + 2^5 + 2^4 + 2^1) 4) ATtiny2313のプログラムで Cを1回左シフトした値 Cを2回左シフトした値 Cを5回左シフトした値 Cを6回左シフトした値 Cを12回左シフトした値 +) Cを13回左シフトした値 ---------------------------- の合計値を計算します 実際の計算では、Cにシフト結果を累積させるためシフト回数は1,1,3,1,6,1です。 また、6回の左シフトを1バイトのデータ交換でいったん8回分の左シフトを実施し、 次に右シフトを1回づつ行うことでシフト回数を1,1,3,1,(8),-1,-1として、処理時 間の短縮をしました。 係数を124023にする場合: 係数項を2進数の因数に分解すると C×(65536 + 32768 + 16384 + 8192 + 1024 + 64 + 32 + 16 + 4 + 2 + 1) べき乗では C×(2^16 + 2^15 + 2^14 + 2^13 + 2^10 + 2^6 + 2^5 + 2^4 + 2^2 + 2^1 + 2^0) したがってCを左シフトする回数は、0,1,2,4,5,6,10,13,14,15,16です。 実際の計算では、Cにシフト結果を累積させるため、0,1,1,2,1,1,4,3.1.1.1です。 また「除算」の項で100mmの桁の値を求める時は1000,000,000,000で除算します。 6.1. 最大桁数 1000mm相当のノギスのカウント値は806321.561→806321=0C4DB1で 3バイトです。 1000mm相当のカウント値×12402は10,000,000,000(10進)で、 16進数では02,54,0B,E4,00、5バイトに収まります。 乗算コーディング例で、ノギスのカウント値を最大で14ビット左シフトした時の バイト長は、 元の値(16進) : 0C,4D,B1 元の値(2進) : 1100 0100 1101 1011 0001 14ビット左シフト後:11 0001 0011 0110 1100 0100 0000 0000 0000 (16進) :03,13,6C,40,00 で5バイトです。 乗算で使用する第1項、第2項および答えのバイト長はそれぞれ5バイトに 設定します。 6.2. 乗算処理時間 999.99mmに相当するノギスカウント=806321(0x0C4DB1)を12402倍したときの 乗算ルーチンの処理時間は 25.4μsec です。 高速時のパケット繰り返し周期に対して十分に高速です。 参考:ATtiny2313のクロックは内蔵RC発振の8MHz。0.125μsec/命令サイクル。 6.3. 乗算のコーディング例 5バイト長の変数num10,num11,num12,num13,num14に被乗数。 5バイト長の変数num20,num21,num22,num23,num24に答えが入ります。 被乗数を必要な分左シフトしながら、答えの変数に加えてゆきます。 10進変換処理の準備の為に、答えをnum10,num11,num12,num13,num14に コピーして終了します。 ; 計算式第1項 .def num10 = R6 ; 式1項(LSD) .def num11 = R7 ; 式1項 .def num12 = R8 ; 式1項 .def num13 = R9 ; 式1項 .def num14 = R10 ; 式1項(MSD) ; 答え用 .def num20 = R22 ; 答え(LSD) .def num21 = R23 ; 答え .def num22 = R24 ; 答え .def num23 = R25 ; 答え .def num24 = R26 ; 答え(MSD) ;============================================================= ; 12402倍の計算(0.0012402倍を整数演算で実施) ; 答えの最小桁の単位は0.1nmです。 ; num(10,11,12,13,14)×12402=num(10,11,12,13,14)×0.1nm ; M=C×(8192 + 4096 + 64 + 32 + 16 + 2) ; M=C×(2^13 + 2^12 + 2^6 + 2^5 + 2^4 + 2^1) ;============================================================= X12402: // 答えをクリア ldi num20,$00 ldi num21,$00 ldi num22,$00 ldi num23,$00 ldi num24,$00 // 2^1倍して加算 rcall _rol rcall _add // 2^4倍して加算 rcall _rol rcall _rol rcall _rol rcall _add // 2^5倍して加算 rcall _rol rcall _add // 2^6倍して加算 rcall _rol rcall _add // 2^14倍 mov num14,num13 mov num13,num12 mov num12,num11 mov num11,num10 eor num10,num10 // 2^13倍して加算 rcall _ror rcall _add // 2^12倍して加算 rcall _ror rcall _add // 答えを式1項目にコピー mov num10,num20 mov num11,num21 mov num12,num22 mov num13,num23 mov num14,num24 ret // 5バイトの左シフト _rol: clc rol num10 rol num11 rol num12 rol num13 rol num14 ret // 5バイトの右シフト _ror: clc ror num14 ror num13 ror num12 ror num11 ror num10 ret // 5バイトの加算 _add: clc adc num20,num10 adc num21,num11 adc num22,num12 adc num23,num13 adc num24,num14 ret 7. 除算 ノギスのカウントを0.1nm単位に変換したデータを、表示5桁の10進数に変換する時 に除算を行います。 5バイトの16進数 5桁の10進数(最小桁は10μ単位) ┌─┬─┬─┬─┬─┐ ┌─┬─┬─┐ ┌─┬─┐ │ │ │ │ │ │─────→│ │ │ │ │ │ │ └─┴─┴─┴─┴─┘ └─┴─┴─┘・└─┴─┘mm ↑ ↑ ↑ ↑ ↑ 5バイトの16進数を │ │ │ │ │ 1) 100,000,000,000で割った答え ──┘ │ │ │ │ 2) 1)の余りを10,000,000,000で割った答え┘ │ │ │ 3) 2)の余りを1,000,000,000で割った答え ──┘ │ │ 4) 3)の余りを100,000,000で割った答え ───────┘ │ 5) 4)の余りを10,000,000で割った答え──────────┘ 6) 5)の余りを1,000,000で割った答え─→少数点以下第3位で四捨五入に利用可。 除算は、 1) 被除数から除数を引く 2) 引いた回数をカウント 3) アンダーフローでなければ1)に戻す 4) アンダーフローなら 5) 被除数に除数を加える。...余り 6) 引いた回数から1を引く。 ...答え で行います。 7.1. 除算処理時間 999.999mmに相当するサンプルデータを与えて除算ルーチンを実行した時の 処理時間は 76.0μsec です。 高速時のパケット繰り返し周期に対して十分に高速です。 参考:ATtiny2313のクロックは内蔵RC発振の8MHz。0.125μsec/命令サイクル。 ノギスのカウントデータは、101.4μsec 以内にLED表示用の10進数のデータに 変換できます。 乗算の処理時間 = 25.4μsec +) 除算の処理時間 = 76.0μsec -------------------------------------- 合計 = 101.4μsec 7.2. 除算のコーディング例 被除数(num10,11,12,13,14)には、ノギスのカウント値を12402倍した値を設定しま す。 答えはdigit4〜digit0とtemp変数に格納されます。 // 10進数の100mmの桁を求め、答えをdigit4に入れる ldi num20,$00 ; 分母=100,000,000,000を設定 ldi num21,$CA ldi num22,$9A ldi num23,$3B ldi num24,$00 rcall div mov digit4,temp // 10進数の10mmの桁を求め、答えをdigit3に入れる ... ; 分母=10,000,000,000を設定 rcall div mov digit3,temp // 10進数の1mmの桁を求め、答えをdigit2に入れる ... ; 分母=1,000,000,000を設定 rcall div mov digit2,temp // 10進数の0.1mmの桁を求め、答えをdigit1に入れる ... ; 分母=100,000,000を設定 rcall div mov digit1,temp // 10進数の0.01mmの桁を求め、答えをdigit0に入れる ... ; 分母=10,000,000を設定 rcall div mov digit0,temp // 10進数の0.001mmの桁を求め、答えはtemp ... ; 分母=1,000,000を設定 rcall div ;============================================================= ; 割り算 ; (num10-num14)/(num20-num24)=temp 余り(num10-num14) ; 100mmの桁 :x/100,000,000,000=x/(00,3B,9A,CA,00) ; 10mmの桁 :x/10,000,000,000=x/(00,05,F5,E1,00) ; 1mmの桁 :x/1,000,000,000=x/(00,00,98,96,80) ; 0.1mmの桁 :x/100,000,000=x/(00,00,0F,42,40) ; 0.01mmの桁 :x/10,000,000=x/(00,00,01,86,A0) ; 0.001mmの桁:x/1,000,000=x/(00,00,00,27,10) ;============================================================= div: ldi temp,$00 ; 答えをクリア clc div10: sbc num10,num20 ; 被除数-除数 sbc num11,num21 sbc num12,num22 sbc num13,num23 sbc num14,num24 inc temp ; 引いた回数をカウント brcc div10 ; アンダーフローでなければ clc ; アンダーフローなら adc num10,num20 ; 被除数に除数を加算 adc num11,num21 adc num12,num22 adc num13,num23 adc num14,num24 dec temp ; 答えを-1 ret 8. 四捨五入 0.001mmの桁で四捨五入を行う方法です。 0.001mmの桁で四捨五入した結果は、ノギスの表示よりもDROの表示の方が0.01mm桁 の値が+1される事が多くなります。 ノギス本体の表示とDROの表示に差があっては好ましくない為、四捨五入のルーチ ンはアセンブルスイッチでオフするようにしました。 四捨五入の方法: 0.001mmの桁の十進数変換を行い、答えが5(0.005mm)以上ならば、0.01mmの桁の データに1を加えます。 その桁のデータが10以上になったら10進補正をして、 上位桁に桁上がり処理を行います。 8.1. 10進補正 0から9までの10進数の場合、数値の加算を行うことでデータが10以上になる場合 には、10進補正をします。 1バイトで2桁の10進数の場合の5+7は 0x05 + 0x07 = 0x0C 下位4ビットが10以上になったら 6を加えて10進補正 0x0C + 0x06 = 0x12 答えは12。 8.2. 四捨五入のコーディング例 // 四捨五入 // 0.001mm桁十進変換 ldi num20,$10 ; 分母=1,000,000 ldi num21,$27 ldi num22,$00 ldi num23,$00 ldi num24,$00 rcall div ; 答えはtempに代入 cpi temp,$05 ; 0.005以上? brlo PC+17 ; No。0.004以下なら終了 ldi ZL,low(dsp0) ; 表示値データにポインターを設定 ldi ZH,high(dsp0) ; ldi acc,$05 ; 表示桁分のループカウンターセット mov work,acc ; workへコピー // ループ ld acc,Z ; 表示値データ取得 inc acc ; 桁上がり cpi acc,$0A ; 10以上? brlo PC+8 ; No。終了へ ldi temp,$06 ; 10進補正値設定 add acc,temp ; 10進補正 andi acc,$0F ; 上位4ビットの桁上がりをクリア st Z+,acc ; SRAMへ表示値データを格納 dec work brne PC-9 ; 上位桁の桁上がり処理へループ rjmp PC+2 ; 終了 st Z,acc ; SRAMへ表示値データを格納 // 終了 9. -000.00mm表示 測定値が-000.001mmから-000.009mmの時に、"-"のLEDが点灯するため、 桁の表示データが000.00のときに、signフラグをリセットします。 9.1. -000.00mm表示対策のコーディング例 // -000.00対策 ldi temp,$05 ; ループカウンタ設定 ldi ZL,low(dsp0) ; 桁表示データポインター設定 ldi ZH,high(dsp0) ; // 桁表示=0判定ループ ld acc,Z+ ; cpi acc,$00 ; 桁表示=0? brne PC+4 ; No dec temp ; 全桁チェック? brne PC-4 ; No cbr flg,(1<<SIGN_FLG) ; 負号フラグリセット // 終了 10. カウンタリセット・高速モード設定 ノギスのDATAとCLOCK端子を下記のタイミングでプルアップすることで、 カウンタリセットと高速モードの設定を行います。 プルアップの組み合わせ RESET HOLD INC(高速モード) -------+-------+------+--------------------- DATA H H L CLOCK H L H プルアップのタイミング ┌────────┐ ┌──┐ DATA(PA0) ─┘ └──┘ └───────────── ┌────────┐ ┌──┐ CLOCK(PA1) ─┘ └────────┘ └─────── │←── 0.4s ─→│0.1s│0.1s│0.1s│0.1s│ │← RESET MODE →│HOLD MODE │← Hi SPEED MODE(INC) ─→ パワーオン時の遅延: ノギスに電源供給をしてから、1秒後にカウンタリセットと高速モードの設定を 行います。 電源オンからのタイミング ┌─────────────────────────── 電源 ──┘ ┌┐┌┐ DATA(PA0) ───────────┘└┘└─────────────── ┌┐ ┌┐ CLOCK(PA1) ───────────┘└──┘└───────────── │←──1sec──→│ 10.1. リセットスイッチ PA1を入力に切換えて入力レベルを判定します。 1ならばカウンターリセットと高速モードの設定を行います。 等価回路 ノギスのCLOCK出力が0の時、R15Kの一端はGNDに接続されたことと等価です。 COUNT RESET ┌───┐ ─┴─ │ │ 5V ──○ ○─R4.7K ─●──┤PA1 │ │ │ │ │ │ │ R15K └───┘ │ ┴ GND ATtiny2313のVIH規格=5V×0.7=3.5V。 PA1のハイ入力電圧は、5×15K/(15K+4.5K)=3.8VでVIH規格を満足します。 ノギスのCLOCK出力が1の時、R15Kの一端は1.7Vに接続されたことと等価です。 COUNT RESET ┌───┐ ─┴─ │ │ 5V ──○ ○─R4.7K ─●──┤PA1 │ │ │ │ │ │ │ R15K └───┘ │ ─┴─ 1.7V ┬ │ ┴ GND ATtinyのVIL規格=5V×0.3=1.5V。 PA1のロー入力電圧は、PA1を入力に切換えてから立上り始め、入力のチェックを 実行する時の電圧は0.72Vで、VIL規格を満足します。 10.2. リセットスイッチ入力コーディング例 ;============================================================= ; カウンターリセットスイッチ入力チェック ;============================================================= reset_sw_chk: cbi DDRA,RESET_SW ; 入力に設定 nop nop nop sbis PINA,RESET_SW ; カウンターリセットSW? rjmp PC+2 ; オフ sbr flg,(1<<DSP_RESET_FLG); 表示リセットフラグセット sbi DDRA,RESET_SW ; 出力に設定 ret ; 終了 11. 7セグメントLED ┌ a ┐ 各セグメントは左図のように配置されます。 f b ├ g ┤ e c └ d ┘ 変換コード表 アノードコモン用(今回はこちらを使用) MSB LSB 表示 g f e d c b a 16進数 ------------------------------+--------+-------------- 0 1 0 0 0 0 0 0 40 10進、16進 1 1 1 1 1 0 0 1 79 10進、16進 2 0 1 0 0 1 0 0 24 10進、16進 3 0 1 1 0 0 0 0 30 10進、16進 4 0 0 1 1 0 0 1 19 10進、16進 5 0 0 1 0 0 1 0 12 10進、16進 6 0 0 0 0 0 1 0 02 10進、16進 7 1 0 1 1 0 0 0 58 10進、16進 8 0 0 0 0 0 0 0 00 10進、16進 9 0 0 1 1 0 0 0 18 10進、16進 A 0 0 0 1 0 0 0 08 16進 b 0 0 0 0 0 1 1 03 16進 C 0 0 0 0 1 1 0 06 16進 d 0 1 0 0 0 0 1 21 16進 E 0 0 0 0 1 1 0 06 16進 F 0 0 0 1 1 1 0 0E 16進 カソードコモン用(参考) MSB LSB 表示 g f e d c b a 16進数 ------------------------------+--------+-------------- 0 0 1 1 1 1 1 1 3F 10進、16進 1 0 0 0 0 1 1 0 06 10進、16進 2 1 0 1 1 0 1 1 5B 10進、16進 3 1 0 0 1 1 1 1 4F 10進、16進 4 1 1 0 0 1 1 0 66 10進、16進 5 1 1 0 1 1 0 1 6D 10進、16進 6 0 1 1 1 1 0 1 7D 10進、16進 7 0 1 0 0 1 1 1 27 10進、16進 8 1 1 1 1 1 1 1 7F 10進、16進 9 1 1 0 0 1 1 1 67 10進、16進 A 1 1 1 0 1 1 1 77 16進 b 1 1 1 1 1 0 0 7C 16進 C 0 1 1 1 0 0 1 39 16進 d 1 0 1 1 1 1 0 5E 16進 E 1 1 1 1 0 0 1 79 16進 F 1 1 1 0 0 0 1 71 16進 11.1. ダイナミック点灯走査信号 負号表示桁は100mm桁と同時に点灯させて各桁の時分割比率を1/5にします。 6桁の時分割点灯よりもLEDが明るく点灯します。 5桁の表示用LEDを最小桁から順に点灯します。 ┌─┬─┬─┐ ┌─┬─┐ │ │ │ │ │ │ │ └─┴─┴─┘・└─┴─┘mm ↑ ↑ ↑ ↑ ↑ ON ON │ │ │ │ │ ┌┐ ┌┐ │ │ │ │ └─ PD0 0.01mm桁 ─┘└───┘└───── │ │ │ │ ┌┐ ┌┐ │ │ │ └─── PD1 0.1mm桁 ──┘└───┘└──── │ │ │ ┌┐ ┌┐ │ │ └─────── PD4 1mm桁 ───┘└───┘└─── │ │ ┌┐ ┌┐ │ └───────── PD5 10mm桁 ────┘└───┘└── │ ┌┐ ┌┐ └─────────── PD6 100mm桁 ─────┘└───┘└─ 11.2. ブランキング 各桁の表示をオンする前に全桁を一端オフします。 この期間に表示桁の10進数データを7セグメントデータに変換しポートへ出力しま す。 ダイナミック点灯走査信号 │←───→│1msec ┌─────┐ PD0 0.01mm桁 ──┘ └─────────────── ┌─────┐ PD1 0.1mm桁 ─────────┘ └──────── →││←3.68μsec この期間で7セグメントデータを用意して PORTBへ出力します。 11.3. LEDの電流制限 7segLEDの電流制限抵抗値を概算します。 DOTを含めると桁当たりの点灯セグメント数は最大で8個です。 ATtiny2313のポートの最大電流は40mA。 セグメント当たりでは、40mA/8=5mA。 LEDのVfを1.7Vとすると、(5V-1.7V)/5mA=660Ω。標準抵抗値E-6シリーズから 680Ωを選択します。 桁走査ポートのピーク電流は、(5V-1.7V)/680Ω*8=38.8mA。 桁走査ポートの平均電流は、(5V-1.7V)/680Ω*8/5=7.8mA。 で、規格内におさまります。 12. 上位桁の0数字消灯 7segLED表示の最上位桁から続く数字が"0"の場合は、7segLEDを消灯します。 表示例 ┌─┬─┬─┐ ┌─┬─┐ ┌─┬─┬─┐ ┌─┬─┐ │0│0│0│ │0│0│は│ │ │0│ │0│0│ └─┴─┴─┘.└─┴─┘ └─┴─┴─┘.└─┴─┘ ┌─┬─┬─┐ ┌─┬─┐ ┌─┬─┬─┐ ┌─┬─┐ │0│1│2│ │3│4│は│ │1│2│ │3│4│ └─┴─┴─┘.└─┴─┘ └─┴─┴─┘.└─┴─┘ と表示します。 "0"消灯位置検出 桁走査カウンター: 4 3 2 1 0 検出カウンター : 5 4 3 桁No : 4 3 2 1 0 ┌─┬─┬─┐ ┌─┬─┐ │ │ │ │ │ │ │ └─┴─┴─┘.└─┴─┘ 1) 7segLEDの駆動ルーチンで全桁を消灯。 2) 検出カウンターの初期値を5に設定。 3) 桁No.4をチェックし、 4) "0"以外なら検出カウンター=5で9)へ。 5) "0"なら検出カウンターをデクリメント。 6) 桁No.3をチェックし、 7) "0"以外なら検出カウンター=4で9)へ。 8) "0"なら検出カウンターをデクリメントし、検出カウンター=3で9)へ。 9) 桁走査カウンター<検出カウンターなら走査桁を表示。 10) 桁走査カウンター>=検出カウンターなら消灯のまま終了。 12.1. 点灯桁チェックのコーディング例 ;============================================================= ; 点灯桁チェック ; 戻り値:accに点灯桁位置を設定 ;============================================================= on_digit_chk: ldi acc,$05 ; ループカウンタ設定 ldi ZL,low(dsp0+5) ; ldi ZH,high(dsp0+5) ; on_digit_chk10: ld temp,-Z ; cpi temp,$00 ; 桁表示=0? brne on_digit_chk20 ; No dec acc ; cpi acc,3 ; brne on_digit_chk10 ; No on_digit_chk20: ret ; 13. 負号の右寄せ 上位桁の0数字消灯後に、表示された最上位桁の左隣に負号を表示します。 桁走査カウンター: 4 3 2 1 0 検出カウンター : 5 4 3 桁No : 4 3 2 1 0 ┌─┬─┬─┬─┐ ┌─┬─┐ │ │ │ │ │ │ │ │ └─┴─┴─┴─┘. └─┴─┘ ↑├───────────┤ │ 5桁LED 負号専用LED singフラグが1(負)なら 1) "0"消灯位置検出で検出カウンター値を求めます。 2) 下記の表にしたがって、負号点灯処理を行います。 検出 桁走査 カウンター カウンター 負号点灯処理 -----------+------------+------------------------------------- 5 4 負号専用LEDgセグメントを点灯(PB7=0) 4 4 5桁LEDgセグメント点灯(PB6=0) 3 3 5桁LEDgセグメント点灯(PB6=0) 13.1. 負号右寄せのコーディング例 ;============================================================= ; 負号表示 ; 例:- 1.00を-1.00に負号を右寄せ ;============================================================= sign_dsp: sbrs flg,SIGN_FLG ; -負号? ret ; 負号LEDビットをオフ rcall on_digit_chk ; 点灯桁チェック cpi acc,5 ; 5桁目>0? brne sign_dsp10 ; No cpi scan_cnt,4 ; 5桁目走査? brne sign_dsp50 ; No .if ANODE_COMMON == 1 cbi PORTB,PB7 ; 負号LEDオン .else sbi PORTB,PB7 ; 負号LEDオン .endif ret ; sign_dsp10: cpi acc,4 ; 4桁目>0? brne sign_dsp20 ; No cpi scan_cnt,4 ; 5桁目走査? brne sign_dsp50 ; No rjmp sign_dsp100 ; sign_dsp20: cpi acc,3 ; 3桁目>0? brne sign_dsp50 ; No cpi scan_cnt,3 ; 4桁目走査? breq sign_dsp100 ; Yes sign_dsp50: ret sign_dsp100: ldi temp,$BF ; gセグメントオン out PORTB,temp ; ret ; 14. ゼネラルフローチャート (スタート) │ スタック初期化 │ PORT初期化 │ タイマー0初期化 │ アナログ比較器電源オフ │ ウォッチドッグ(WD)禁止 │ フラグ初期化 │ 7segLED走査順初期化 │ INT0立上りエッジ割込み許可 │ 表示データクリア │ リングファー(SRAM)ポインター初期化 │ ノギスの立上り待ち遅延 │ ノギス高速出力モード設定 ├←───────────────┐ (mainループ) │ │ │ <ノギスデータ有り?>no───┐ │ │yes │ │ データ保存 │ │ │ │ │ リングバッファー合計 │ │ │ │ │ 平均値計算 │ │ │ │ │ 負号処理 │ │ │ │ │ 単位変換(カウントをmmへ) │ │ │ │ │ 10進数変換 │ │ │ │ │ -000.00修正 │ │ │ │ │ 表示データ保存 │ │ ├←───────────┘ │ インターバル検出 │ │ │ 7segLED表示 │ │ │ カウンターリセットスイッチチェック │ │ │ └────────────────┘ (データ取り込み) INT0割込み処理 │ <ノギスデータ有り?>yes ──────┐ │ │ データビットをCflgにコピー │ │ │ Cflgを含め3バイト右シフト │ (MSBにCflgを反映) │ │ │ <ビットカウント=48?>no ──┐ │ │yes │ │ ノギスデータ有りに設定 │ │ ├────────────┘ │ インターバルカウンタリセット │ ├←───────────────┘ │ (終了) 15. ソースリスト ファイルはLHZ形式で圧縮してあります。 リスト中のTabは、半角スペースの4個分に相当します。 15.1. DRO Ver20080617 *FUSE BITの下位バイトを 0x64 から 0xE4 に書き換えてください。 (拡張,上位,下位=FF,DF,E4) 仕様: 1) threesが取り扱っているデジタル・ノギス、デジタル・スケールの出力信号 フォーマットに対応。 フォーマット仕様を変更する場合には、 isagidaの仕様は、「実験の経過」2008.06.01(日)を参照してください。 mitutoyoの仕様は、機器の取り扱い説明書をご覧下さい。 2) -999.99〜999.99mmを表示。 3) 8回のサンプルデータの移動平均値を表示。 4) mm変換係数に0.0012402mm/カウントを使用。 変換の精度向上を行う場合は、「乗算」の項目の"係数を124023にする場合:" を参考にしてください。 5) 0.001mm桁で四捨五入。 6) 7segLEDの「Float Bit」駆動は未対応です。 7) 表示リセット機能有り。 15.2. DRO SIGNAL GENERATOR threes、isagida、mitutoyoの擬似データを出力します。 Ver20080713 *FUSE BITの下位バイトを 0x64 から 0xE4 に書き換えてください。 (拡張,上位,下位=FF,DF,E4) 仕様: 1) タイプ選択 DIP SW 1 2 Type ----+----+---------- off off threes on off isagida off on mitutoyo 2) 出力データ選択 DIP SW 4 5 6 データ -----+----+----+--------- off off off 0.00 off off on 123.45 off on off -123.45 off on on 500.00 on off off -500.00 on off on 999.99 on on off -999.99 on on on -888.88 *DIP SW3は予備。 16. 実験回路 16.1. threes/isagida用 I/F 回路 COUNTER RESET SWITCH ─┴─ ATtiny2313 ┌─○ ○─●─●─────●───●─ +5V │ │ │ 20│ │ R4.7K │ │ ┌──┴──┐│ │ │ │ 5│ Vcc ││ ┌─R15K──────────────┤PA0 ││ │ │ │ │ 4│ ││ │ ┌─R15K─●──────────┤PA1 ││ ノギス │ │ │ │ │ ││ ┌────┐ │ │ 2SC1815 R4.7K │ │ ││ │ │3 │ │ B┌─┐ │ │ 6│ ││ │ CLOCK├────●──R4.7K ─┤ ├─●────┤PD2 INT0 ││ │ │ │ └┬┘C │ │ ││ │ │ │ 2SC1815 E│ R4.7K │ ││ │ │2 │ B┌─┐ │ │ 7│ ││ │ DATA├──●─R4.7K ─┤ ├──────●──┤PD3 DATA ││ │ │ └┬┘C │ └──┬──┘│ │ │ E│ │ 10│GMD │ │ │1 │ │ │ │ │ 0V ├─────●───●──●───●──────●───── 0V │ │ │ 100μ│ │ │ 100μ │ │ GND │ │ 0.22μ┴ 10V┌┴┐ │ ┌┴┐ 10V┌┴┐ │ │ │ ┬ ┬ R4.7K ├─┤赤色 ┬ │ │ │ │ │ │ │∧│LED +│ │ │ │4 (1.7V)│ │ │ └┬┘ │ │ │ 1.55V├─────●───●──●───●──R2.2K ─●───┘ │ │ └────┘ ノギスの端子Noは、ジョー側が1です。 ATtiny2313は内臓RCクロック8MHzを使用。 16.2. mitutoyo用 I/F 回路(参考) ATtiny2313 ┌───┐ │ │20 │ VCC├─────●──●─────●────────── +5V │ │ │ │ 100u/10 │ │ │ │ │ │┴│ │ │ │ │ └┬┘ │ │ │ │ │ │ │ R10K │ ●────────── 0V │ │ │ │ │ │ │ │ │ │ ミツトヨ │ │ │ │ │ デジタルキャリパー │ │6 │ │ │ 3┌──────┐ │ PD2├─R2.2K ─●───────────┤CK │ │ │ │ │ │ │ │ │ R10K │ │ │ │ │7 │ │ 2│ │ │ PD3├─R2.2K ────●────────┤DATA │ │ │ │ │ │ │ │ カウンタリセット │ │ │ │ │9 ─┴─ │ │ │ │ PD5├───○ ○────────● │ │ │ │ │ │ 1.5V │ │ │ │ │ │ │ │ │ 2SC1815 │ │ (PU R50K) │ │ │8 B┌─┐C │ 5│ │ │ │ PD4├───R10K─●──┤ ├─────┤-REQ─┘ │ │ │ │ └┬┘ │ │ │ │ │ R10K E│ │ │ │ │ │10 │ │ │ 1│ │ │ GND├──────●───●───●──┤GND │ │ │ └──────┘ └───┘ 16.3. 7segLED駆動回路 ATtiny2313 ┌────┐ │ │2 │ PD0├───────────────────────────┐ │ │3 │ │ PD1├───────────────────────┐ │ │ │8 │ │ │ PD4├─────────────────┐ │ │ │ │9 │ │ │ │ PD5├─────────────┐ │ │ │ │ │11 │ │ │ │ │ PD6├─────●───┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │d4 │d3 │d2 │d1 │d0 │ │ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴─┐dot ┌┴┐ ┌┴┐ │ │ │−│ │8│ │8│ │8.├┐ │8│ │8│ │ │ └┬┘ └┰┘ └┰┘ └┰─┘│ └┰┘ └┰┘ │ │19 g│ ┃a〜g ┃a〜g ┃a〜g│ ┃a〜g ┃a〜g │ PB7├──R560─┘ ┃ ┃ ┃ R560 ┃ ┃ │ │ ┃ ┃ ┃ │ ┃ ┃ │ │12 a ┃ ┃ ┃ │ ┃ ┃ │ PB0├──R560━━━━━╋━━━┻━━━┻━━━━━┻━━━┛ │ │13 b ┃ │ │ PB1├──R560━━━━━┫ ──●──── 0V │ │14 c ┃ GND │ PB2├──R560━━━━━┫ │ │15 d ┃ │ PB3├──R560━━━━━┫ │ │16 e ┃ │ PB4├──R560━━━━━┫ │ │17 f ┃ │ PB5├──R560━━━━━┫ │ │18 g ┃ │ PB6├──R560━━━━━┛ │ │ └────┘ 16.4. DRO SIGNAL GENERATOR 回路 ATtiny2313 ┌───┐ │ │20 │ VCC├──────────────●─────────── +5V │ │ 100u/10 │ │ │ │┴│ │ │ └┬┘ │ │ │ │ │ ●─────────── 0V │ │ │ │ │2 │ ┌──────┐ │ PD0├────────────────────○ -REQ │ │ │ │ │ │ │ │6 │ │ │ │ PD2├─────────────●──────○ CLOCK │ │ │ ││ │ │ │ │7 ││ │ │ │ PD3├────────────●───────○ DATA │ │ │ │││ │ │ │ │ │││ │ │ │ │ 2SC1815 ││●─────○ GND │ │ │5 C┌─┐B │││ └──────┘ │ PA0├───┤ ├─●─R10K─┘││ │ │ └┬┘ │ ││ │ │ E│ R10K ││ │ │ │ │ ││ │ │ └──●──────● │ │ ││ │ │ 2SC1815 ││ │ │4 C┌─┐B ││ │ PD1├───┤ ├─●─R10K──┘│ │ │ └┬┘ │ │ │ │ E│ R10K │ │ │ │ │ │ DIP SW │ │ └──●──────● 1 2 Type │ │ │ ----+----+---------- │ │12 / DIP SW1 │ off off threes │ PB0├─────○ ○──────● on off isagida │ │13 / DIP SW2 │ off on mitutoyo │ PB1├─────○ ○──────● │ │14 / DIP SW3 │ DIP SW │ PB2├─────○ ○──────● 4 5 6 表示 │ │15 / DIP SW4 │ ----+----+----+--------- │ PB3├─────○ ○──────● off off off 0.00 │ │16 / DIP SW5 │ off off on 123.45 │ PB4├─────○ ○──────● off on off -123.45 │ │17 / DIP SW6 │ off on on 500.00 │ PB5├─────○ ○──────● on off off -500.00 │ │ │ on off on 999.99 │ │10 │ on on off -999.99 │ GND├──────────────┘ on on on -888.88 │ │ *DIP SW3は予備。 └───┘ 17. マウント参考図 MAIN基板 CN3の信号引き出し線の色分け。(USBケーブル流用) G:黒(GND)。 D:白(DATA)。 C:緑(CLOCK)。 1.7V:赤。 LED基板 LED基板(U) 18. センサーの原理 実験に使用したデジタルノギスは、ジョーの移動量を静電容量の変化で検出します。 ノギスの回路基板の裏側のプリントパターンです。 目盛りシールの裏側のプリントパターンの画像がロックヒルさんの 「なんでも画像掲示板」に投稿されています。No.2887を参照。 T形のパターンに注目。 画像をお借りしました。 センサーの構造図 黄色の短冊状パターンのピッチは1インチ/40で、1どうし、2どうし、・・・・ 8どうしが並列に接続されています。 緑色のパターンを介して、黄色と赤色のパターンが静電容量で結合します。 黄色と緑色のパターンの重なり度合いが静電容量の変化になります。 変化検出のステップは1インチ/40/512で、換算すると0.001240234375mm/カウントで す。 この値を「乗算」の項目で係数として使用します。 静電容量変化検出素子は9ビット以上の分解能が必要です。 18.1. mm換算係数による誤差 mmに換算するときに用いる係数の有効数字桁によって生じる誤差を検討しました。 換算の基準値に0.001240234375mm/カウントを用いて少数点以下を切り捨てた場合の カウント値は 100mm:80629, 500mm:403149, 900mm:725669 です。 上記の各カウント値に係数を乗算したときの誤差(mm) 係数 100mm 500mm 900mm -----------+-----------+-----------+------------ 0.0012402 -0.00274 -0.01371 -0.02467 0.00124023 -0.00032 -0.00161 -0.0029 0.001mmの桁で切捨てた場合の表示値 係数 100mm 500mm 900mm -----------+-----------+-----------+------------ 0.0012402 99.99 499.98 899.97 0.00124023 99.99 499.99 899.99 0.001mmの桁で四捨五入をした場合の表示値 係数 100mm 500mm 900mm -----------+-----------+-----------+------------ 0.0012402 100.00 499.99 899.97 0.00124023 100.00 500.00 900.00 19. ノイズ対策 インバーターを使用したフライス盤にDROを取り付けて表示が不安定にならないよう に対策をしました。 こちらの文献も参考にして下さい。 www.jema-net.or.jp/jema/data/08-031-in.pdf#search='3相インバータのノイズ' 1) フライス盤本体のアース端子を接地します。 スケールをフライス盤に近づけた時に発生する表示の暴走がとまり、 0.01mm桁が時々変動する程度に改善しました。 ┌─┐ ┌┐│ │ │├┴─┴─┐ ││ │ │├─┬─┬┘ ││ └┬┘ ││┌───┐ ││└┬─┬┘ ┌─┤└─┴─┴─┐ │ │ │ │ └──────┘ │ ┴ 接地 2) スケール本体はフライス盤から電気的に絶縁して取り付けます。 双方が電気的に接触すると表示が暴走します。 ┌─┐ │○│←(1) ┌┴─┴┐ ┌─┬┤┌─┐├───────────┬─┐ │○││└─┘│ │○│ └─┴┤ ├───────────┴─┘ ↑ └───┘ ↑ (2) (3) (1)(2)(3)の取り付け穴に絶縁ブッシュなどを使用してフライス盤にスケールを 取り付けます。 ポリカーボネート製ネジ ↓ ┌──┐┌──┐ │ └┘ │ スケール └─┐ ┌─┘ ↓ ┌──┐│ │┌───────── │ ││ ││ └┬─┤│ │├─┬─────── │ ││ ││ │ │ ││ ││ │← 絶縁ブッシュ ──┴─┴┤ ├┴─┴───────────── ├──┤ フライス盤 ├──┤ ├──┤ ├──┤ │ │ 3) スケールとDRO間の接続ケーブルは、4芯シールド線を使用します。 ┌────┐ USBケーブル ┌────┐ │ │┌─────────┐ │ │ │スケール├│─────────│─┤ DRO │ │ ├│─────────│─┤ │ │ ├│─────────│─┤ │ │ 0V├│─────────●─┤GND │ │ │└─────────┘ │ │ └────┘ ↑ └────┘ └ アルミ箔と編組線で2重シールド USBケーブルは4芯の導線にアルミ箔テープを巻き付け、更に編組線で包み込んで あるため良好なシールド効果が期待出来ます。 スケールの移動でケーブルの屈曲が繰り返される場合は、断線しない様に工夫が 必要です。 4) フライス盤に取り付けられているインバーター収納ボックスからDROを離します。 実験では、5〜6cmの距離で表示の変動改善に効果がありました。 5〜6cm │ │ │←→│ │ │ │ ┌──┤フライス盤│ │ │イン│ │ ┌──┐ │バー│ │ │DOR │ │ター│ │ └┬┬┘ │ │ │ ┌┴┴───┴──┤ │ └────────┤ │ DORの金属ケースは取り付けステムから電気的に絶縁します。 5) スケール本体の電源端子に100u/10Vのアルミ電解コンデンサーを追加します。 ┌──────┐ ┌──────┐ │ ──●─ │ │ ──●─ │ │ ─┴─ │→│ │┴│ │ │ ┬ │ │ └┬┘ │ │ ──●─ │ │ ──●─ │ └──────┘ └──────┘ 釦電池の端子付近にコンデンサーを半田付けします。 コネクターの端子に電解コンデンサーを半田付けした例 黄色の枠内にあるコンデンサー。黒いので少し見難いです。 接続しているケーブルはUSBケーブルです。 時々発生する0.01mm桁の表示の変動が無くなりました。 釦電池を使用しても同等の効果を確認しました。 釦電池を使用する場合はDRO側か らの1.7Vの供給をカットします。 DROのトランジスターが釦電池の負荷になる ため、スケール単独の使用に比べて電池寿命が短くなります。 6) DROのACアダプターにACラインフィルターを挿入します。 AC100V ┌─────┐AC100V┌─────┐ DC5V ┌───┐ ────┤ACライン ├───┤AC ├───┤ DRO │ ────┤フィルター├───┤アダプター├───┤ │ └──┬──┘ └─────┘ └───┘ ┴ 接地 フィルターのアース端子(金属ケース)は出来れば接地します。 インバーターの回転スイッチをONした時のカウンタ値のリセットと、 まれに発生する0.01mm桁の表示変動が無くなりました。 ACラインフィルター。手前に3PのACコードを接続。裏側は3端子になっています。 写真上部に見える中央の端子はアース端子で、金属ケースに接続されています。 7) インバーターの電源にACラインフィルターを挿入します。 AC100V DC200V以上 3相交流 AC100V ┌─────┐↓┌───┐↓┌────┐↓┌─────┐ ────┤ACライン ├─┤倍電圧├─┤イン ├─┤フライス盤│ ────┤フィルター├─┤整流 ├─┤バーター├─┤3相モータ │ └──┬──┘ └───┘ │ ├─┤ │ ┴ └────┘ └─────┘ 接地 ├←──────────────→┤ この間は平行コードか捻り合わせた 電線で最短に配線します。 フィルターのアース端子(金属ケース)を接地します。 ノイズ源にラインフィルターを使用すると、ACラインに接続された他の機器に 対するノイズ妨害の軽減が期待できます。 DROとインバーターにノイズフィルターを同時に使用して、DROのノイズマージンを さらに改善します。 8) カウンターリセットスイッチの入力にチャタリング処理を追加します。 モーターをスタートした時のカウンタ値のリセット防止と、 静電気放電による誤動作防止に効果が期待できます。 プログラムによる処理時間は10msecです。 20. 実験の経過 △1 2011.04.06(水) 3軸DRO回路図変更。 EMIフィルタ、低電圧検出、電圧クランプ等を追加。 ATmega88 ┌──────┐ │ │7 │ Vcc├─●───────────────●──●─┐ │ │20│ │ │ │ │ AVCC├─┘ 220Ω │ │ │ │ Xスケール │ │ │ │ │ ┌───┐ 1.7V │ │ │ │ │28 ┌──┐│ VDD├●─●───● │ │ │ XCLK PC5├──┤I/F ├┤CLK ││ │100u │LED │ │ │ │27 │ブロ││ ││ ┴ 6.3V ▼ │ │ │ XDT PC4├──┤ック├┤DT ││ ┬ ┬ │ │ │ │ └──┘│ GND├──●───┘ │ │ │ │ └───┘│ │ │ │ │ │ │ │ 1000u ┴ │ │ │ Yスケール│ │ 10V ┬ │ │ │ ┌───┐│ │ │ │ │ │26 ┌──┐│ VDD├● ●──────┘ │ │ YCLK PC3├──┤I/F ├┤CLK ││ │ │ │ │25 │ブロ││ ││ │ ┌──────┘ │ YDT PC2├──┤ック├┤DT ││ │ │ │ │ └──┘│ GND├──● │ POWER SW │ │ └───┘│ │ │ S1 │ │ │ │ │ ┌────┐ / │ │ Zスケール│ │ ●─●┤EMI ├○ ○─ 5V │ │ ┌───┐│ │ │ ││フィルタ│ │ │24 ┌──┐│ VDD├┘ │ │ │└──┬─┘ │ ZCLK PC1├──┤I/F ├┤CLK │ │ │ ┴ 0.1 ●──── アース │ │23 │ブロ││ │ │ │ ┬┌──┴─┐ │ ZDT PC0├──┤ック├┤DT │ │ │ ●┤EMI ├──── 0V │ │ └──┘│ GND├──● │ ││フィルタ│ │ │ └───┘ │ │ │└────┘ │ │ │ │ │ │ │8 │ │ │ │ GND├─●───────────●───●──┐ │ │22│ │ │ │ │ GND├─┘ │ └──┐ │ │ │ 低電圧検出 │ │ │ │ │ ┌───────────● │ │ │9 ┌─┴─┐ │ │ │ │ SAVE PB6├────┤TCM809│ │ │ │ │ │ └─┬─┘ │ │ │ │ │ └──────● │ │ │ │ │ │ │ │ │5 ─┴─ F │ │ │ │FUNCTION PD3├────○ ○──────● │ │ │ │2 ─┴─ X │ │ │ │ X/+ PD0├────○ ○──────● │ │ │ │3 ─┴─ Y │ │ │ │ Y/- PD1├────○ ○──────● │ │ │ │4 ─┴─ Z │ │ │ │ Z/2 PD2├────○ ○──────┘ │ │ │ │ │ │ │ │ │ │ │ │ 20文字4行LCD │ │ │ │ SC2004CSWB │ │ │ │ ┌──────┐ │ │ │ │11 4│ │1 0V │ │ │ RS PD5├──────┤RS Vss├──────● │ │12 5│ │2 5V │ │ │ RW PD6├──────┤RW Vdd├────┘ │ │ │13 6│ │3 │ │ E PD7├──────┤E VLC├──5KΩ │ │ │14 11│ │ ↑ │ │ DB4 PB0├──────┤DB4 │ └───┘ │ │15 12│ │ コントラスト調節用 │ DB5 PB1├──────┤DB5 │ 半固定抵抗器 │ │16 13│ │ │ DB6 PB2├──────┤DB6 │ │ │17 14│ │ │ DB7 PB3├──────┤DB7 │ │ │ │ │ └──────┘ └──────┘ I/Fブロック(電圧クランプダイオード追加) ┌──────────┐ │ ┌─●────── 1.7V(スケール用電源) │ │ │ │ │ ┴ ┴ │ │ D▲ D▲ │ X,Y,Z │ │ │ │ ┌─ CLK ───10KΩ ─●────── CLK ─┐ X,Y,Z ATmega88へ ←┤ X,Y,Z │ │ │ ├← スケールから └─ DT ───10KΩ ───●──── DTK ─┘ │ │ └──────────┘ D=HN2S01FU 1/3(小信号ショットキー) ATmega88端子配列 ┌────────┐ │1 RESET PC5 28│XCLK X│2 PD0 PC4 27│XDT Y│3 PD1 PC3 26│YCLK Z│4 PD2 PC2 25│YDT F│5 PD3 PC1 24│ZCLK │6 PD4 PC0 23│ZDT │7 Vcc GND 22│ │8 GND AREF 21│ SAVE│9 PB6 AVCC 20│ │10 PB7 PB5 19│ RS│11 PD5 PB4 18│ RW│12 PD6 PB3 17│DB7 E│13 PD7 PB2 16│DB6 DB4│14 PB0 PB1 15│DB5 └────────┘ 2011.04.01(金) 電源電圧変化とEEPROM書込みタイミングを測定。 1:電源電圧。 2:TCM809出力。アクティブLow 3:EEPROM書込み中=Low。書込み後はHigh/Low各1msecのパルス出力。 POWER SWオフからの経過時間 1) TCM809が電圧降下を検出するまで=26.9msec 2) EEPROM書込み開始まで=36.0mec 3) EEPROM書込み終了まで=90.0msec 4) 電源電圧が2.7Vに降下するまで=177msec 2011.03.30(水) 停電時に表示値を保存する検討。 マイコン用のリセットIC(TCM809)で電圧降下を検出し、ATmega88のSAVE端子に入力 します。 検出電圧は4Vです。 5V ────●────────●───── │ ┌──┴──┐ ┌─┴─┐ SAVE│ │ │TCM809├───┤ ATmega88 │ └─┬─┘ │ │ │ └──┬──┘ 0V ────●────────●───── 2011.03.07(月) ノイズフィルタの比較。 上:LとCによるフィルタ。効果無し。ノイズ発生器のSW1を1回接触して表示異常。 下:EMIフィルタ。効果有り。今日はSW1の接触98回目で表示異常。 フィルタコスト比較 上:コイル\60×2+コンデンサ\10×2=\140。 下:EMIフィルタ\25×2=\50。 2011.03.06(日) EMIフィルタの効果実験。 表示異常になるまでのノイズ発生回路のSW1を接触する回数。 フィルタ無しの場合、10回以内。 フィルタ有りの場合、50回程度。 EMIフィルタのコモンをスケールの筐体に接続しない場合は、 10回以内で表示異常になります。 実験回路 使用したEMIフィルタはVFS6VD81E221。 ┌───┐ 5V ┌──────┐ │ ├──┤EMIフィルタ ├────●──── 5V │ DRO │ └───┬──┘ │ │ 基板 │ ●─────┐ │ ACアダプタへ │ │ 0V ┌───┴──┐ │ │ │ ├──┤EMIフィルタ ├──────●── 0V └─┬─┘ └──────┘ │ │ │ │ │┌┴─┴┐ //(CLK,DATA,1.7V,0V) ││ノイズ│02.23(木) │ ││発生器│(1)を参照 ┌─┴─┐ │└─┬─┘ ┌──┤┌─┐├──────────┐ │ │ │ │└─┘│ ●─●──┘ │ ┌┤ ├──────────┘ │ │└┬──┘ \ │ / \/ 2011.02.23(水) ノイズの影響をテストしました。 DCモータ端子に発生したパルス状のノイズをDROとスケールのフレーム間に印加。 0.00mmがノイズ印加後に-5.05mmになりました。スケールも同じ値を表示。 ノイズ発生回路 (1)はモータと電池を直接接続。 (2)は(1)にACラインフィルターを追加。 SW1はモーターリードを指で持って電源側に接触しON/OFF。 DROへはコモンモードノイズとして印加。 (1)の電池両端のノイズ波形 200V近いノイズが発生します。 スケールが誤動作します。 ATmega88のフラッシュROMのデータが書き換わた事が 1度ありました。 (2)の電池両端のノイズ波形 ACラインフィルターの効果でノイズ電圧が8V程度まで低下。 スケールとDROにノイズの影響は有りません。 (2)のノイズ発生回路の結線 2011.02.20(日) スイッチの削減。 RESETスイッチの[X][Y][Z]がファンクション系の[+][-][2]を兼用します。 2011.02.12(土) Lunch box DRO。 Side dish。 2011.02.10(木) 3ch DRO 基板切削。 F100。切り込み量0.1mm。スピンドル回転数5,000rpm。 02.05(土)の汎用ランド(右側)をノイズフィルター回路に変更しました。 2011.02.05(土) 3ch基板の部品配置 縦48mm×横80mm 2011.02.01(火) 回路図 ATmega88 ┌──────┐ POWER SW │ │7 ○─ 5V │ Vcc├─●──────────────●───●─●─○/ S1-1 │ │20│ │ │ │ . ○ │ AVCC├─┘ 220Ω │ │ . │ │ Xスケール │ │ │ . │ │ ┌───┐ 1.7V │ │ │ . │ │28 │ VDD├●─●──● │ │ . │ XCLK PC5├──10KΩ ─┤CLCK ││ │ │LED │ │ . │ │27 │ ││ ┴ V ┴ │ . │ XDT PC4├──10KΩ ─┤DT ││ ┬ ┬ ┬ │ . │ │ │ GND├──●──┘ │ │ . SAVE SW │ │ └───┘│ │ │ │ . ○ │ │ │ │ ●───○/ S1-2 │ │ Yスケール│ │ │ │ ○ │ │ ┌───┐│ │ │ │ │ │ │26 │ VDD├● │ │ │ │ │ YCLK PC3├──10KΩ ─┤CLCK ││ │ │ │ │ │ │25 │ ││ │ │ │ │ │ YDT PC2├──10KΩ ─┤DT ││ │ │ │ │ │ │ │ GND├──● │ │ │ │ │ └───┘│ │ │ │ │ │ │ │ │ │ │ │ │ │ Zスケール│ │ │ │ │ │ │ ┌───┐│ │ │ │ │ │ │24 │ VDD├┘ │ │ │ │ │ ZCLK PC1├──10KΩ ─┤CLCK │ │ │ │ │ │ │23 │ │ │ │ │ │ │ ZDT PC0├──10KΩ ─┤DT │ │ │ │ │ │ │ │ GND├──● │ │ │ │ │ └───┘ │ │ │ │ │ │ │ │ │ │ │ │8 │ │ │ │ │ GND├─●───────────●──────●────── 0V │ │22│ │ │ │ │ │ GND├─┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │9 │ │ │ │ │ SAVE PB6├──────────────────────────┘ │ │ │ │ │ │ │5 ─┴─ F │ │ │ │FUNCTION PD3├────○ ○──────● │ │ │ │19 ─┴─ + │ │ │ │ + PB5├────○ ○──────● │ │ │ │18 ─┴─ − │ │ │ │ − PB4├────○ ○──────● │ │ │ │6 ─┴─ 2 │ │ │ │ 2 PD4├────○ ○──────● │ │ │ │2 ─┴─ X │ │ │ │ X PD0├────○ ○──────● │ │ │ │3 ─┴─ Y │ │ │ │ Y PD1├────○ ○──────● │ │ │ │4 ─┴─ Z │ │ │ │ Z PD2├────○ ○──────┘ │ │ │ │ │ │ │ │ │ │ │ │ 20文字4行LCD │ │ │ │ SC2004CSWB │ │ │ │ ┌──────┐ │ │ │ │11 4│ │1 0V │ │ │ RS PD5├──────┤RS Vss├──────● │ │ │12 5│ │2 5V │ │ │ RW PD6├──────┤RW Vdd├────────┘ │ │13 6│ │3 │ │ E PD7├──────┤E VLC├──5KΩ │ │ │14 11│ │ ↑ │ │ DB4 PB0├──────┤DB4 │ └───┘ │ │15 12│ │ コントラスト調節用 │ DB5 PB1├──────┤DB5 │ 半固定抵抗器 │ │16 13│ │ │ DB6 PB2├──────┤DB6 │ │ │17 14│ │ │ DB7 PB3├──────┤DB7 │ │ │ │ │ └──────┘ └──────┘ ATmega88端子配列 ┌────────┐ │1 RESET PC5 28│XCLK X│2 PD0 PC4 27│XDT Y│3 PD1 PC3 26│YCLK Z│4 PD2 PC2 25│YDT F│5 PD3 PC1 24│ZCLK 2│6 PD4 PC0 23│ZDT │7 Vcc GND 22│ │8 GND AREF 21│ SAVE│9 PB6 AVCC 20│ │10 PB7 PB5 19│+ RS│11 PD5 PB4 18│- RW│12 PD6 PB3 17│DB7 E│13 PD7 PB2 16│DB6 DB4│14 PB0 PB1 15│DB5 └────────┘ 2011.01.30(日) 操作パネルのイメージ ┌──────────────┐ │ ┌─────────┐ │ │ │ 3 AXES DRO /ioio │ │ │ │ X= 123.45 mm │ │ │ │ Y= 0.00 mm │ │ │ │ Z= 2.54 mm /2 │ │ │ └─────────┘ │ │ ┌FUNCTION┐┌RESET ┐ │ │ │○○○○││○○○│ ● │ │ │F+−2││XYZ│ POW │ │ └────┘└───┘ │ └──────────────┘ RESET :各chの表示をリセット。 FUNCTION: F :[+][−][2]のキー操作を可能にします。 + :プリセット値をインクリメント。 ー :プリセット値をデクリメント。 2 :スケールの出力値を2倍にして表示。 POW :電源と「SAVE」スイッチ。2回路2接点。 :1回路が電源ON・OFF、残り1回路が「SAVE」。 ○ :プッシュスイッチ。モメンタリ型。 ● :プッシュスイッチかスナップスイッチ。オルタネート型。 2011.01.25(火) LCDモジュールを20文字4行で白色バックライト付に交換しました。 縦26mm×横77mm 型名=SC2004CSWB。 2011.01.23(日) スケールが接続されていないか、高速モードに設定されていないチャンネルを 検出するようにしました。 "-.--"で表示します。 2011.01.21(金) 表示値のEEPROMへの保存と、次回パワーオンした時の表示値復旧を 追加しました。 [SAVE]キーオンで表示値をEEPROMに保存。 電源をオフします。 電源オフからオンでEEPROMからデータを読出中。 2011.01.18(火) プリセット機能を追加しました。 [Function]キーを押して計測チャンネルを選択。 同キーを押すごとにX,Y,Zの順に選択候補が切換わります。 [+]または[−]キーを押すとプリセットモードになります。 [+][−]キーで数値を変更。スケール値にプリセット値を加えた値を表示します。 同キーのON時間が0.4秒未満なら押すごとに0.01mm毎に変化し、 0.4秒以上2.5秒未満までの連続押しの間は低速で連続変化、 2.5秒以上連続で押していると高速で変化します。 [Function]キーを押すと計測モードに戻ります。 X=はスケールの出力値。 Y=はスケールの出力値にプリセット値を加えた値。 Z=はスケールの出力値を2倍した値。 1個のノギス出力を各ch同時に入力しています。 2011.01.11(火) 計測値の2倍スイッチを追加しました。 chごとに設定可。 /2で2倍スイッチオンを表示。 2011.01.04(火) リセットスイッチ入力を追加しました。 リセット(スケールの初期化)処理中は" ------ "を表示します。 2010.12.30(木) 3ch入力と、スケールの初期化(高速化)を追加しました。 1つのノギス出力を各ch同時に入力しているため同じ値です。 2010.12.27(月) 係数倍(×0.00124023mm/count)。10進数変換。文字コード変換。0と負号の右詰め。 などを追加しました。 2010.12.25(土) 上はノギスの表示。 下はノギスの出力値をLCDモジュールで表示。 01B7B(16進)は7035(10進)、これに係数を掛けると、 01B7B(count)×0.001240234375(mm/count)=8.725048828(mm)です。 ノギスの出力(クロックとデータ)をATmega88のアナログコンパレータ入力に直結 する事で、レベル変換用のトランジスタが不要になりました。 2010.07.18(日) keiokuさんの業務用旋盤に取り付けられたスケールで、実装テストをしました。 主軸モーターを起動しても表示が安定。送りハンドルの回転速度への追従性も実用 範囲との評価を頂きました。 2010.07.09(金) 第4フォーマット用のDROが4セット完成、1セットづつエージングテスト中です。 2010.07.05(月) ±0.01mmのキャンセルを追加。ノギスのリセットスタート後に±0.01mm以内の変化 で、ノギスの再リセットを行う場合に±0.01mmの変化量をオフセットに加算しない ようにしました。 ±0.01mmのキャンセル方式でエージング。 1回目:0.00mmが24時間後に0.00mm。 2回目:14.85mmが24時間後に14.85mm。 3回目:-32.89mmが8時間後に-32.89mm。 以上からDROの表示誤差の累積は改善されました。 備考:エージングは、約16秒でノギスを再リセットするようにし、 4分での再リセットに比べて4倍、24時間なら96時間に相当するテストを行いました。 2010.07.01(木) エージングのその後 4回目:17時間後にDROが0.00mmを表示。 5回目:15時間後にDROが0.06mmを表示。 6回目:15時間後にDROが0.00mmを表示。 2010.06.28(月) エージングの内容。 カーソル(ノギスのジョー)を適当な位置まで動かしてDROの電源をオンし放置。 又は、DROの電源を投入後カーソルを動かして適当な位置で停止した後、DROのリセ ットスイッチをオンして放置。 1回目:16時間後にDROが0.02mmを表示。 2回目:17時間後にDROが0.05mmを表示。 3回目:12時間後にDROが0.00mmを表示。 ノギスのLCDの表示がたまに"0.00"から"0.01"に変化するようなカーソル位置で停 止すると、表示の誤差が累積します。 ワースト条件では、1時間で0.15mm程度の誤差を表示します。 ノギスの電源オン後にノギスのLCD表示が"0.00"から"0.01"になり、そのまま4分経 過し電源オフ、再びノギスの電源した時に同じ事が繰り返される場合がこれにあた ります。 このタイプ(第4のフォーマット)のノギスをDROとして使用するには、 1)4分以内にカーソル(ジョー)を動かす。 2)1/00桁が頻繁(4分以内)に変化する位置でカーソルを停止する。 3)カーソルの停止時間が4分を超えたら、DROの絶対値表示を諦める。 停止した位置を原点とし、次にカーソルを移動する前にDROをリセットして 相対距離で移動する。 などの工夫が必要です。 200mmノギスのその後。 当初、電池液漏れが原因で釦操作に一部不具合があったもののthreesモードでDRO 動作を確認しましたが、約1月ぶりに電源をオン(inch釦で?)したところLCDの表 示が暴走するようになりました。DROに接続しても同じ症状です。 電池液漏れの後遺症で、接触不良や絶縁不良が進行している可能性があり、このノ ギスは使えそうにありません。 2010.06.25(金) DRO基板からプログラム書き込み器を外し、エージング動作中です。 2010.06.19(土) ノギスの電源ONから4分経過すると、DROの表示を11秒間点滅します。 電源ONからOFFまでの間でノギスの計測値が変化すると、4分タイマーが再スタート し、点滅までの時間を延長します。 DROの点滅が11秒を過ぎると、ノギスの電源をOFF、1秒後にONにしてノギスを再起 動します。ノギスのLCD表示は"0.00"になり、DROの表示はノギスの電源をOFFする 直前の値を表示します。 DROの表示が点滅している間は、ノギスのカーソルを移動しないように注意します。 4分 1秒 ├←──────────→┤ →┼┼← ノギス電源 ─┐┌───────────────┐┌───── └┘ └┘ ┌──┐ DRO表示点滅───────────────┘ └─────── ├←→┤ 11秒 2010.06.14(月) ノギス電源オンからの経過時間カウンターを追加しました。 設定時間(約4分)を検出して、DRO表示の点滅等に利用します。 2010.06.11(金) DRO表示器側のリセットスイッチを使える様にしました。 1) AVRマイコンのオフセットメモリーを初期化(0x000000)します。 2) ノギスの電源をOFFにし、約1秒後に電源をONにしてノギスをリセットします。 2010.06.09(水) 電源の再投入でノギスがリセットされたときでも、DROで絶対値を表示するように しました。 1) 電源OFF直前のDRO表示値をオフセットとしてAVRマイコンでメモリーします。 2) リセット後のノギスの出力に、オフセットを加えて絶対値を求めます。 データを加算する際は事前に各々のデータを2の補数形式に変換しておきます。 2010.06.02(水) パケットのオフ期間が250msec以上になると、ノギスへの電源供給を0.2秒間オフ するようにしました。電源の再投入でノギスはリセットされ"0.00"を出力します。 リセットが不完全で"0.00"以外のデータが出力された場合は、ノギス出力が"0,00" になるまで、0.2秒間の電源オフを繰り返します。 2010.05.30(日) 第4のフォーマット用にプログラムを変更しました。 単位10μmのバイナリカウントを5桁の10進数に変換し表示します。 2010.05.27(木) 150mmノギスの出力を観測。新手の第4フォーマットです(仮称)。 パケット周期 16ms 200ms ├─────┼─────────────┤ ──┬─────┬─────────────┬─────┬────────── └─────┘ └─────┘ パケット パケット パケットの構成 表示値の100倍のバイナリカウント(20bits) 負号/inch(4bits) ├←─────────────────────→┼────┤ 1 4 8 12 16 20 24 C ──┐│││┌┐│││┌┐│││┌┐│││┌┐│││┌┐│││┌─────── └┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘ D ──┐│││┌┐│││┌┐│││┌┐│││┌┐│││┌┐│││┌─────── └┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘└┴┴┴┘ LSB MSB 0.01mm表示の場合 1 2 3 4 5 6 7 8 9 10 11 C ──┐ ┌┐ ┌┐ ┌┐ ┌─┐ ┌┐ ┌┐ ┌┐ ┌─┐ ┌┐ ┌┐ ┌┐ └─┘└─┘└─┘└─┘ └─┘└─┘└─┘└─┘ └─┘└─┘└─┘└─ D ──────┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ └─┘└─┘└──┘└─┘└─┘└─┘└──┘└─┘└─┘└─┘└ 正でmm表示の場合 17bit〜20bit 負号/inch ├───────────┼────────────┼─────────── 21 24 C ──┐ ┌┐ ┌┐ ┌┐ ┌─┐ ┌┐ ┌┐ ┌┐ ┌───────────┐ └─┘└─┘└─┘└─┘ └─┘└─┘└─┘└─┘ └ D ──┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌┐ ┌─────────── └──┘└─┘└─┘└──┘└─┘└─┘└─┘└─┘ ↑正(0で) ↑mm(0で) 負でinch表示の場合 17bit〜20bit 負号/inch ├───────────┼────────────┼─────────── 21 24 C ┌─┐ ┌┐ ┌┐ ┌┐ ┌─┐ ┌┐ ┌┐ ┌┐ ┌──────────── ┘ └─┘└─┘└─┘└─┘ └─┘└─┘└─┘└─┘ D ──┐ ┌┐ ┌┐ ┌┐ ┌───┐ ┌───────────── └──┘└─┘└─┘└──┘ └─────┘ ↑負(1で) ↑inch(1で) 2010.05.25(火) 動作確認をしました。 200mmノギスはバイナリカウント出力(1/20480インチ単位)で、DRO基板に接続して threesモードでDRO動作を確認しました。 150mmノギスはthrees、isagida、mitutoyoのどれにも該当しない出力方式です。 DATA、CLOCKの信号端子は出力専用で、外部(DRO表示器)からの制御が出来ません。 また、パワーON後カーソルの移動が無いと、約4分40秒後にパワーOFFします。 パワーOFF中にカーソルを移動しても自動的にパワーONになりません。 パワーONは本体の[OFF/ON]釦で行い、表示値は"0.00"にリセットされます。 2010.05.24(月) keiokuさんから150mmと200mmのデジタルノギスが送られてきました。 ノギス用簡易コネクターを製作。切削基板と目玉クリップをコンタクトに流用。 2009.10.28(水) DRO起動時に高速パケット検出を追加。スケールが高速モードならばスケールの リセットを実行しないよう変更。(DRO_LED4.asm) 2008.07.09(水) DRO SIGNAL GENERATOR基板を製作。 上:DRO SIGNAL GENERATOR基板(isagida仕様で出力中) 中:threes/isagida兼用DRO main基板 下:7segLED基板(Float Bit点灯) DRO SIGNAL GENERATOR基板のDIP SWで仕様と表示データを選択します。 SW1 SW2 仕様 -----+-----+------------ OFF OFF threes ON OFF isagida OFF ON mitutoyo SW4 SW5 SW6 表示データ -----+-----+-----+----------- OFF OFF OFF 0.00 OFF OFF ON 123.45 OFF ON OFF -123.45 OFF ON ON 500.00 ON OFF OFF -500.00 ON OFF ON 999.99 最大値確認 ON ON OFF -999.99 最大値確認 ON ON ON -888.88 セグメント結線確認 DIP SW3は予備。 フラッシュROM領域から出力データの読出し例: mitutoyo_data_set: ldi temp, 6 ; テーブルステップ rcall cal_offset ; DIP-SW入力。acc=テーブルオフセット ldi ZL, low(mitutoyo_data*2) ; ldi ZH, high(mitutoyo_data*2) ; add ZL, acc ; clr acc ; adc ZH, acc ; lpm caliper0, Z+ ; DOTポイント取得 lpm caliper1, Z+ ; lpm caliper2, Z+ ; lpm caliper3, Z+ ; lpm caliper4, Z ; 符号データ取得 ret ; threes_data: .db $00, $00, $00, $00 ; 0.00 .db $D1, $84, $01, $00 ; +123.45 .db $2F, $7B, $FE, $00 ; -123.45 .db $CD, $26, $06, $00 ; +500.00 .db $33, $D9, $F9, $00 ; -500.00 .db $93, $4D, $0C, $00 ; +999.99 .db $6D, $B2, $F3, $00 ; -999.99 .db $61, $10, $F5, $00 ; -888.88 isagida_data: .db $00, $00, $00, $0C ; 0.00 .db $45, $23, $01, $0C ; +123.45 .db $45, $23, $01, $0D ; -123.45 .db $00, $00, $05, $0C ; +500.00 .db $00, $00, $05, $0D ; -500.00 .db $99, $99, $09, $0C ; +999.99 .db $99, $99, $09, $0D ; -999.99 .db $88, $88, $08, $0D ; -888.88 mitutoyo_data: .db $02, $00, $00, $00, $00, $00 ; 0.00 .db $02, $54, $32, $10, $00, $00 ; +123.45 .db $02, $54, $32, $10, $08, $00 ; -123.45 .db $02, $00, $00, $50, $00, $00 ; +500.00 .db $02, $00, $00, $50, $08, $00 ; -500.00 .db $02, $99, $99, $90, $00, $00 ; +999.99 .db $02, $99, $99, $90, $08, $00 ; -999.99 .db $02, $88, $88, $80, $08, $00 ; -888.88 2008.07.07(月) 基板に実装する部品のコスト試算をしました。 抵抗、トランジスター、LEDは1パックで購入した時の単価です。 秋月に10個入り\100円の7segLEDがあった時は、"ワンコインDRO"でした。 2008.07.04(金) mitutoyo DROを浮動少数点式にして、デジタルマイクロメータの0.001mmの表示に 対応。 データはDRO SIGNAL GENERATORで発生。 2008.07.03(木) DRO SIGNAL GENERATORの実験で、mitutoyo仕様のスケールデータを発生しました。 2008.07.01(火) DRO SIGNAL GENERATORの実験で、threes仕様のスケールデータを発生しました。 2008.06.30(月) DRO SIGNAL GENERATORの実験。 ATtiny2313でisagida仕様のスケールデータを発生しました。 2008.06.28(土) ミツトヨ用 DRO MAIN基板 パターンはCNCで切削。 切削条件: 切込量 送り速度 回転数 平面 カッター [mm] [mm/min] [RPM] 補正 -----------------+-------+----------+--------+------ 超鋼,#1200仕上げ 0.07 F100 4,600 ON 2008.06.25(水) ミツトヨ用 DRO I/F回路 ATtiny2313 ┌───┐ │ │20 │ VCC├─────●──●─────●───── +5V │ │ │ │ 100u/10 │ │ │ │ │ │┴│ │ │ │ │ └┬┘ │ │ │ │ │ │ │ R10K │ ●───── 0V │ │ │ │ │ │ │ │ │ │ ミツトヨ │ │ │ │ │ デジタルキャリパー │ │6 │ │ │ 3┌──────┐ │ PD2├─R2.2K ─●───────────┤CK │ │ │ │ │ │ │ │ │ R10K │ │ │ │ │7 │ │ 2│ │ │ PD3├─R2.2K ────●────────┤DATA │ │ │ │ │ │ │ │ カウンタリセット │ │ │ │ │9 ─┴─ │ │ │ │ PD5├───○ ○────────● │ │ │ │ │ │ 1.5V │ │ │ │ │ │ │ │ │ 2SC1815 │ │ (PU R50K) │ │ │8 B┌─┐C │ 5│ │ │ │ PD4├───R10K─●──┤ ├─────┤-REQ─┘ │ │ │ │ └┬┘ │ │ │ │ │ R10K E│ │ │ │ │ │10 │ │ │ 1│ │ │ GND├──────●───●───●──┤GND │ │ │ └──────┘ │ │ └───┘ 6桁7segLED回路はこちらを参照してください。 2008.06.23(月) ミツトヨのI/Fでは外部リモートによるカウンタリセットが利用できないため、 DROのカウンタリセット釦押しで最新のデータを比較用レジスターに格納し、 定期的に受信するデータと比較用レジスターとの差分を表示するようにしました。 ノギスの10.00mmでDROのカウンタリセット釦をONした場合。 2008.06.21(土) ミツトヨの出力で実験しました。 2008.06.16(月) 出力信号フォーマット(threes/isagida)のポート切換えに対応。 PD1=1でthrees。 PD1=0でisagida。 7segLED駆動のFloatBit方式採用で余ったポートに、カウンターリセットと フォーマット切換え入力を割り当てました。 2008.06.14(土) tsuzukiさんの工房で、450mmスケール(isagida扱い)とDRO基板の動作テストを 実施。 動作OK。 2008.06.12(木) 従来のダイナミック点灯ルーチンを改造して、 6桁の7segLEDをFloatBit方式で駆動しました。DROとのリンクは未対応です。 主な改善点: 1) MAIN基板からLED基板への配線数を14本から9本に削減。 2) ポート4本が別な用途に使用可能。 3) 変数dot_posの設定値0〜6で浮動小数点に対応。 4) 定数MAX_LEN=8で8桁まで対応。 0と負号を右詰めした様子。 超高輝度LED(Tpy:21mcd)の使用で、アノード・コモンをマイコンに直結しても充分 な明るさです。 5mA/seg。 FloatBit用7segLED基板をCNCで切削し、1/6W抵抗を9本、5mmジャンパー線を4本と 7segLEDを6個マウントしました。 2008.06.08(日) isagidaタイプのスタート時にパルス列の周期を計測し、高速モードになったこと を確認する処理を追加。 カウンターリセットスイッチのチャタリング処理を追加。 threesタイプでmm変換係数を12402倍から124023倍にし、0.001mm桁での四捨五入を した場合の表示誤差を検討。 2008.06.06(金) 2種類のスケールの比較 threes isagida 備考 ----------------------+----------+-----------+------------------------ 電源投入時遅延 3sec 14sec 高速モード設定を含む 電源投入時In/mmモード mm In isagidaはLEDで"inch"点滅 カウンターリセット 1sec 4sec 高速モード設定を含む 高速モード周期 24.8msec 24.8msec 電源投入時の遅延処理中とカウンターリセット中は"----.--"を表示 プログラムは兼用。ただしアセンブルスイッチでタイプ別のmainルーチンへ ジャンプ。 PA2の入力条件によるタイプ切換えは、若干のプログラム変更とFUSE BITの書換え が必要。FUSE BITを書換えてPA2を汎用ポートに設定した後は、フラッシュROMや FUSE BITの書換えが出来なくなるので要注意。 2008.06.04(水) 1) 出力高速モード設定の安定化検討。 2) インチモードで" in.ch"の点滅を追加。 3) -0.00で負号の非表示を追加し0.00で表示。 3) スケール本体にコネクターを追加。 コネクター基板は、蛇の目両面基板にスライドエッジと外形をCNCで加工し、 4Pコネクターとノイズ対策用電解コンデンサ-(100u/10V)をマウント。 2008.06.01(日) この資料は暫定で、断り無く変更することがあります。 450mm デジタルスケール(販売元:isagida)の出力フォーマット測定。 1) 出力端子(パターン) 0 DT CK +B ┌────────┐ │┌┐┌┐┌┐┌┐│ ││││││││││ ││││││││││ 0 :0V(GND) DT:DATA CK:CLOCK +B:1.5V(電源) 注意) 以下のタイミングチャートは、信号を受信したトランジスターの出力で スケールの出力に対して反転しています。 2)データ列 ┌──┬──┬──┬──┬──┬──┬────┐ CLOCK ──┴──┴──┴──┴──┴──┴──┴────┴─────── ┌──┬──┬──┬──┬──┬──┬────┐ │LSD │ │ │ │ │MSD │符号/END│ DATA ──┴──┴──┴──┴──┴──┴──┴────┴─────── │←→│ 4ビット、BCD、LSB first 3) CLOCKとデータのタイミング 104u │←─────────→│ │ 57.6u 12u │ │←──→│─│← │ ┌────┐┌┐┌┐┌┐┌────┐┌┐┌┐┌┐┌────┐ CLOCK ──┘ └┘└┘└┘└┘ └┘└┘└┘└┘ └ ┌─────┐ ┌─┐ ┌─────┐ ┌─┐ ┌───── DATA ──┘ └─┘ └─┘ └─┘ └─┘ LSB first 4) 符号ビットとデータ終端 ┌┐┌────┐┌┐┌┐┌┐┌────┐ CLOCK ┘└┘ └┘└┘└┘└┘ └──────────── ┌───┐┌─┐ DATA ────────────┘ └┘ └──────────── │←───→│ │←───→│←→│ +符号 in 終端 ┌─────┐ ┌───┐┌─┐ DATA ──┘ └───┘ └┘ └──────────── │←───→│ │←───→│←→│ ー符号 in 終端 ┌─────┐┌─┐ DATA ──────────┘ └┘ └──────────── │←───→│ │←───→│←→│ +符号 mm 終端 ┌─────┐ ┌─────┐┌─┐ DATA ──┘ └─┘ └┘ └──────────── │←───→│ │←───→│←→│ ー符号 mm 終端 5) スケールのモードセット CLOCKおよびDATAの出力端子を+Bにプルアップする事でスケールの測定モードや 信号出力周期を変更可能。 ┌──┐ ┌──┐ ┌──┐ ┌──┐ CLOCK ──┘ └────────┘ └──┘ └──┘ └─── ┌──┐ ┌──┐ DATA ──┘ └──┘ └───────────────────── モード 0-RESET H F.T H F.T →┐ │←→│←→│ └← 繰返し ──┘ TH TH THは保持時間で400msec以上 さらに ┌──┐ CLOCK ──┘ └─────────────────────────── ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ DATA ──┘ └──┘ └──┘ └──┘ └──┘ └─── モード 0-RESET H MINI/F.T MAX/F.T →┐ └←───────────── 繰返し ──┘ 0-RESET:測定値を0リセット H :測定値をホールド F.T :高速出力周期 MINI :最小値表示 MAX :最大値表示 6) データ転送周期 モード 周期msec ----------+---------- ノーマル 320.0 F.T 24.8 2008.02.04(月) 1軸用の基板を切削し、動作確認をしました。 DRO_MAINとDRO_LEDの2枚で一組です。 2008.01.02(水) デジタルノギスを3本、接続しました。 ノギス電源電圧=1.78V、ノイズは有りません。 追加した2本のノギスは、信号引出し用パターンにリード線を直接半田付し、 深さ測定用のバーを取り外しました。 2007.12.30(日) 400mmデジタルスケールで動作テスト。ロックヒルさん撮影。 昨日ロックヒルさんの工房で動作を確認しました。 信号引出し用パターン配置は、デジタルノギスと同じです。 インバータ駆動中のフライス盤に近づけても動作OKです。 但し、スケール本体をフライス盤に接触すると表示が暴走するため、フライス盤と の絶縁が重要です。 400mm水平デジタルスケールDijiScalesH40(スリースカンパニー取扱品) 2007.12.17(月) 最上位桁からの0消灯と、負号の右詰めを追加しました。 2007.12.16(日) 電源のオンオフテストで、ノギス自体のリセットが確実に行われない事がある為、 赤色LEDと並列にブリーダー抵抗4.7Kを追加しました。 300回の電源プラグの抜き差しOK。 2007.12.15(土) 資料にゼネラルフローチャートを追加しました。 2007.12.14(金) ノギス電源用LEDのシリーズ抵抗値を4.7Kから1Kに変更しました。 Vcc ──R1K ──●─────●───── +1.79V │ │ ┌┴┐ │ │V│赤色 ┴ 0.1μ/50V ├─┤LED ┬ └┬┘ │ │ │ GND ──────●─────●───── 0V ノギス用電源のレギュレーション Vcc=4.97V 負荷 出力 LED電流 負荷電流 レギュレーション ------+-------+----------+----------+------------------------ 解放 1.79V 3.18mA 1KΩ 1.76V (1.42mA) 1.76mA -0.017V/mA(-0.97%/mA) 実用範囲です。 負荷は、ノギス出力のCLOCKとDATAが3軸同時にHiになったときの全負荷を想定。 1個のI/F回路の入力抵抗 トランジスターのVBE=0.713V。 トランジスターの入力抵抗は Ri=0.713/((1.79V-0.713V)/4.7K)=3.1K。 ベースバイアス抵抗を含めると Rin=4.7K+3.1K=7.8K。 6個のI/F回路の合成入力抵抗 RL=7.8K/6=1.3K。 から1KΩとしました。 3端子レギュレーターのレギュレーション AZ1117H-ADJ(LM1117MPX-ADJ相当) Vcc=4.97V 3┌───┐2 ──●──┤ ├──●──●── 1.685V │ │ │ │ │ │ └─┬─┘ R150 │ │ 1│ │ │ │┴│ └────● │┴│10μ/6.3 └┬┘ │ └┬┘ │100μ/16 R51 │ │ │ │ ──●─────────●──●── 0V 負荷 出力 負荷電流 レギュレーション ------+-------+----------+------------------- 解放 1.685V 1KΩ 1.685V 1.685mA 0V/mA さすがです。 2007.12.11(火) 3軸分の配線が完了、動作チェックをしました。 2007.12.06(木)のカウンターリセットの不具合は、自作コネクターの接触不良が 原因でした。 コンタクトピンを再度半田付けし直した後は、カウンターリセット が確実になりました。 2007.12.08(土) 3軸分の部品配置を汎用基板で検討。 直尺の上のラインでカットします。 7segLED配線 4*7*3=84本で息切れ。 2007.12.07(金) 測定値が-000.001mmから-000.009mmの時に、表示が-000.00mmのように"-"のLEDが 点灯します。 対策: 桁の表示データが000.00のときに、signフラグをリセットするようにしました。 2007.12.06(木) カウンターリセットの不具合の原因を検討しました。 追伸: 2007.12.11(火) ノギスの引き出しパターンの1) 0Vと自作コネクターのコンタクト との接触不良でした。 現象:カウンターリセットで時々000.00にならない。 原因: 上:外部GNDと釦電池(-)間の電圧。1V/DIV。 下:リセット信号。DATAプルアップ側。5V/DIV。 1) リセット時に外部GNDと釦電池(-)間に約0.9Vの電位差が発生。 2) この電位差によりノギスの内部回路の電源電圧が不足。 2) 電圧不足で回路が誤動作。リセット不良発生。 対策:電源供給の(-)側は、ノギスの釦電池の(-)側に直結します。 結果:確実に000.00にリセットします。 2007.12.05(水) 0.001mmの桁での四捨五入を検討しました。 結果は、ノギスの表示よりも0.01mm桁の値が+1される事が多くなります。 ノギス本体の表示とDROの表示に差があっては好ましくない為、 四捨五入のルーチンをアセンブルスイッチでオフにするようにしました。 2007.12.04(火) ノギスデータの平均値計算を追加し、0.01mm桁のちらつきを改善しました。 ATtiny2313のSRAMをリングバッファー構成にして、ノギスデータを保存します。 SRAMに保存したデータの平均値を7segLED表示に使用します。 結果: サンプル数 ちらつき具合 ------------+-------------------------------------------- 1 目立ちます。 4 改善されます。 8 ノギスのLCDより若干多目です。(実用範囲) 16 良好。ジョーの移動に対する追従が遅くなります。 32 良好。ジョーの停止後約0.84秒で表示が確定。 2007.12.03(月) 負数の処理を追加。 2の補数処理で絶対値を求めます。 "−"記号をLED1個で代用。 7segLEDの最上位桁と同じタイミングでダイナミック 点灯をします。 2007.12.02(日) カウンターリセットスイッチ入力ポートをカウンターリセット出力ポートと 兼用にしました。 出力から入力にポートを切換えたときのポート入力電圧の立上り波形です。 入力レベル判定時0.72Vで、VIL規格(1.5V)を満足します。 VIH入力(3.8V)は規格(3.5V)を満足します。 2007.12.01(土) 4桁の7segLEDを点灯しました。 2007.11.30(金) ノギスのデータを入力し、乗算(mm変換)、除算(10進変換)の結果、1mm桁の値を トレースモニターで確認しました。 ノギスのジョーをスライドすると、inputの表示が0から9の範囲で変化します。 値はノギスの1mm桁表示と一致します。 他の桁についても同様です。 2007.11.29(木) 除算ルーチン(div)の処理時間を測定しました。 999.99mm相当のテストデータを使用。 処理時間は 76.0μsec です。 乗算と除算を合わせて101.4μsecで、高速パケット周期の24.8msecに対して十分に 高速です。 divルーチンは内部でループ処理をしています。ループ回数は、答えが9の時が最大 で、答えが0の時が最小です。 したがって除算の処理時間は、999.99mmの時が最大です。 2007.11.28(水) 乗算ルーチン(X12402)の処理時間を測定しました。 999.99mm相当のテストデータを使用。 処理時間は 25.4μsec です。 高速パケット周期の24.8msecに対して十分に速い計算速度です。 5桁の加算を12402回繰り返す方法では、プログラムが作り易く汎用性がある反面、 高速パケット周期より処理時間が掛かる為、実用的ではありません。 12402回繰り返す方法の例 multi: eor cnt_l,cnt_l eor cnt_h,cnt_h multi_10: clc 1 adc num20,num10 1 adc num21,num11 1 adc num22,num12 1 adc num23,num13 1 adc num24,num14 1 inc cnt_l 1 brne multi_20 2 inc cnt_h 1 multi_20: cpi cnt_l,low(12402) 1 brne multi_10 2 cpi cnt_h,low(12402) 2 brne multi_10 2 ------------ 17(cycle) 総サイクル数=17(cycle/回)×12402(回)=210834(cycle)。 処理速度=210834(cycle)×0.125(μsec/cycle)=26.35msec。 2007.11.27(火) 数値処理の簡便性の為、VC#にデータを取り込み動作確認を行い、 結果として、X,Y,Zの3軸を表示するWin版DROを作成しました。 ATtiny2313をクロック8MHzで3軸のデータを取り込むことは、タイミング上で多少 無理があり、16MHzにクロックアップした方がよさそうです。 信号やデータの取り扱い方法が分かって来ましたので、Win版DROは一時棚上げに して、本線の1軸LEDのDROを検討したいと思います。 ATtiny2313の乗算式を検討しました。 ノギスのカウント値をmmに換算するときに使用します。 基本は0.0012402倍の少数点演算ですが、12402倍による整数演算を利用します。 999.99mmを表示の最大値とした場合、ノギスのカウントが3バイト、計算の結果は 5バイト長に収まります。 2007.11.24(土) Win版DROに各軸ごとにデータ通信中のマークを追加しました。 青●=通信中。 赤●=通信停止。 2007.11.23(金) ATtiny2313のノギスのデータとクロックの入力ポートをマイコン内部でプルアップ しました。 上:内部プルアップのみ 下:外部プルアップ4.7Kを追加 信号波形の立ち上がりがゆるやかになりますが、DROの動作に影響はありません。 2007.12.06(木) 追記 ノギスのジョーを往復操作して、時々誤表示する事がある場合には、 外部プルアップ抵抗を使用してください。 X軸DATAのI/F回路 ATtiny2313 ┌───┐ │ │ │ Vcc├───●───────────── 5V │ │ │ │ PB1├─────────────┐ │ │ × │ │ │ R4.7K Q1 R15K │ │ × C┌─┐B │ │ PD4├───●─┤ ├─R4.7K ─●─── X軸ノギスDATA出力へ │ │ └┬┘ │ │ │E │ ├──────●────────── 0V └───┘ Q1=2SC1815 2007.11.22(木) ノギスのリセットと高速モード設定を追加しました。 1) ATtiny2313のパワーオンリセット・スタート時の初期化では、X,Y,Z用のノギス を同時にリセットし、高速モードに設定します。 2) Win版DROの[RESET]釦をクリックすると、RESETコマンドをATtiny2313へ送信し ます。 RESETコマンドを受信したATtiny2313は、X,Y,Zを個別にリセットし、 高速モードに設定します。 DATAとCLOCK端子を下記のタイミングでプルアップすることで、カウンタリセット と高速モードの設定を行います。 プルアップの組み合わせ RESET HOLD INC(高速モード) -------+-------+------+--------------------- DATA H H L CLOCK H L H タイミングチャート ┌───┐ ┌───┐ DATA(PB1) ─┘ └───┘ └──────────────── ┌───┐ ┌───┐ CLOCK(PB2) ─┘ └───────────┘ └──────── │100ms │100ms │100ms │100ms │100ms │ │←RESET MODE→│← HOLD MODE→│← Hi SPEED MODE(INC) → X軸DATAのプルアップ回路 ATtiny2313 ┌───┐ │ │ │ Vcc├───●───────────── 5V │ │ │ │ PB1├─────────────┐ │ │ │ │ │ │ R4.7K Q1 R15K │ │ │ C┌─┐B │ │ PD4├───●─┤ ├─R4.7K ─●─── X軸ノギスDATA出力へ │ │ └┬┘ │ │ │E │ ├──────●────────── 0V └───┘ Q1=2SC1815 プルアップ電圧概算 Q1のベース電流=(5-0.6)÷(4.7K+15K)=0.223mA Q1のベース抵抗=0.6÷0.223mA=2.691K 入力抵抗=4.7K+2.691K=7.391K プルアップ電圧=5×7.391÷(7.391+15)=1.65V 参考:ノギスの電源電圧=1.732V 2007.11.21(水) Win版DRO AppにCOM PORT名、ボーレート、キャリブレーション長、 カウント:mm変換係数のレジストリ登録と読み出しを追加しました。 public string SUB_KEY = "SOFTWARE\\DRO"; へ登録します。 ボーレートはATtiny2313の設定に合わせます。 14400,19200,57.6Kで動作確認を 行いました。 X,Yのクロック立ち上がりと、Zのクロック立下りが同時に発生した場合の Zデータの取り込みポイントは、Zデータの次の切換わりポイントまでに3.41μsec の余裕を確認しました。 ┌──────┐ ┌──────┐ X CLOCK ─┘ └────────┘ └─── ┌──────┐ ┌──────┐ Y CLOCK ─┘ └────────┘ └─── ─┐ ┌──────┐ Z CLOCK └────────┘ └────────── ┌────┐ ┌────┐ X割込み処理 ─┘ └──────────┘ └───── ┌────┐ ┌────┐ Y割込み処理 ──────┘ └──────────┘ └ ┌────┐ ┌ Z割込み処理 ───────────┘ └──────────┘ ───┐ ┌──────── Z DATA └───────────────┘ →├─┤←2.72μ →├─────────┤←8.75μ →├───────────────┤←12.9μ →├───────┤←6.78μ →├──┤←1.1875μ+1.5μ=3.37μ →├────┤←3.41μ ↑ データ取り込みポイント 2007.11.20(火) 1本のノギスのCLOCKとDATAを同時にX,Y,Zの各入力に供給。 ATtiny2313のクロックは8MHzを使用。 軸 CLOCK DATA 割込み --------+--------------+--------+-------------------------------- X PD2(INT0) PD4 立上がりエッジ Y PD3(INT1) PD5 立上がりエッジ Z PB0(PCINT0) PD6 両エッジ(ソフトで立下りを採用) Z軸のCLOCKは両エッジ割込み処理の中でPB0=0ならば、立下りエッジとしてデータの 取り込みを行います。 │←─────12.9μ─────→│ │←─ 7.94μ ─→│← 4.96μ →│ ───┐ ┌──────┐ Z CLOCK └────────┘ └──────── ─────┐ ┌────── Z DATA └───────────────┘ →├─┤←2.72μ →├──┤←1.1875μ+1.5μ=3.37μ ↑ データ取り込みポイント Z軸の割込み処理開始からデータ取り込み迄に1.5μの遅延を挿入して、 データの切換わりエッジを避けるようにしました。 2007.11.19(月) X,Y,Zのクロック立ち上がりが同時に発生した場合、順不同でそれぞれの割込みが 処理されます。 3番目の割込み処理で、データの取り込みが間に合うかを確認します。 ノギスの出力、CLOCKとDATAのタイミング │←─────12.9μ─────→│ │← 4.96μ →│←─ 7.94μ ─→│ ┌──────┐ ┌──────┐ X CLOCK ─┘ └────────┘ └─── ──────────┐ ┌─ X DATA └───────────────┘ │←──────→│7.68μ(DATA切換り) →│ │←2.72μ クロックが同時に発生 ┌──────┐ ┌──────┐ X CLOCK ─┘ └────────┘ └─── ┌──────┐ ┌──────┐ Y CLOCK ─┘ └────────┘ └─── ┌──────┐ ┌──────┐ Z CLOCK ─┘ └────────┘ └─── │←──────→│7.68μ(DATA切換り) ATtiny2313のクロック=8MHZの場合 →│ │←4.375μ ┌────┐ ┌────┐ X割込み処理 ─┘ └──────────┘ └─────── ┌────┐ ┌────┐ Y割込み処理 ──────┘ └──────────┘ └── ┌────┐ ┌── Z割込み処理 ───────────┘ └──────────┘ │←──────→│7.68μ(DATA切換り) Yの割込み処理中にDATAが変化してしまい、Zの割込み処理では次のデータを 取り込んでしまいます。 ATtiny2313のクロック=16MHZの場合 →│ │←2.1875μ ┌─┐ ┌─┐ X割込み処理 ─┘ └─────────────┘ └─────── ┌─┐ ┌─┐ Y割込み処理 ───┘ └─────────────┘ └───── ┌─┐ ┌─┐ Z割込み処理 ─────┘ └─────────────┘ └─── │←───→│6.5625μ │←──────→│7.68μ(DATA切換り) 7.68usec-6.5625usec=1.1175usecの余裕が取れそうです。 処理時間の計算 ;============================================================= ; INT0割込み ;============================================================= 命令 サイクル数 (push low(PC)) 2 (PC退避) (push high(PC)) 2 (PC退避) (rjmp $1) 2 (ベクターへジャンプ) rjmp intr_int0 2 ベクターからジャンプ ──────── 小計 8 intr_int0: sbi PORTB,PB1 2 sbrc tr_flg,X_DATA_SET 1,2,3 rjmp int0_end10 2 ──────── 小計 7 in sreg_save,SREG 1 ;rcall test sec 1 sbis PIND,XDATA 1,2,3 DATA入力 ────────────────── 小計 4 DATA入力迄の小計 19 clc 1 ror caliperX2 1 ror caliperX1 1 ror caliperX0 1 inc bit_cnt_X 1 cpi bit_cnt_X,48 1 brne int0_end 1,2 sbr tr_flg,(1<<X_DATA_SET) 1 ──────── 小計 13 int0_end: out SREG,sreg_save 1 int0_end10: cbi PORTB,PB1 2 reti 4 ──────── 小計 7 ──────── 合計 35 処理時間 8MHz 16MHz -----------+------------+-------------- DATA入力迄 2.375usec 1.1875usec 割込み処理 4.375usec 2.1875usec 2007.11.17(土) Win版DROの3次元表示に対応しました。 [設定]メニューをクリックする毎に右半分の設定フォームが開いたり閉じたり します。 ATtiny2313の3次元対応はこれからです。 2007.11.15(木) Windows版DROです。 ジョーの可動範囲でノギスの表示と一致します。 カウント対mm変換係数: フルスケール時のカウント値=0x01E54E=124238(10進)。 変換係数=154.08mm/124238=0.0012402mm/カウント 最下位桁は常に変動しているため、画像の数値とは異なります。 負数: ノギスの読み出し値が0x800000以上は負数で、 (0x1000000-読み出し値)が0からの差分です。 平均値: 直近の10個のデータを平均して表示すると、小数点2桁目が安定します。 実験回路 2007.11.13(火)の実験回路に以下を追加します。 ATtiny2313 FT232モジュール PC ┌────┐ ┌────┐ ┌────┐ │ │2 │ │ │ │ 6│ RXD├──←──┤TXD │ │Windows │ ─┤PD2 │3 │ ├────┤App DRO │ 7│ TXD├──→──┤RXD │ │ │ ─┤PD3 │ │ │ │言語VC# │ │ │ │ │ │ │ └────┘ └────┘ └────┘ 2007.11.14(水) DRO Windows Appを作成し、R8からR3をモニターしました。 結果) 11.13(火)の読み取り値は1ビットずれている事が分かりました。 原因) ビットカウントが48で、データが確定したあとパケット終了時のクロックの 立ち上がりでシフトされています。 対策) データが確定した直後に、R8からR3の値をdigit5からdigit0の 変数(レジスター)にコピーしました。 digit5-0は、次回のデータ確定まで変化はありません。 データの詳細は後日掲載する予定です。 2007.11.13(火) ATtiny2313でノギスのデータを受信しました。 INT0の立ち上がりエッジ割り込みでPD3の値をキャリーフラグにコピーし、 レジスターを順次右シフトします。 ┌──┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ │PD3 ├→┤Cf├→┤R8├→┤R7├→┤R6├→┤R5├→┤R4├→┤R3│ └──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ ビットカウンタが48クロックをカウントすると、R5,R4,R3に前半のブロックデータ R8,R7,R6に後半のブロックデータが格納されます。 48クロック目のトリガーで同期した時のクロックのパターンです。 上:トリガー 下:クロック ROMライター兼トレースモニター(μWaT)でレジスターの値を読み出しました。 ノギス表示値 R8,R7,R6 R5,R4,R3 -------------+------------+------------ 10.00mm 80 0F C0 15 91 3B 20.00mm 80 1F 80 15 81 7B (R5の値は95と交番します。) R8,R7,R6のMSBをマスクします。 ノギス表示値 R8,R7,R6 10進数 -------------+------------+------------ 10.00mm 00 0F C0 4032 20.00mm 00 1F 80 8064 から、10.00mm÷4032カウント=0.00248mm/カウントです。 実験回路 ノギス ┌────┐ ┌────●──────●─── +5V │ │4 │ │ │ │ 1.5V├── 電源(1.7V) │ │ 20│ ATtiny2313 │ │ R4.7k R4.7K ┌───┴──┐ │ │3 │ B┌─┐│ 6│ Vcc │ │ CLOCK├──R4.7K ──────┤ ├●──┤PD2 INT0 │ │ │ 2SC1815│ └┬┘C │ │ │ │2 B┌─┐│ E│2SC1815 │ │ │ DATA├──R4.7K ─┤ ├●───────┤PD3 DATA │ │ │ └┬┘C │ 7└───┬──┘ │ │1 E│ │ 10│GMD │ 0V├───────●────●────────●─── GND(0V) │ │ ATtiny2313は内臓RCクロック8MHzを使用 └────┘ ノギスの電源供給(1.7V) +5V ──R3.3K─●──●──── ノギスの電源(1.7V)へ │ │ 赤色┌┴┐ │ LED │V│ ┴ 0.1μ ├─┤ ┬ └┬┘ │ │ │ 0V ─────●──●──── GND(0V) 端子Noは、ノギスのジョー側が1です。 2007.10.31(水) 簡易コネクタを作製しました。 基板は鍋CADでパターンを作図し、CNC基板加工機で切削しました。 バネ電極は、コネクターの圧接端子のコンタクト部分を切り離し、 切削したプリント基板に半田付けしました。 デジタルノギスからのクロック出力と、データを観測しました。 上:クロック 下:データ(クロックの立ち上がりエッジで変化) パケットサイズ:前半部と後半部で各々24ビット。 クロック幅 :H=7.28usec。L=5.76usec。周波数=76.69KHz。 パケット幅 :0.84msec。 パケット周期 :322msec。3.11Hz。 データビットパターンがノギスの可動ジョーを移動することで変化します。 実験回路 ノギス ┌────┐ │ │4 │ 1.5V├─────── 電源(1.5V) │ │ │ │3 │ ├─────── CLOCK │ │ │ │2 │ ├─────── DATA │ │ │ │1 │ 0V├─────── GND(0V) │ │ └────┘ 端子Noは、ノギスのジョー側を1としました。 21. 謝辞 SEC_SUZUKIさんから、トップマンのノギスとDROに関する情報を頂きました。 ロックヒルさんに、threesのスケールでの動作確認と、フライス盤のインバータによる ノイズ対策の実験にご協力を頂ました。 tsuzukiさんから、isagidaのスケールをお借りして出力仕様の解析を行いました。 皆さん、ご協力ありがとうございました。

DROのTopへ
サイトのTopへ
法律条項 この資料およびソフトウェアーにより生じたいかなる障害や損害に対し、 著者は全てを免責されるものとします。 この資料およびソフトウェアーは、著作権法の下で保護され、 入手先、著者、日付、法律条項を含んみ場合にのみ複製または利用が可能です。 また、営利や商用を目的とした利用は許可されません。
inserted by FC2 system