// ハードウェアPWM制御赤外線受信機 // 26k0526rx2tm.c // PIC12F683PWM機能使用&マグネットアクチュエータ制御 #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 th_count,al_count;//パルスカウント用 int on_coil,cycl_count,coil_duty; #int_rtcc void coil_pwm() { set_timer0(6); if(cycl_count < coil_duty){ GP=on_coil; } else{ GP=OFF; } cycl_count++; cycl_count %=9; } //メインルーチン main(){ int gcount; setup_comparator(NC_NC); //デジタル入力切り替え setup_ccp1(CCP_PWM); //PWMモード使用宣言 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);// マグネットアクチュエータ周期 //(2E-6)*4*8*(255-6+1)=16ms*9=144ms setup_timer_2(T2_DIV_BY_4,255,1); //CCP1 PWMモードセット //PWM周期=(255+1)*4*(1/8E6)*4=0.512ms=1.95KHz enable_interrupts(INT_RTCC); //timer0割り込み許可 enable_interrupts(GLOBAL); //割り込み全体許可 set_timer0(6); set_tris_a(0x08);//GP3入力、他は出力 cycl_count=coil_duty=0; duty=0; th_count=0; while(1){//ギャップ検出ルーチン gcount=0; while(gcount < 30){ if(IRSIG==HI){ delay_us(100); gcount++; } else{ gcount=0; } } While(IRSIG==HI){ } disable_interrupts(INT_RTCC); // 1ch(エルロン) 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); // 2ch(エレベータ):未使用 while(IRSIG==LOW){ } while(IRSIG==HI){ } disable_interrupts(INT_RTCC); // 3ch(スロットル) th_count=0; while(IRSIG==LOW){//Low、Hiループは1回10μSに調整済み delay_us(6); th_count=th_count+1; } while(IRSIG==HI){ delay_us(6); th_count=th_count+1; } enable_interrupts(INT_RTCC); // 4ch(ラダー):未使用 while(IRSIG==LOW){ } while(IRSIG==HI){ } //エルロンの処理 if(al_count<107){ //フタバパルス下限 1070μS al_count=107; } if(al_count>197){ //フタバパルス上限1970μ al_count=197; } al_count=al_count-100; if(al_count<47){ //左スティック on_coil=rcoil; al_count=-(al_count-52)/5; //エルロン分解能9段階 } else if(al_count>57){ //右スティック on_coil=lcoil; al_count=(al_count-52)/5; } else{ //47<ニュートラル<57 GP=OFF; al_count=0; } coil_duty=al_count; //スロットルの処理 if(th_count<110){//最スロー th_count=0; } else if(th_count>190){//フルスロットル th_count=1023; } else{ th_count=(th_count-100)*10;//PWM10段階 } set_pwm1_duty(th_count); } }