PICでCの練習 2007.05.26(土)〜 LessocC_102。 CLOCK、CW/CCW信号を発生させます。
著作者名: 中野 良知 作成開始: 2007.05.25(金) 更新 : 2007.05.26(土) 実行結果を追加。 : 2007.05.29(火) 回路図GP3にプルアップ抵抗を追加。
目次 1. 目的 2. ゼネラルフローチャート 3. プログラムソースコード 4. キーワード 4.1. A/D変換 4.1.1. ANSELレジスタ 4.1.2. ADCON0レジスタ 4.1.3. A/D変換値の変化幅 4.2. CLOCK、CW/CCWのタイミング 5. 実行結果 6. 実験回路 1. 目的 ステッピングモータ駆動装置用のCLOCK、CW/CCW信号を発生させます。 タイマー割込みでCLOCKパルスとCW/CCWを出力。 GP4をA/D変換入力に設定、可変抵抗でCLOCKパルスの周期を変化させます。 2. ゼネラルフローチャート (main) ↓ クロック較正値設定 ↓ デジタル入出力選択 ↓ ポート入出力設定 ↓ A/Dポート選択(GP4) ↓ ├←─────────────────────────┐ ↓ off │ <CW回転スイッチ or CCW回転スイッチ?> ─┐ │ ↓on ↓ │ タイマー0割込み許可 タイマー0割込み禁止 │ ↓ ↓ │ ├──────────────────┘ │ ↓ no │ <A/D変換完了?> ───────────────────→┤ ↓yes │ インターバル=A/D変換値 │ ↓ │ └──────────────────────────┘ (タイマー割込み) ↓ タイマー0にインターバル値設定 ↓ タイマーオーバーフラグリセット ↓ off <CW回転スイッチ?>─────┐ ↓on │ CW出力 │ ↓ │ ├────────────┘ ↓ off <CCW回転スイッチ?> ────┐ ↓on │ CCW出力 │ ↓ │ ├────────────┘ ↓ クロックパルス出力 ↓ (終了) 3. プログラムソースコード //***************************************************************************** // タイトル : LessocC_102 // 作者 : ioio // 目的 : CLOCKとCW/CCW信号を発生させます。 // マイコン : PIC12F675 // クロック : 4MHz。内蔵発振。 // Config : MCLR=GP3, WDTE=OFF, INTOSC // Compiler : PICC Lite(V9.6)。 HI-TEC software製。 // Compile : >picl -12f675 lesson.c // ASM List : >picl -12f675 --ASMLIST lesson.c //***************************************************************************** // 変更履歴 // 2007.05.25(金) 作成 //***************************************************************************** //----------------------------------------------------------------------------- // ヘッダーファイル #include "pic.h" // デバイス関連の定義を展開 //----------------------------------------------------------------------------- // コンフィグレーション定義 __CONFIG(0x01D4); // BandGap=0x0, MCLR=GP3, WDTE=OFF, INTOSC //----------------------------------------------------------------------------- // 関数定義 //----------------------------------------------------------------------------- // 定数定義 #define T0MAX 0 // タイマ0最大 //----------------------------------------------------------------------------- // グローバル変数定義 unsigned char interval; // CLOCK周期。0.128msec-32.768msec //----------------------------------------------------------------------------- // ビットフィールド構造体定義 //----------------------------------------------------------------------------- // ポートマップ // NAME PIN NO I/O USE // -----+--------+-----+----------------------- // GP0 7 O CLOCK出力 // GP1 6 O CW/CCW出力 // GP2 5 I CW ON(内蔵Pull Up) // GP3 4 I CCW ON(外部Pull Up) // GP4 3 I CLOCK調整(AN3,A/D) //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- void main(void) { OSCCAL = _READ_OSCCAL_DATA(); // クロック較正値をOSCCALに設定 CMCON = 0x07; // COMPARATOR=Off(Digital I/O) ANSEL = 0x08; // Fosc/2。AN3=On。AN2,1,0=Off(Digital I/O) ADCON0 = 0x0D; // A/D ch3=Off。左詰め。 TRISIO = 0x3C; // GP5,GP4,GP3,GP2=入力。GP1,GP0=出力 OPTION = 0x56; // Pull Up=On。T0CS=Int。PSA=TIMER0。 // Prescaler=1:128 TMR0 = T0MAX; // 1usec*128*256=32768usecに設定 INTCON = 0x80; // GIE=Enable。T0IE=Disable GPIO = 0x00; // 出力を全て0に初期化 WPU = 0x34; // GP5,4,2=Pull Up interval= T0MAX; // CLOCK周期を最大に設定 ADIF = 0; // A/D完了フラグリセット GODONE = 1; // A/D変換開始 while(1){ // CW/CCWスイッチチェック(回転オン兼用) if(!GPIO2 || !GPIO3){ T0IE = 1; // TMR0割込み許可。CLOCK出力許可 }else{ T0IE = 0; // TMR0割込み禁止 } // A/D変換、クロック周期設定 if(ADIF){ // A/D変換済みなら if(ADRESH >= 250){ // VR MAX近くなら interval = 250; // TMR0最小値設定 }else{ interval = ADRESH; // A/D変換値取得 } ADIF = 0; // フラグリセット GODONE = 1; // A/D変換開始 } } } //----------------------------------------------------------------------------- // 割込み処理 // 2007.05.25(金) 作成 //----------------------------------------------------------------------------- void interrupt isr(void) { TMR0 = interval; // TMR0設定。 T0IF = 0; // TMR0割込み発生フラグをリセット if(!GPIO2){ GPIO1 = 1; // CW出力 } if(!GPIO3){ GPIO1 = 0; // CCW出力 } NOP(); GPIO0 = 1; // CLOCK=1出力 NOP(); NOP(); GPIO0 = 0; // CLOCK=0出力 } //***************************************************************************** //***************************************************************************** 4. キーワード 4.1. A/D変換 4.1.1. ANSELレジスタ 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬───┬───┐ │ - │ADCS2 │ADCS1 │ADCS0 │ ANS3 │ ANS2 │ ANS1 │ ANS0 │ └───┴───┴───┴───┴───┴───┴───┴───┘ 0 0 0 1 0 0 0 ADCS2,1,0=0 :Fosc/2にA/D変換時のクロックを選択します。 ANS3=1 :GP4をアナログ入力にします。 例: ANSEL = 0x08; // Fosc/2。AN3=On。AN2,1,0=Off(Digital I/O) 4.1.2. ADCON0レジスタ 7 6 5 4 3 2 1 0 ┌───┬───┬───┬───┬───┬───┬────┬───┐ │ ADFM │ VCFG │ - │ - │ CHS1 │ CHS0 │GO/DONE │ ADON │ └───┴───┴───┴───┴───┴───┴────┴───┘ 0 0 1 1 0 1 ADFB=0 :A/D変換値を左詰めにします。 VCFG=0 :A/D変換基準電圧をVDDにします。 CHS1,0=11 :アナログチャンネル3(GP4)を選択します。 GO/CONE=0 :0でA/D変換停止またはA/D変換完了。1でA/D変換開始。 ADON=1 :A/D変換器をオンします。 例: ADCON0 = 0x0D; // A/D ch3=Off。左詰め。 A/D変換の開始は GODONE = 1; // A/D変換開始 と記述します。 A/D変換値の左詰め 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │←─────────────→│←─────────────→│ ADRESHレジスタ ADRELレジスタ MSB LSB │←─────────────────→│ 左詰めで使用する範囲(10ビット) 今回は左詰めしたADRESHレジスタの値をインターバル周期に使用します。 A/D変換値の右詰め 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │←─────────────→│←─────────────→│ ADRESHレジスタ ADRELレジスタ MSB LSB │←─────────────────→│ 右詰めで使用する範囲(10ビット) 4.1.3. A/D変換値の変化幅 A/D変換後のADRESHの値は、0から255の範囲で変化します。 可変抵抗器の摺動子がVSS側にあると0、 可変抵抗器の摺動子がVDD側にあると255です。 TMR0に0を設定した場合、タイマーオーバーフローは1usec×128×256=32768usec後に 発生します。 1usec×128×256=32768usecが最大クロック周期です。 TMR0に255を設定した場合、タイマーオーバーフローは1usec×128×1=128usec後に 発生します。 TMR0のカウント最小値は、割込み発生から処理完了までの所用時間 以上にTMR0を設定する必要があり、A/D変換値が250以上の場合は、250をTMR0に設定 するようにします。 したがって、1usec×128×6=768usecが最小クロック周期です。 4.2. CLOCK、CW/CCWのタイミング CLOCKの立上り前にCW/CCWが変化します。 CLOCKの繰返し周期は、可変抵抗器の摺動子の位置により変化します。 768usec〜32768usec可変 │←─────────────→│ ┌─┐ ┌─┐ CLOCK ───┘ └─────────────┘ └─────── →├─┤← 3usec ┌─────────────────────────── CW/CCW ─┘ →├─┤← 4usec ──┐ CW/CCW └─────────────────────────── →├┤← 2usec 5. 実行結果 CLOCKの4usec手前でCW/CCWが立上がります。 CLOCKの2usec手前でCW/CCWが立下がります。 6. 実験回路 PIC12F675 ┌────┐1 │ VDD├──●───●──────●─────────← +5V │ │ │0.1u │ │ │ │ ┴ /50V │ │┴│100u/16V │ │8 ┬ │ └┬┘ │ VSS├──●──────────●────────── GND │ │ │ │ │ │ ┌┴┐ │ │ │3 │5K│ │ │ GP4├─────┤VR│ │ │ │ │ │ │ │ │ └┬┘ │ │ │ └──────● │ │7 │ │ GP0├─────────────│───────→ CLOCK │ │ │ │ │6 │ │ GP1├─────────────│───────→ CW/CCW │ │ │ │ │ CW回転オン │ │ │5 ─┴─ │ │ GP2├─────○ ○─────● │ │ │ │ │ CCW回転オン │ │ │4 ─┴─ │ │ GP3├──●──○ ○─────┘ │ │ │ └────┘ R10K │ +5V 電源パスコン0.1u/50VのセラミックコンデンサーはVDDとVSSの近くに接続します。
LessonCのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system