■ 課題12
スロットル、エルロン方向の赤外線送信は完成しましたか?。最後に電池電圧が7Vを切るとステータスLEDが100msまたは250msの間隔で点滅し、電池交換であることを教えてくれる電源インジケータ機能を実装し、完成します。
■ 考え方
9時間目で完成させた電源電圧監視プログラムをそのまま組み込むことにより、機能を実現します。
set_adc_channel(2);
delay_us(20);
vdd_adc=read_adc();
channel(2)より電源電圧をA-Dコンバータで読み取ります。
alart()関数を使い、割り込みによるLEDの点滅を実現します。
alart()
{
set_timer1(3036);//3036・・250ms、40536・・100ms
led_sts=0x01-led_sts;
LED=led_sts;
}
半固定抵抗の目盛りを真ん中に合わせた場合、電源電圧が7Vになると、半固定抵抗からは3.5Vが出力されます。電源電圧が低下しても、PIC12F683の電源電圧は安定化されているために5Vが供給されます。したがって、A-Dコンバータの出力は、
3.5V/5V*1023=716
となります。
vdd_adc < 716
の条件でLEDの点滅割り込みを許可すれば、7V未満でLEDを点滅できるようになります。
// 赤外線2ch送信機 課題12
// ex12_006p.c PIC12F683用
// 総合プログラミング
#include<12f683.h>
#DEVICE ADC=10 //A-Dコンバータを10ビットで使用
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR
//ウオッチドック・タイマなし、パワーアップ・タイマ使用
//プロテクトなし、MCLRなし
#use delay(CLOCK=8000000) //8MHz駆動
#byte GP=5
#bit IROUT=GP.5
#bit LED=GP.4
#bit SW=GP.3
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
long th_adc,al_adc,vdd_adc;
int led_sts;
// 38kHz変調出力関数
// 13μs On、13μs OFFを19回繰り返して500μs のONを作る
// その後、VRのA-Dコンバータの値により、OFFタイム設定する。
//0・・1.000ms、512・・1.522ms、1024・・2.035ms
void ir_mod(long pulse){
int dummy;
long i;
disable_interrupts(INT_TIMER1);//割り込み禁止
for(i=0;i<19;i++){//38kHz変調になるように調整済み
IROUT=ON;
delay_us(13);
IROUT=OFF;
delay_us(6);
}
IROUT=OFF;
delay_us(325);
pulse=pulse/10;
for(i=0;i<pulse;i++){//1ループ10μs に調整済み
dummy=ON;
delay_us(2);
}
enable_interrupts(INT_TIMER1);//割り込み許可
}
//VR入力をA-Dコンバータより読み出し、各変数にセットする。
void adc_in(void)
{
set_adc_channel(0);
delay_us(20);
(その1) ;
set_adc_channel(1);
delay_us(20);
(その2) ;
set_adc_channel(2);
delay_us(20);
(その3) ;
}
#int_timer1//7V以下でLED点滅開始
alart()//100ms、250msごとに割り込みを発生する
{
set_timer1((その4) );
led_sts=0x01-led_sts;
LED=led_sts;
}
//メイン・ルーチン
void main()
{
int i;
set_tris_a(0x0f);
setup_adc_ports(sAN0 | sAN1 | sAN2 | VSS_VDD); //A-Dコンバータ使用宣言
setup_adc(ADC_CLOCK_DIV_32); //-ADコンバータのクロック
setup_oscillator(OSC_8MHz);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);//250msごとの割り込み
set_timer1( (その4));//timer1初期値
//enable_interrupts(INT_TIMER1);//割り込み許可
enable_interrupts(GLOBAL);//割り込み全体許可
IROUT=OFF;
LED=OFF;
led_sts=0;
for(i=0;i<3;i++){
LED=ON;
delay_ms(250);
LED=OFF;
delay_ms(250);
}
while(1){
adc_in();
//1chエルロン
ir_mod( (その5) );
//2chエレベータ(なし)
ir_mod(512);
//3chスロットル
ir_mod( (その6) );
//4chラダー(なし)
ir_mod(512);
//チャンネル・エンド
ir_mod(512);
// 電圧チェック・・7V以下でLEDが点滅するように10k半固定抵抗を調整すること。目盛りが中立になるように小変更
if( (その7) ){// 3.5V/5V*1023=716
LED=OFF;
(その8) ;//割り込み許可
}
else{
(その9) ;
LED=ON;
}
delay_ms(10);
}
}
■正解
(その1)th_adc=read_adc() (その2)al_adc=read_adc() (その3)vdd_adc=read_adc() (その4)3036 (その5)al_adc (その6)th_adc (その7)vdd_adc < 716 (その8)enable_interrupts(INT_TIMER1) (その9)disable_interrupts(INT_TIMER1)
・課題12のC言語ソース・ファイルとHEXファイルはこちらからダウンロードできます【ex12_006p.lzh】
赤外線送信の確認は別書の赤外線受信ボードか、次に製作する赤外線2ch受信機トレーニング・ボードで確認してください。以上で赤外線2ch送信機 TX2-006Pのプログラミングは完成です。
長野県飯田工業高校 竹内浩一

PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン