■1ch(エルロン・パルス)のカウント
スロットル・パルスのカウントと同じ方法で、エルロンのパルス幅をカウントします。注意しなくてはならないのは、timer0割り込みによるソフトウェアPWMが実行されているので、パルス幅のカウント中は割り込みを停止しないと正確なパルス幅を得ることができない点です。
割り込みの停止は・・
disable_interrupts(INT_RTCC); //timer0割り込み禁止
開始は・・・
enable_interrupts(INT_RTCC);//timer0割り込み許可により行います。 エルロンのパルス・カウントはal_countに格納されます。
// 1ch(エルロン)
disable_interrupts(INT_RTCC); //timer0割り込み禁止
al_count=0;
while(IRSIG==LOW){//Low、Hiループは1回10μsに調整済み
delay_us(6);
al_count=al_count+1;
}
while(IRSIG==HI){
delay_us(6);
al_count=al_count+1;
}
enable_interrupts(INT_RTCC);//timer0割り込み許可
■エルロン・パルスについて
al_count×10μS=エルロンのパルス幅(μs)
により求めることができます。
先にスロットルのパルス幅をカウントしました。カウント方法は同じですが、エルロンとスロットルでは次の違いがあります。
エルロン・・・・ニュートラルをセンタとして、左右に分かれる。
スロットル・・・最スローからフルHiまで連続変化し、インドアプレーンではニュートラルをあまり意識しない。最スローでは確実にモータを停止させる。フルスロットではモータ出力を最大限にする。
以上の違いを意識してプログラミングする必要があります。
■エルロンの処理
・エルロン・パルスと動作について
フタバ社のパルスは1520μsをニュートラルとして、±450μsの幅があります。フタバ社のパルス構成に準じるために、カウントしたパルス幅を変換後、9段階の動作値に置き換えて、左右のエルロンを動作します。
左エルロンは、パルス幅の増加と動作値の増加方向が一致しています。右エルロンはパルス幅が減少すると動作値が増加する点に注意します。
| パルス幅(μS) | ←1070~ | 1520 | ~1970→ | ||||
| 変換値 | 7~46 | 47~52~57 | 58~97 | ||||
| 動作値 | 1~9 | 0 | 1~9 | ||||
| 動作 | 左 | ニュートラル | 右 | ||||
・エルロンの上限下限処理
まず、エルロン・パルスの下限上限の処理を行います。左右で同じ値にする必要があるので、スロットルよりも幅をもたせています。続けて、7~97に変換します。
//エルロンの処理 0~9の10段階PWM制御
if(al_count<107){//パルス下限1070μs(1520-450=1070)
al_count=107;
}
if(al_count>197){//パルス上限1970μs(1520+450=1970)
al_count=197;
}
al_count=al_count-100;//パルス幅:7~97に変換
・左エルロンの処理
次に、左エルロンの処理を行います。7~46を1~9の9段階に変換します。得られた動作値に(-)を掛けることにより動作方向を逆にします。
if(al_count<47){//エルロン左
on_coil=lcoil;//左コイル・セット
al_count=-(al_count-52)/5; //エルロン分解能左9段階
//エルロン左:7~46 => 1~9
}
・右エルロンの処理
右エルロンの処理を行います。動作方向と動作値が同じなので、そのまま割ります。
else if(al_count>57){ //エルロン右
on_coil=rcoil;//右コイル・セット
al_count=(al_count-52)/5;//エルロン分解能右9段階
//エルロン右:58~97 => 1~9
}
・ニュートラル時の処理
左右でない場合は、ニュートラルです。al_countは0になります。
else{//ニュートラル:47<= 52 <=57
al_count=0;
}
・デューティ・セット
最終的に得られるのは、on_coilに入っている左右の動作方向と、al_countがPWMのデューティとなります。
coil_duty=al_count;//コイルPWMデューティ・セット
■ 空欄を埋めてプログラムを完成してください。
// 赤外線2ch受信機 RX2&RX2-T対応
// ex9_rx2.c
// エルロンをPWMにより制御する(0~9の10段階PWM制御)
// 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
#define coil_off 0x0c
signed long al_count;//パルス・カウント用
int on_coil,cycl_count,coil_duty;
#int_rtcc
void coil_pwm()
{
set_timer0(6);
if(coil_duty==0){
GP=OFF;
}
else if(cycl_count <= coil_duty){
//coil_duty=9でduty=100%
GP=on_coil;//選択されたcoil=ONにする
}
else{
GP=OFF;
}
cycl_count=cycl_count+1;
cycl_count=cycl_count % 10;//0~9の10段階
}
//メイン・ルーチン
main(){
int gcount;
setup_comparator(NC_NC); //ディジタル入力切り替え
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); //割り込み全体許可
set_timer0(6);
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;
while(1){//ギャップ検出ルーチン
gcount=0;
while(gcount < 30){
if(IRSIG==HI){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}
While(IRSIG==HI){
}
// 1ch(エルロン)
(その1) ; //timer0割り込み禁止
al_count=0;
while(IRSIG==LOW){//Low、Hiループは1回10μsに調整済み
delay_us(6);
al_count=al_count+1;
}
while(IRSIG==HI){
delay_us(6);
al_count=al_count+1;
}
(その2) ;//timer0割り込み許可
// 2ch(エレベータ):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
// 3ch(スロットル)
while(IRSIG==LOW){ //Low、Hiループは1回10μsに調整済み
}
while(IRSIG==HI){
}
// 4ch(ラダー):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
//エルロンの処理 0~9の10段階PWM制御
if(al_count<107){//パルス下限1070μS(1520-450=1070)
al_count= (その3) ;
}
if(al_count>197){//パルス上限1970μ(1520+450=1970)
al_count= (その4) ;
}
al_count= (その5) ;//パルス幅:7~97に変換
if( (その6) ){//エルロン左
on_coil= (その7) ;//左コイルセット
al_count=-(al_count-52)/5; //エルロン分解能左9段階
//エルロン左:7~46 => 1~9
}
else if( (その8) ){ //エルロン右
on_coil= (その9) ;//右コイルセット
al_count=(al_count-52)/5;//エルロン分解能右9段階
//エルロン右:58~97 => 1~9
}
else{//ニュートラル:47<= 52 <=57
al_count=0;
}
coil_duty= (その10) ;//コイルPWMデューティ・セット
}//while
}//main
■実行
赤外線送信機TX2-006pのエルロン・スティックを左右にゆっくりと動かすと、対応したエルロンLEDが徐々に明るくなります。また、エルロン・スティックがニュートラル位置ではLEDが消えていれば、プログラミングは成功です。
■ダウンロード
この課題のC言語ソース・ファイルおよびHEXファイルは【ex9_rx2.lzh】よりダウンロードできます。
■解答
(その1)disable_interrupts(INT_RTCC) (その2)enable_interrupts(INT_RTCC) (その3)107 (その4)197
(その5)al_count-100 (その6)al_count<47 (その7)lcoil (その8)al_count>57 (その9)rcoil (その10)al_count
次回で完成します。
長野県飯田工業高校 竹内浩一

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