閲覧総計:21502  (本日:1  昨日:1)


サーボモータを動かす

PIC 16F628A内臓のTimer0割込み機能を利用し、サーボモータを制御する20ミリ秒
周期のパルス信号を発生させて、サーボモータを動かしてみよう。  06/10/29

サーボモータ:ミニスタジオ社製 MiniS RB-50 @1,300円
http://www.ministudio.co.jp/Japanese/Goods-RB50-1.htm

P1010189.JPG
/**
* RCサーボモータ制御
*
* PIC16F628A   @4MHz
* RB3: servo MiniS RB50
* http://www.ministudio.co.jp/Japanese/Goods-RB50-1.htm
* 電源:乾電池3本
*
* MikroC 6.2
*/

// Global変数定義
signed short int deg = 0; // deg: -85 ~ +85

void interrupt() { //割込み関数
    // Timer0 Interval 20mS
    if (INTCON.T0IF) {
        TMR0 = -(20000 / 128); // Timer0 Interval 20mS (@4MHz)
        INTCON.T0IF = 0;
        
        PORTB.F3 = 1; // PWM RB3 on
        Delay_Cyc(150 + deg); // delay(150 + deg) * 10uS
        PORTB.F3 = 0; // PWM RB3 off
    }
}

void main() {
    PORTB = 0b00000000; //PORTBの中身をきれいにする
    TRISB = 0b00000000; //PORTB 8個全て0:出力設定
    
    OPTION_REG = 0x86; // TMR0プリスケーラ: 1/128
    TMR0 = -(20000 / 128); // Timer0 Interval 20mS (@4MHz)
    //TMR0割込み許可
    INTCON.T0IE = 1;
    INTCON.GIE = 1;
    
    do {
        //基準角度確認
        deg = 0; Delay_ms(1000);
        deg = -85; Delay_ms(1000);
        deg = 0; Delay_ms(1000);
        deg = 85; Delay_ms(1000);
        deg = 0; Delay_ms(1000);
        
        //-85度〜+85度までゆっくり首を振る
        for(deg = -85; deg <= 85; deg++)
            Delay_ms(50);
        for(deg = 85; deg >= -85; deg--)
            Delay_ms(50);
            
    } while(1);
}