PICでCの練習 2007.05.12(土)〜 LessonC_17。 配列データでステッピングモータを回します。
著作者名: 中野 良知 作成開始: 2007.05.12(土) 修正 : 2007.05.14(月) ソースコードでconfigのXTALをHSに変更。 : 実験回路図に電源パスコンを追加。 : 発振子のGNDと5PIN(GND)を直近に変更。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. 配列 5. タイミングチャート 6. 回転周期 7. 実行結果 8. 実験回路 1. 目的 配列にステップパルスデータを定義し、20msecごとに配列のデータを順次出力してス テッピングモータを回します。 2. ゼネラルフローチャート (main) ↓ ポートの初期化 ↓ ├←───────┐ ↓ │ 駆動パルス出力 │ ↓ │ 20msecソフト遅延 │ ↓ │ └────────┘ 3. プログラムソースコード //***************************************************************************** // タイトル : LesssonC_17 // 作者 : ioio // 目的 : ステッピングモータを1-2相方式で回します。 // マイコン : 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.09(水) 作成 // 2007.05.12(土) ステップインターバルを20msecに調整 // 2007.05.14(月) configでXTALをHS_OSILLATORに変更 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x3FFA); // PROTECT=OFF, WDTE=OFF, HS_OSILLATOR //----------------------------------------------------------------------------- // 関数定義 void delay_msec(unsigned int); //----------------------------------------------------------------------------- // 定数の定義 #define T1MS 500 // 1msecソフト遅延カウント //----------------------------------------------------------------------------- // グローバル変数定義 //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO USE // -----+--------+------- // RB0 6 A // RB1 7 -A // RB2 8 B // RB3 9 -B //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { unsigned char step_data[8] = { 1, 1 + 4, 4, 4 + 2, 2, 2 + 8, 8, 8 + 1 }; // ステップパルスデータを配列に定義 int step_no = 0; // ステップパルスデータ添え字 TRISB = 0x00; // PortB b0,b1,b2,b3,b4,b5,b6,b7=Out PORTB = 0x00; // ポートB初期化。 while(1){ PORTB = step_data[step_no]; // ステップパルス出力 if(++step_no == 8){ step_no = 0; // 配列添え字をクリア } delay_msec(20); // 20msecソフト遅延 } } //----------------------------------------------------------------------------- // 機能 : 引数で遅延時間を設定 // 引数 : unsigned int。 遅延時間をmsecで設定。 // 戻値 : なし // 作成 : 2007.05.02(水) //----------------------------------------------------------------------------- void delay_msec(unsigned int cnt1) { unsigned int cnt2; while(cnt1--){ cnt2 = T1MS; while(cnt2--); // 約1msecの遅延 } } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. 配列 unsigned char step_data[8] = { 1, 1 + 4, 4, 4 + 2, 2, 2 + 8, 8, 8 + 1 }; データ型が1バイトで符号なし、配列名がstep_data、配列の要素数8個を宣言し、 { }に記述した順にステップパルスデータで初期化します。 配列添え字→ 0 1 2 3 4 5 6 7 ┌──┬──┬──┬──┬──┬──┬──┬──┐ 配列要素 →│ 1 │ 5 │ 4 │ 6 │ 2 │ A │ 8 │ 9 │ └──┴──┴──┴──┴──┴──┴──┴──┘ PORTB = step_data[0] でポートBに0x01が出力されます。 [ ]の中の添え字の数値で、配列の要素を指定します。 step_data[step_no]とすると、変数step_noの値で配列の要素が指定できます。 step_no 0→1→2→3→4→5→6→7→0→1→2→3→4→5→6→7→..... ポートB 1→5→4→6→2→A→8→9→1→5→4→6→2→A→8→9→..... でステッピングモータが回転します。 5. タイミングチャート 8/96ステップ 8/96ステップ │←─────────────→│←─────────────── 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8 ┌───┐ ┌─────┐ ┌── A ─┘ └─────────┘ └─────────┘ ┌─────┐ ┌─────┐ B ───┘ └─────────┘ └──────── ┌─────┐ ┌─────┐ -A ───────┘ └─────────┘ └──── ┌─────┐ ┌─────┐ -B ───────────┘ └─────────┘ └ →├─┤← 20msec →├─────┤← 60msec 6. 回転周期 実験で使用したステッピングモータの仕様は、 ステップ数: 48ステップ/1回転 巻き線方式: ユニポーラ 巻き線抵抗: 約18Ω/相 1−2相駆動方式を採用した為、1回転当り96ステップになります。 1回転時間=96[ステップ/回転]×20[msec]=1.92[sec/回転] 7. 実行結果 こちら をご覧下さい。 8. 実験回路 PIC16F84A ┌────┐14 │ VDD├──────●──────●────●──── +5V │ │ │ │0.1u │ │ │ R10K ┴ /50V │┴│100u/16V │ │4 │ 0.1u/50V ┬ └┬┘ │ -MCLR├──────●─┤├───●────┘ │ │ │ │ │16 ┌ ─ ─ ─ ┐ │ │ OSC1├───●─┤├──┐ │ │ │ │┴ ││ │ │ │ □ 20MHz │ │ │ │15 │┬ ││ │ │ OSC2├───●─┤├──● │ │ │ └ ─ ─ ─│┘ │ │ │5 ┌───────┘ │ │ Vss├─●───────────● ステッピング │ │ │ モータ │ │ │ ┌────┐ │ │ 2SK2782 │ │ │ │ │ D┌────────│────┤A相 │ │ │6 G┌┴┐S │ │ │ │ RB0├───┤ ├───────● │ │ │ │ └─┘ │ │A_COMMON├──┐ │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌────────│────┤-A相 │ │ │ │7 G┌┴┐S │ │ │ │ │ RB1├───┤ ├───────● │ │ │+5V/6A │ │ └─┘ │ │ │ ├── │ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ │ D┌────────│────┤B相 │ │ │ │8 G┌┴┐S │ │ │ │ │ RB2├───┤ ├───────● │ │ │ │ │ └─┘ │ │B_COMMON├──┘ │ │ │ │ │ │ │ 2SK2782 │ │ │ │ │ D┌────────│────┤-B相 │ │ │9 G┌┴┐S │ │ │ │ RB3├───┤ ├───────● └────┘ │ │ └─┘ │ │ │ │ └────┘ ┴ GND 0.1u/50VのセラミックコンデンサーはVDDとVssの近くに接続します。 発振子のGNDはVssの直ぐ近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system