Thaimicrotron.com : Home
     
 
Infrared Remote control (IR)
 
     
     
 
  • การกำเนิดสัญญาณความถี่ 40KHz เพื่อเป็นความถี่พาหะ ของ Infrared Remote control (IR)
 
  -โมดูล CCP จะกำเนิดสัญญาณออกทางขา CCP1 (RB3-PIN9) และจะเปิด-ปิดสัญญาณโดยใช้ TRISB โดยกำหนดให้ที่บิท RB3 =0 เป็นเอาต์พุต สัญญาณก็จะถูกเปิด และเมื่อ RB3 =1 เป็นอินพุตสํญญาณก็จะถูกปิด  
 
 
 
การกำเนิดสัญญาณความถี่ 40KHz
 
     
   
     
  การคำนวน เมื่อใช้ XTAL= 4MHz และกำเนิดสัญญาณความถี่ 40KHz ดิวตี้ไซเคิล = 50% ใช้ Prescaler =1  
 
  • คาบเวลาของสัญญาณ T = 1/40e3 = 2.5e-5 sec
  • คาบเวลาของ XTAL Tosc = 1/4e6 = 2.5e-7 sec
  • PR= (2.5e-5 / (4*2.5e-7 * 1)) - 1 = 24
  • Dpwm = (50* 2.5e-5) / 100 = 1.25e-5 sec
  • CCP1CON CCP1CON<3:0> = (1.25e-5) / (2.5e-7 * 1) = 50 แปลงเป็นไบนารี 10 บิท = 00001100 10
 
     
  โปรแกรม TVRemote.c  
 
#include <16F628.h>
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP
//Describtion: Pulse Generate 40KHz of SONY Remote Control

//*** PIC16F628 ***
#byte	PORTB   = 0x06 
#byte	TRISB   = 0x86 
#byte	PR2     = 0x92
#byte	TMR2	= 0x11
#byte	T2CON	= 0x12
#byte	CCPR1L	= 0x15
#byte	CCP1CON	= 0x17

#define IRX 600
#define IRY 1200

#define PINCCP1ON()   set_tris_b(0B00000000)  
#define PINCCP1OFF()  set_tris_b(0B00001000)
#define TIMER2START() T2CON=0B01111100;         //Bit3=1
#define TIMER2STOP()  T2CON=0B01111000;         //Bit3=0

char IRCode[]={"101010010000"}; //Power NO/OFF

//40KHz OSC
void InitPWM(void)
{
    PR2     = 24;           //Set TIMER2 frequency
    CCPR1L  = 0B00001100;   //Set TIMER2 duty cycle
    CCP1CON = 0B00101111;   //Set x,y CCP1CON<5:4> any CCP1CON<3:0> = 11xx = PWM mode
    TMR2    = 0;            //Clear TMR2 first
    T2CON   = 0B01111000;   //Set prescaler Bit3=0 stop CCP1

}
void Tx1(void)
{
    delay_us(IRX);
    PINCCP1ON();
    delay_us(IRY);
    PINCCP1OFF();   
}
void Tx0(void)
{
    delay_us(IRX);
    PINCCP1ON();
    delay_us(IRX);
    PINCCP1OFF();

}
void PowerOn(char *Code)
{
int i;

    TIMER2START();
    PINCCP1ON();
    delay_us(2400);
    PINCCP1OFF();
    for(i=0;i<12;i++)
    {
     if(Code[i]=='0')
        Tx0();
     if(Code[i]=='1')
        Tx1();
    }
    delay_ms(26);               //Start frame
    TIMER2STOP();

}
void main(void) 
{
    set_tris_b(0B00000000);     //RB is Output
    InitPWM();    

    PowerOn(IRCode);            //PowerOn

    while(1);                   //Loop
   
}
 
     
     
  ผลการทำงาน  
  - เมื่อจ่ายไฟ MCU จะส่งสัญญาณ Power On แล้วหยุดทำงาน  
     
     
     
  โปรแกรมคำนวนการใช้งาน CCP1 โมดูล