pic16f88でサーボモータ(SG90)を動かしてみた
参考
PICでなんか作るばい(ARMもね) 2013年01月07日
Arduinoで学ぶ基礎からのモーター制御:基礎からのマイコンモーター制御(6):PWMを使ったサーボモーターの制御 (2/3) - MONOist(モノイスト)
[PIC16F88]HI-TECH CでTimer1割り込みを使用する
実装
Timer1割り込みを使ってカウントアップしていき、そのカウントアップに応じて、以下の値を変化させてSG90を動かしてみました。 - RB3の1の周期 - RB3の値 - RB3の1の周期の変更タイミング
Timer1割り込みのコードについては、以下のページをコピペしただけです。
[PIC16F88]HI-TECH CでTimer1割り込みを使用する
#include <stdio.h> #include <htc.h> #define TIMER_INTERVAL (0xffff - 200) // TMRモジュールのカウント初期値 #pragma config CPD=OFF , LVP=OFF , BOREN=OFF , MCLRE=OFF , PWRTE=ON , WDTE=OFF , FOSC=INTOSCIO void main( void ) { OSCCONbits.IRCF = 7; // 内部クロックを8MHz駆動にする TRISB = 0x00; // PortBをすべて出力にする INTCONbits.GIE = 1; // Grobal interruptを有効にする INTCONbits.PEIE = 1; // 外部割込みを有効にする PIR1bits.TMR1IF = 0; // Timer1割り込みフラグを落としておく PIE1bits.TMR1IE = 1; // Timer1割り込みを有効 T1CONbits.T1CKPS = 0; // プリスケーラを1/1にする TMR1 = TIMER_INTERVAL; // タイマー値をセットします T1CONbits.TMR1ON = 1; // Timer1を有効にする // 割り込みベースで動作させるので何もしない while( 1 ) { NOP(); } } // 0.125μs * 4(分周) * 1(プリスケーラ値)* 200(timeカウント値) = 0.1ms // 割り込み処理(0.1ms周期) static void interrupt intr( void ) { volatile static int intr_counter; volatile static int intr = 20; // PWM間隔 volatile static int rotation; // PWM間隔を変化させる //------------------------------------ // Timer1割り込みが発生したときの処理 //------------------------------------ if ( PIR1bits.TMR1IF == 1 ) { TMR1 = TIMER_INTERVAL; // タイマーをリセット intr_counter++; if ( intr_counter >= 200 ) { intr_counter = 0; PORTBbits.RB3 = 1; rotation++; if (rotation >= 10) { rotation = 0; intr = (intr >= 11) ? intr-- : 20; } } // 0.5sec周期でRB0を点滅させる。 if ( intr_counter >= intr ) { PORTBbits.RB3 = 0; } else { PORTBbits.RB3 = 1; } PIR1bits.TMR1IF = 0; // 割り込みフラグを落とす } return; }
その他
回路図とか実際のデモ映像とか載せたいんですけど。。。。。暇になったら書きます笑。