Thaimicrotron.com : Home
     
 
การใช้โมดูล CCP1 และ TIMER2 กำเนิดสัญญาณ
(Pulse Generate)
 
     
 
  • โมดูล CCP(Capture/Compare/PWM) สามารถใช้กำเนิดสํญญาณ และมอดูเลชั่นทางความกว้างของพัลส์ความละเอียดขนาด 10 บิท PWM (Pulse Width Modulator) ซึ่งจะทำงานร่วมกันกับ TIMER2
  • CCP1 เป็นโมดูลที่ เมื่อกำหนดค่าเริ่มต้นในการทำงานให้แล้ว โมดูลนี้จะทำงานต่อไปได้เองโดยอิสระ ทำให้ MCU ไม่ต้องเสียเวลา วนลูปในการ จัดการ กับเอาต์พุต ในขณะที่โมดูล นี้ทำงาน   MCU สามารถที่จะควบคุมการเปิด-ปิดสัญญาณ ผ่านทาง รีจิสเตอร์ควบคุมได้
    - จึงทำให้สามารถใช้งานในการกำเนิดสัญญาณ อย่างเช่นการสร้างความถี่ 40KHz เพื่อเป็นความถี่พาหะ(CARRIER FREQUENCY ) ของ Infrared Remote control (IR)
 
     
 
 
 
การทำงานของโมดูล CCP1/TIMER2 ในการกำเนิดสัญญาณ
 
     
     
 
  • ส่วนกำเนิดสํญญาณ TIMER2 ได้รับสัญญาณนาฬิกา FOSC/4 จากระบบ โดยกำหนดตัวหารความถี่ (Prescaler) ได้จาก T2CON
    รีจิสเตอร์ PR2 เป็นตัวกำหนดคาบเวลา
  • CCPR1 มีขนาด 16 บิทใช้ในการควบคุม duty cycle ประกอบด้วย CCPR1H และ CCPR1L
  • รีจิสเตอรควบคุมคือ CCP1CON CCP1CON<3:0>จะต้องกำหนดเป็น 11xx = PWM mode
 
     
 
ขั้นตอนการใช้งาน CCP1 กำเนิดสํญญาณ
 
  1). หาคาบเวลาของ PWM (PWM PERIOD) เพื่อกำหนดค่าให้กับ PR2  
 

1.1). กำหนดความถี่ (จะได้คาบเวลาของพัลส์ช=1/f ) และ ดิวตี้ไซเคิลของพัลส์

 
 

1.2).คำนวนหาค่ารีจิสเตอร์ PR2 เพื่อกำหนดคาบเวลาของ TIMER2 เพื่อใช้ผลิตความถี่ หาได้จากสูตร

 
 
 
     
  เมื่อ T = คาบเวลา (1/f) ของพัลส์ , Tosc = คาบเวลา (1/f) ของ XTal , P = ค่าของ ปรีเสกลเลอร์ 1,4,16  
     
 
       
  โดยที่ค่า PR2 เป็นเลขจำนวนเต็มและมีค่าน้อยกว่า 256
 
     
  2).หาดิวตี้ไซเคิลของ PWM (PWM DUTY CYCLE) เพื่อกำหนดค่าให้กับ CCPR1(CCPR1L:CCP1CON<5:4>)  
 

2.1). หาดิวตี้ไซเคิลของ PWM

 
 
       
 
     
  d= percent-duty cycle , T = คาบเวลาของพัลส์  
     
 
       
       
 
     
 

2.2).หาค่าที่จะโปรแกรมลงในรีจิสเตอร์ CCPR1L:CCP1CON<5:4> จาก

 
   
 

2.3) ค่าที่คำนวนได้ CCPR1L:CCP1CON<5:4> ซึ่งมีขนาด 10 บิท โดยจะต้องเก็บไว้ใน CCPR1L= 8 บิท และ CCP1X: CCP1Y 2 บิทขวาสุดจะอยู่ในรีจิสเตอร์ CCP1CON<5:4> (บิทที่ 5 และ4 ตามลำดับ )

 
     
 
 
 
การกำนดค่าให้กับรีจิสเตอร์ CCPR1L:CCP1CON<5:4>
 
  3).กำนดค่าให้กับ T2CON  
 
  • TMR2 = 0 ,Clear ค่า TMR2
  • T2CON<7> ไม่ใช้ ให้กำหนดค่า=0
  • T2CON<6:3> เป็นการกำหนดค่า POSTScaler ไม่มีผลกำหนดให้เป็น 1111
  • T2CON<2> = On/Off Timer2
  • T2CON<0:1> กำนด Prescaler
 
     
 
 
  จากข้อ 3 หาก T2CON<2> =1 Timer2 ก็จะเริ่มต้นทำงานทันที  
     
  ตัวอย่างที่1 การคำนวน เมื่อใช้ XTAL= 4MHz และกำเนิดสัญญาณความถี่ 1KHz ดิวตี้ไซเคิล = 50% ใช้ Prescaler =4  
 
  • คาบเวลาของสัญญาณ T = 1/1e3 = 0.001 sec
  • คาบเวลาของ XTAL Tosc = 1/4e6 = 2.5e-7 sec
  • PR= (0.001 / (4*2.5e-7 * 4)) - 1 = 249
  • Dpwm = (50*1e-3)/100 = 5e-4 sec
  • CCP1CON CCP1CON<3:0> = (5e-4)/(2.5e-7 * 4) = 500 แปลงเป็นไบนารี 10 บิท = 01111101 00
 
     
  ตัวอย่างที่2 การคำนวน เมื่อใช้ 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
 
     
  ตัวอย่างการกำหนดค่าเริ่มต้นในฟังชั่น  
 
//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;   //T2CON<0:1>Set prescaler ,T2CON<2>=0 stop Timer2

}
 
     
  โปรแกรมคำนวนการใช้งาน CCP1 โมดูล  
  Infrared Remote control (IR)