課題7では、最スローよりフルHiまでPIC12F683のPWM機能を使って、LEDのひかり方の強弱をなめらかに変化させます。
■ 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により制御します。
長野県飯田工業高校 竹内浩一

インドアプレーンで学ぶマイコンのハードとソフト
赤外線制御で学ぶPICとC言語
PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン