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) |
|
|
|
|