#freeze 閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);)~ ~ *サーボモータを動かす [#vbb42053] PIC 16F628A内臓のTimer0割込み機能を利用し、サーボモータを制御する20ミリ秒 周期のパルス信号を発生させて、サーボモータを動かしてみよう。 06/10/29 サーボモータ:ミニスタジオ社製 MiniS RB-50 @1,300円 http://www.ministudio.co.jp/Japanese/Goods-RB50-1.htm 06/11/15追記 下記同一プログラムで大きいサーボモータを動かしてみました。 写真右:ミニスタジオ社製 RCサーボRB303c @1,300円 http://www.ministudio.co.jp/Cgi-bin/Order-JP/DetailJp.asp?GoodsNum=97 サーボの機種が変わっても同じ動きをする事を確認しました。 |&attachref(P1010189.JPG,zoom,150x150,button){新しい写真添付};|&attachref(P1010204.JPG,zoom,150x150,button){新しい写真添付};| /** * RCサーボモータ制御 * * PIC16F628A @4MHz * RB3: servo MiniS RB50 * http://www.ministudio.co.jp/Japanese/Goods-RB50-1.htm * 電源:乾電池3本 * * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF * _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT * MikroC 6.2 */ // Global変数定義 signed short int deg = 0; // deg: -85 ~ +85 void interrupt() { //割込み関数 // Timer0 Interval 20mS if (INTCON.T0IF) { //割込み種がTimer0割込みの場合 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); } ★この情報は役に立ちましたか? #vote(はい[68],いいえ[41])