プログラミング備忘録

日頃のプログラミングの成果をここに書いていきます.

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;
 
}

その他

回路図とか実際のデモ映像とか載せたいんですけど。。。。。暇になったら書きます笑。