« 14-7 課題7 赤外線受信:モータLED PWM制御 (11段階) | メイン | 14-9 課題9 エルロン・コイルLEDをPWMにより制御する(0~9の10段階PWM制御) »

はてなブックマークに追加   14-8 課題8 エルロン左右コイルLEDをソフトPWMにより9段階で交互にほわ~ん点灯する

 モータLEDの制御にはPIC12F683のハードウェアPWMを利用して、スムーズに回転したと思います。エルロン(ラダー)LEDを点滅させることは既に実現していますが、このままでは、ON/OFFの状態のみになり、インドアプレーンのラダーとして考えた場合、一杯に切れるか、まっすぐかのどちらかになってしまいます。

 エルロンにもPIC12F683のハードウェアPWMを使えればよいのですが、この機能は1chしか、搭載されていません。そこで、エルロンはプログラミングで実現するソフトウェアPWMにより制御することにします。

 LEDをソフトウェアPWM制御し、ほわーんと点灯させましょう。

kadai8_web.jpg
timer0割り込みの初期設定

 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により制御します。

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

トラックバック

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

コメントを投稿

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

カレンダ

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月14日 10:02に投稿されたエントリーのページです。

ひとつ前の投稿は「14-7 課題7 赤外線受信:モータLED PWM制御 (11段階)」です。

次の投稿は「14-9 課題9 エルロン・コイルLEDをPWMにより制御する(0~9の10段階PWM制御)」です。

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

Powered by
Movable Type 4.1