« 14-6 課題6 赤外線受信機TX2-006Pのスロットル・スティック・ハーフ=センタ以上でモータLEDが点灯する | メイン | 14-8 課題8 エルロン左右コイルLEDをソフトPWMにより9段階で交互にほわ~ん点灯する »

はてなブックマークに追加   14-7 課題7 赤外線受信:モータLED PWM制御 (11段階)

 課題6では、赤外線2ch送信機TX2-006pのスロットルをニュートラルより上にするとLEDが点灯するプログラムを作成しました。
 課題7では、最スローよりフルHiまでPIC12F683のPWM機能を使って、LEDのひかり方の強弱をなめらかに変化させます。 kadai7_web.jpg

PWM制御について

 PWMはPulse Width Modulation=パルス幅変調のことをいいます。モータやLEDを高速にON/OFFすることで、平均電圧を変化させる制御方法です。詳細は別項をご覧ください。

 ON/OFFを高速に行えばPWM制御は可能なので、プログラミングを工夫することにより実現することができます。PIC12F683は小型の PICながらPWM機能をハードウェアとして搭載しています。プログラミングに比べるとはるかに簡単な設定で利用することが可能です。さっそく使ってみま しょう。

PIC12F683におけるハードウェアPWM制御

使用宣言

 PWMを使うためには使用宣言が必要です。

   setup_ccp1(CCP_PWM); //PWMモード使用宣言

周期の設定

 PWM周期はtimer2を利用して設定します。

   PWM周期=(PR2レジスタ+1)*4*(1/クロック周波数)*プリスケーラ値

で設定します。

   PR2=255、クロック周波数=8MHz、プリスケーラ=4の場合・・・

   PWM周期=(255+1)*4*(1/8E10^6)*4=0.512ms=1.95kHz

です。

 C言語での記述は、

   setup_timer2_(T2_DIV_4,255,1)

となります。

デューティの設定

 dutyは10bit変数です。

   0~1023

   th_coun/1023=デューティ

   set_pwm1_duty(th_count);//PWMデューティのセット
   //最スロー+フルスロットル+PWM9段階=11段階

 ソフトウェアPWMに比べると格段に楽にプログラミングが可能です。もう1chPWMがあればなあ、と思ってしまいます。

空欄を埋めてプログラムを完成してください。

//  赤外線2ch受信機 RX2&RX2-T対応
// ex7_rx2.c
// 赤外線受信:モータLED PWM制御 (11段階)
// for PIC12F683

#include<12f683.h>

#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT
//ウオッチドック・タイマなし、パワーアップ・タイマ使用
//プロテクトなし、MCLRなし

#use delay(CLOCK=8000000) //8MHz駆動
#byte GP=5
#bit IRSIG=GP.3

#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#define rcoil 0x03
#define lcoil 0x30
#define motor 0x04

long duty;//PWMデューティ
signed long th_count;//パルス・カウント用

//メイン・ルーチン

main(){
int gcount;

setup_comparator(NC_NC); //ディジタル入力切り替え
setup_oscillator(OSC_8MHz);
setup_ccp1( (その1) ); //PWMモード使用宣言
setup_timer_2( (その2) );
//CCP1 PWMモードセット
//PWM周波数=(255+1)*4*(1/8E6)*4=0.512ms=1.95kHz
//デューティ10bit(0~1023)モード

enable_interrupts(GLOBAL);//割り込み全体許可

set_tris_a(0x08);//GP3入力、ほかは出力
//GP 5 4 3 2 1 0
// lc2 lc1 ir mt rc2 rc1
// 0 0 1 0 0 0 :0x08

th_count=0;

while(1){//ギャップ検出ルーチン
gcount=0;
while(gcount < 30){
if(IRSIG==HI){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}

While(IRSIG==HI){

}
// 1ch(エルロン)
while( (その3) ){
}
while( (その4) ){
}

// 2ch(エレベータ):未使用
while( (その5) ){
}
while( (その6) ){
}

// 3ch(スロットル)
th_count=0;
while( (その7) ){
//Low、Hiループは1回10μsに調整済み
delay_us(6);
th_count=th_count+1;
}
while( (その8) ){
delay_us(6);
th_count=th_count+1;
}

// 4ch(ラダー):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}

//スロットルの処理
if(th_count<110){//最スロー
th_count= (その9) ;
}
else if(th_count>190){//フルスロットル
th_count= (その10) ;
}
else{
th_count=(th_count-100)*10;//PWM9段階
//th_count=110=>100,th_count=190=>900,step 10
}
set_pwm1_duty( (その11) );//PWMデューティのセット
//最スロー+フルスロットル+PWM9段階=11段階
}
}

実行

 赤外線2ch送信機TX2-006pのスロットル・スティックを最スローから徐々に上げると、モータLEDが徐々に明るくなり、フルHiで最大になれば成功です。

ダウンロード

 この課題のC言語ソース・ファイルおよびHEXファイルは【ex7_rx2.lzh】よりダウンロードできます。


解答

(その1) CCP_PWM (その2) T2_DIV_BY_4,255,1 (その3) IRSIG==LOW (その4) IRSIG==HI (その5) IRSIG==LOW (その6) IRSIG==HI (その7) IRSIG==LOW (その8) IRSIG==HI (その9) 0 (その10) 1023 (その11)th_count


 PIC12F683には、ハードウェアPWMは一つしか搭載されていません。

 次回は、エルロンLEDをソフトウェアPWMにより制御します。

長野県飯田工業高校 竹内浩一

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/1954

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

カレンダ

2010年2月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

おすすめ書籍

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

About

2008年11月10日 15:56に投稿されたエントリーのページです。

ひとつ前の投稿は「14-6 課題6 赤外線受信機TX2-006Pのスロットル・スティック・ハーフ=センタ以上でモータLEDが点灯する」です。

次の投稿は「14-8 課題8 エルロン左右コイルLEDをソフトPWMにより9段階で交互にほわ~ん点灯する」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 4.1