モータLEDの制御にはPIC12F683のハードウェアPWMを利用して、スムーズに回転したと思います。エルロン(ラダー)LEDを点滅させることは既に実現していますが、このままでは、ON/OFFの状態のみになり、インドアプレーンのラダーとして考えた場合、一杯に切れるか、まっすぐかのどちらかになってしまいます。
エルロンにもPIC12F683のハードウェアPWMを使えればよいのですが、この機能は1chしか、搭載されていません。そこで、エルロンはプログラミングで実現するソフトウェアPWMにより制御することにします。
LEDをソフトウェアPWM制御し、ほわーんと点灯させましょう。
PWMは、スイッチを高速にON/OFFすることで実現します。ON/OFFするタイミングは定期的に行う必要があります。これをtimer0の割り込みにより実現します。
1msごとの割り込みの初期設定は次のようになります。
PIC12F683動作周波数:8MHz→内部2MHz
(256-6)×8×0.5μs=1ms
0~8の9分割としたので、
PWM周期:1ms×9=9ms=111Hz
したがって、初期設定は以下のように行います。
set_timer0(6);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
// マグネット・アクチュエータ周期
//内部2MHz=0.5μS動作、
//(256-6)*8*0.5^-6=1ms、1ms*9=9ms:PWM周期=111Hz
enable_interrupts(INT_RTCC); //timer0割り込み許可
enable_interrupts(GLOBAL); //割り込み全体許可
■ ソフトウェアPWM
PWMのデューティは、coil_duty変数にセットします。
#int_rtcc
void coil_pwm()
{
set_timer0(6);
coil_dutyが0のときは、dutyを0にして、PWMを完全にOFFにします。
if(coil_duty==0){
GP=OFF;
}
0以外では、PWMを動作します。cycl_count変数に0~9を順次入れ、coil_dutyよりもcycl_countが小さい間は選択されたコイルをONにすることにより10段階のソフトウェアPWMを実現します。
else if(cycl_count <= coil_duty){
//coil_duty=9でduty=100%
GP=on_coil;//選択されたcoil=ONにする
}
PWM動作中のOFF設定を行います。
else{
GP=OFF;
}
cycl_countの0~9の循環数を作ります。
cycl_count=cycl_count+1;
cycl_count=cycl_count % 10;//0~9の10段階
}
■ 空欄を埋めてプログラムを完成してください。
// 赤外線2ch受信機 RX2&RX2-T対応
// ex8_rx2.c
// エルロン左右のLEDをソフトPWMにより9段階でほわ~ん点灯する
// 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
#bit rcoil1=GP.0
#bit rcoil2=GP.1
#bit lcoil1=GP.4
#bit lcoil2=GP.5
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#define rcoil 0x03
#define lcoil 0x30
long duty;//PWMデューティ
signed long al_count;//パルス・カウント用
int i,on_coil,cycl_count,coil_duty;
#int_rtcc
void coil_pwm()
{
(その1) ;
if(coil_duty==0){
GP=OFF;
}
else if( (その2) ){
//coil_duty=9でduty=100%
GP= (その3) ;//選択されたcoil=ONにする
}
else{
GP= (その4) ;
}
cycl_count= (その5) ;
cycl_count= (その6) ;//0~8の9段階
}
//メイン・ルーチン
main(){
setup_comparator(NC_NC); //ディジタル入力切り替え
setup_timer_0( (その7) );
// マグネット・アクチュエータ周期
//内部2MHz=0.5μS動作、
//(256-6)*8*0.5^-6=1ms、1ms*9=9ms:PWM周期=111Hz
enable_interrupts(INT_RTCC); //timer0割り込み許可
enable_interrupts(GLOBAL); //割り込み全体許可
(その8) ;
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
cycl_count=coil_duty=0;
duty=0;
while(1){
on_coil=rcoil;//右コイル選択
for(i=0;i<10;i++){
(その9) ;//コイルPWMデューティ0~9の10段階
delay_ms(150);
}
on_coil= (その10) ;//左コイル選択
for(i=0;i<10;i++){
coil_duty=i;
delay_ms(150);
}
}//while
}//main
■実行
課題8は赤外線送信機を使わない、RX2-Tの単体プログラミングです。エルロン左右コイルLEDが交互に10ステップで徐々に明るくなれば成功です。
■ダウンロード
この課題のC言語ソースファイルおよびHEXファイルは【ex8_rx2.lzh】よりダウンロードできます。
■解答
(その1)set_timer0(6) (その2)cycl_count <= coil_duty (その3)on_coil (その4)OFF (その5)cycl_count+1 (その6)cycl_count % 9 (その7)RTCC_INTERNAL | RTCC_DIV_8 (その8)set_timer0(6) (その9)coil_duty=i (その10)lcoil
次回は、赤外線によりエルロンLEDをソフトウェアPWMにより制御します。
長野県飯田工業高校 竹内浩一

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