PICでCの練習 2007.05.21(月)〜 LessonC_22。 CLOCK, CW/CCW信号を1-2相方式のステッピングモータ駆動出力に変換します。
著作者名: 中野 良知 作成開始: 2007.05.21(月)
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. ポート割り込み 4.2. ポートプルアップ 5. 実行結果 6. 実験回路 1. 目的 クロック信号(CLOCK)と回転方向信号(CW/CCW)を受信し、1-2相方式のステッピングモ ータ駆動信号を出力します。 クロック信号を割り込みで受信します。 入力ポートのプルアップ機能を使います。 2. ゼネラルフローチャート (main) ↓ プルアップ許可 ↓ 割り込み許可 ↓ ポートの初期化 ↓ ├──┐ ↓ │ └──┘ (割り込み) ↓ パルス出力(配列データ出力) ↓ CCW <CW/CCW?> →──────────┐ ↓CW │ 配列ポインター+1 配列ポインターー1 ↓ ↓ ├───────────────┘ ↓ 割り込みフラグリセット ↓ (終了) 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_22 // 作者 : ioio // 目的 : CLOCKとCW/CCW信号を受信しステッピングモータを駆動します。 // : 駆動方式は1-2相方式です。 // : CLOCKの受信にポートの立上がりエッジを使用します。 // : 入力ポートをプルアップします。 // マイコン : PIC16F84A // クロック : 20MHz // Config : PROTECT=OFF, WDTE=OFF, XTAL // Compiler : PICC Lite(V9.6)。 HI-TEC software製。 // Compile : >picl -16f84a lesson.c // ASM List : >picl -16f84a --ASMLIST lesson.c //***************************************************************************** // 変更履歴 // 2007.05.17(木) 作成 // 2007.05.21(月) 割込みでステップパルス出力を先頭に移動。 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR //----------------------------------------------------------------------------- // 関数定義 //----------------------------------------------------------------------------- // 定数の定義 //----------------------------------------------------------------------------- // グローバル変数定義 unsigned char* step_ptr; // 配列要素指定ポインターを宣言 unsigned char* top_ptr; // 配列要素指定ポインターを宣言 //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO USE // -----+--------+-------------------------------------------- // RA0 17 A // RA1 18 -A // RA2 1 B // RA3 2 -B // RB0 6 CLOCK入力。立上りで割込み。プルアップ有り。 // RB1 7 CW/CCW入力。プルアップ有り。 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { unsigned char step_data[8] = { 1, 1 + 4, 4, 4 + 2, 2, 2 + 8, 8, 8 + 1 }; // ステップパルスデータを配列に定義 step_ptr = step_data; // ポインター初期化 top_ptr = step_data; // ポインター初期化 OPTION = 0x7F; // Pull up=On. INTEDG=Up INTCON = 0x90; // GIE=ENABLE,INTE=ENABLE TRISA = 0x00; // PortA b0,b1,b2,b3=Out TRISB = 0x03; // PortB b0,b1=In、b2,b3,b4,b5,b6,b7=Out PORTB = 0x03; // ポートB初期化。プルアップ。 PORTA = 0x00; // ポートA初期化。 while(1){ } } //----------------------------------------------------------------------------- // 機能 : RB0割り込み関数 // 引数 : なし // 戻値 : なし // 作成 : 2007.05.18(金) // 変更 : 2007.05.21(月) ステップパルス出力を先頭に移動。 //----------------------------------------------------------------------------- static void interrupt isr(void) { // ステップパルス出力 PORTA = *step_ptr; // 次の出力の準備。ポインターの更新。 if(RB1){ // CWなら if(++step_ptr == (top_ptr + 8)){ step_ptr = top_ptr; } }else{ // CCWなら if(--step_ptr == (top_ptr - 1)){ step_ptr = top_ptr + 7; } } // RB0割り込みフラグリセット INTF = 0; } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. ポート割り込み OPTIONレジスタ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ RBPU │INTEDG│ T0CS │ T0SE │ PSA │ PS2 │ PS1 │ PS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 0 1 1 1 1 1 1 1 ↑ RB0入力立上りエッジ検出 1に設定します。 ┌───────── RB0 ────┘ ↑このタイミングで割り込みが発生します。 INTCONレジスタ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ GIE │ EEIE │ T0IE │ INTE │ RBIE │ T0IF │ INTF │ RBIF │ └───┴───┴───┴───┴───┴───┴───┴───┘ 1 0 0 1 0 0 0 0 ↑ ↑ ↑ 全割込み許可 RB0割込み許可 RB0割込み発生フラグ 1に設定します。 1に設定します。 0に設定します。 コーディング例: OPTION = 0x7F; // Pull up=On. INTEDG=Up INTCON = 0x90; // GIE=ENABLE,INTE=ENABLE 割込み発生時: INTCONレジスタのINTFビットが1にセットされます。 割込み処理終了時にINTFをリセットします。 INTCONレジスタ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ GIE │ EEIE │ T0IE │ INTE │ RBIE │ T0IF │ INTF │ RBIF │ └───┴───┴───┴───┴───┴───┴───┴───┘ ↓ 1=割込み発生 ↓ 0=割込み発生リセット INTF = 0;を実行。 4.2. ポートプルアップ OPTIONレジスタ ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ RBPU │INTEDG│ T0CS │ T0SE │ PSA │ PS2 │ PS1 │ PS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 1 1 1 1 1 1 1 ↑ プルアップ許可 0に設定します。 ポートBの入力に指定したビットに1を出力すると、内部のプルアップ抵抗がオンしま す。 プルアップ抵抗値の目安はカタログの入力電流から求めます。 VDD=5V, VPIN=VSS(入力をVSSに接続) MAX TYP MIN ---------------------+-----+-----+------ 入力電流(uA) 50 250 400 ---------------------+-----+-----+------ プルアップ抵抗(Kohm) 100 20 12.5 コーディング例: OPTION = 0x7F; // Pull up=On. INTEDG=Up TRISB = 0x03; // ポートB b0,b1=入力。b2,b3,b4,b5,b6,b7=出力 PORTB = 0x03; // ポートB初期化。プルアップ(b0,b1)。 5. 実行結果 上:CLOCK信号。 下:A相出力信号。 CLOCKの立上りエッジから2.96usec後にステッピングモータ駆動信号が出力されます。 LessonC_22のプログラムと回路で発生させた、CLOCKとCW/CCWを利用しました。 6. 実験回路 PIC16F84A ┌────┐14 │ VDD├──────●──────●────●───← +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │4 │ 0.1u/50V ┬ └┬┘ │ -MCLR├──────●─┤├───●────┘ │ │ │ │ │16 ┌ ─ ─ ─ ┐ │ │ OSC1├───●─┤├──┐ │ │ │ │┴ ││ │ │ │ □ 20MHz │ │ │ │15 │┬ ││ │ │ OSC2├───●─┤├──● │ │ │ └ ─ ─ ─│┘ │ │ │5 ┌───────┘ │ │ Vss├─●───────────● │ │ │ │ │6 │ │ RB0├─────────────│───────← CLOCK │ │ │ │ │7 │ │ RB1├─────────────│───────← CW/CCW │ │ │ │ │ │ ステッピング │ │ │ モータ │ │ │ ┌────┐ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤A相 │ │ │17 G┌┴┐S │ │ │ │ RA0├─────┤ ├─────● │ │ │ │ └─┘ │ │A_COMMON├──┐ │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤-A相 │ │ │ │18 G┌┴┐S │ │ │ │ │ RA1├─────┤ ├─────● │ │ │+5V/6A │ │ └─┘ │ │ │ ├── │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌──────│────┤B相 │ │ │ │1 G┌┴┐S │ │ │ │ │ RA2├─────┤ ├─────● │ │ │ │ │ └─┘ │ │B_COMMON├──┘ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ D┌──────│────┤-B相 │ │ │2 G┌┴┐S │ │ │ │ RA3├─────┤ ├─────● └────┘ │ │ └─┘ │ │ │ │ └────┘ ┴ GND 電源パスコン0.1u/50VのセラミックコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system