閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
~
*サーボモータを動かす [#vbb42053]

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

|&attachref(,zoom,150x150,button){新しい写真添付};|&attachref(,zoom,150x150,button){新しい写真添付};|

 /**
 * RCサーボモータ制御
 *
 * PIC16F628A   @4MHz
 * RB3: servo MiniS RB50
 * http://www.ministudio.co.jp/Japanese/Goods-RB50-1.htm
 *
 * 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);
 }
#comment