Thứ Tư, 28 tháng 11, 2018

Bài 10. PIC 18F450 Chế Độ CCP

Giới thiệu

Đầu vào Capture được sử dụng rộng rãi trong nhiều ứng dụng như:
  • Ghi lại thời gian đến của một sự kiện
  • Đo chiều rộng xung
  • Khoảng thời gian đo
Một sự kiện có thể được biểu diễn bằng các cạnh tăng và giảm của xung.
                                         
Sự kiện tín hiệu

Thời gian xảy ra sự kiện có thể được ghi lại bằng cách chốt số đếm khi một cạnh được phát hiện (tăng hoặc giảm). Điều này có thể được thực hiện bằng cách sử dụng chế độ chụp đầu vào trong bộ vi điều khiển.
PIC18F4550 có mô-đun CCP (Capture / Compare / PWM) tích hợp sẵn có chế độ chụp đầu vào . Việc thu nhận đầu vào của tín hiệu có các ứng dụng như tìm tần số, tính chu kỳ nhiệm vụ của tín hiệu đầu vào, v.v. 
Chúng ta hãy xem chế độ chụp trong vi điều khiển PIC 18F4550 .
PIC18F4550 có hai mô-đun CCP -  
  1. CCP1
  2. CCP2
Ở đây, chúng ta sẽ thảo luận về mô-đun CCP1.
Trong chế độ chụp , xung đầu vào phải được kết nối với CCP1 được ghép kênh với PORTC.2 (RC2) như được hiển thị bên dưới và định cấu hình nó làm đầu vào pin.

Chân chụp PIC18F4550

PIC18F4550 Chế độ chụp chân
PIC18F4550 Chế độ chụp chân


Mô-đun CCP1 chỉ có thể sử dụng hai bộ hẹn giờ sau
  1. Timer1
  2. Timer3

Làm việc của chế độ chụp

Bây giờ, chế độ chụp hoạt động như thế nào?
Sơ đồ khối chế độ chụp
  • Timer1 hoặc Timer3 được khởi tạo để đếm giá trị trong hoạt động chụp.
  • Thanh ghi T3CON được sử dụng để chọn Timer1 / Timer3 cho việc chụp đầu vào được hiển thị ở trên.
  • Khi cạnh tăng hoặc giảm được phát hiện tại pin CCP1 , bit CCP1IF cờ ngắt được thiết lập. Nó được xóa thông qua phần mềm.
  • Khi xảy ra gián đoạn, giá trị của bộ đếm thời gian được sao chép vào đăng ký CCP CCPR1 (CCPR1H và CCPR1L) và bằng cách xem xét giá trị này, chúng tôi có thể tìm thấy thời gian đến của sự kiện đó.

Đăng ký chế độ chụp (CCP)

Trong PIC18F4550, các thanh ghi khác nhau được sử dụng cho chế độ chụp.
1. CCPR1 Register là thanh ghi sự kiện 16 bit trong đó sự kiện được ghi lại bởi timer1 hoặc timer3 nghĩa là thanh ghi TMR1 hoặc TMR3 được sao chép. Điều này được thực hiện bởi chính phần cứng. Thanh ghi CCPR1L và thanh ghi CCPR1H là hai thanh ghi 8 bit được sử dụng để lưu trữ byte thấp hơn và cao hơn, tương ứng.
Đăng ký CCPR1
Đăng ký CCPR1

2. Đăng ký CCP1CON: Đăng ký kiểm soát CCP
Đây là thanh ghi 8 bit được sử dụng để chọn chế độ chụp. Hãy xem cấu hình bit của thanh ghi này.
Đăng ký CCP1CON
Đăng ký CCP1CON

CCP1M3: CCP1M0: Chế độ CCP1 Chọn bit
         0100 = Chế độ chụp được chọn cho mỗi cạnh bị rơi phát hiện.
         0101 = Chế độ chụp được chọn cho mỗi cạnh tăng được phát hiện.
         0110 = Chế độ chụp được chọn cho mỗi cạnh tăng thứ 4 được phát hiện.
         0111 = Chế độ chụp được chọn cho mỗi cạnh tăng thứ 16 được phát hiện.
Và các kết hợp khác của các bit này được sử dụng cho chế độ So sánh và chế độ PWM.
DCxB1 và DCxB0 chỉ được sử dụng cho chế độ PWM.
Cờ ngắt CCP1IF
  • Sau khi xảy ra sự kiện chụp, cờ ngắt được đặt.
  • Cờ ngắt này là CCP1IF (cờ ngắt của CCP) nằm trong thanh ghi PIR1 . Sổ đăng ký PIR1 được hiển thị bên dưới.
Đăng ký PIR1 : Đăng ký ngắt ngoại vi
Đăng ký PIR1
Đăng ký PIR1

CCP1IF:
      1 = TMR1 hoặc TMR3 đăng ký chụp xảy ra (ở rơi hoặc tăng cạnh của xung)
      0 = Không chụp TMR1 hoặc TMR3.
Chúng ta cần kích hoạt cờ này ( CCP1IF ) bằng cách kích hoạt bit CCP1IE (bit kích hoạt ngắt của CCP) trong thanh ghi PIE1 .
Đăng ký PIE1 : Kích hoạt ngắt ngoại vi
Đăng ký PIE1
Đăng ký PIE1

Đăng ký T3CON: Đăng ký và kiểm soát trạng thái Timer3
Thanh ghi T3CON được sử dụng để chọn hẹn giờ cho chế độ chụp. Điều này được hiển thị bên dưới
Đăng ký T3CON
Đăng ký T3CON

T3CCP2: T3CCP1 (bit 6 và bit 3)
Hai bit kết hợp này được sử dụng để chọn chế độ Hẹn giờ và Chụp.
      00 = Timer1 là nguồn đồng hồ chụp / so sánh cho cả hai mô-đun CCP.
      01 = Timer3 là nguồn đồng hồ chụp / so sánh cho CCP2,
              Timer1 là nguồn đồng hồ chụp / so sánh cho CCP1
      1x = Timer3 là nguồn đồng hồ chụp / so sánh cho cả hai mô-đun CCP.
RD16 :
Bit này được sử dụng để xác định rằng thanh ghi Timer3 là 16 bit (TMR3) hoặc hai bit 8-bit (TMR3H và TMR3L).
      RD16 = 1 , Bật một thanh ghi 16 bit.
      RD16 = 0 , Cho phép hai thanh ghi 8 bit.
Cài đặt bit này chỉ được yêu cầu khi chúng tôi chọn Timer3 cho chế độ chụp.
Nếu không, RD16 trong thanh ghi T1CON được sử dụng cho Timer1.

Các bước cho chế độ chụp lập trình (CCP)

Khởi tạo chế độ chụp PIC18F4550
  1. Khởi tạo thanh ghi CCPCON1 để chụp cạnh tăng hoặc giảm.
  2. Định cấu hình pin CCP1 làm ghim đầu vào.
  3. Nếu bạn đang sử dụng Timer3, sau đó cấu hình đăng ký T3CON để chọn Timer3 để chụp đầu vào; nếu không, Timer1 là mặc định.
  4. Ngoài ra, đặt giá trị của thanh ghi T1CON hoặc T3CON để quyết định xem thanh ghi hẹn giờ có phải là hai bit 8-bit (TMRxL và TMRxH) hoặc 16 bit (TMRx) hay không.
  5. Đặt CCPR1 và TMR3 / TMR1 thành 0.
Lưu ý: 'x' là 1 hoặc 3.
CCP1CON = 0x05; /* Capture mode is selected for detecting rising edge */
CCPR1 = 0x00; /* Clear CCPR1 register for counting*/
T1CON = 0x80; /* Enable 16-bit TMR1 register, no pre-scale, 
  use internal clock, timer OFF */

Hoạt động chụp
  1. Đặt hẹn giờ ON.
  2. Theo dõi cho đến khi cờ CCP1IF == 1, được đặt khi chụp xảy ra.
  3. Sao chép giá trị của thanh ghi CCPR1 vào bất kỳ biến dữ liệu nào và nhận được thời gian xảy ra sự kiện.

Ứng dụng

Hãy thiết kế một ứng dụng bằng cách sử dụng PIC18F4550, trong đó chúng ta sẽ đo tần số của tín hiệu đầu vào và hiển thị nó trên màn hình LCD 16x2. Tín hiệu đầu vào được kết nối với pin CCP1 (RC2) để đo tần số.
#include <stdio.h>
#include <stdlib.h>
#include <p18f4550.h>
#include "osc_config.h"
#include "LCD_8bit_file.h"
#include <string.h>

#define f_timer 2000000

void main()
{
    unsigned long signal_period,data1,data2;
    unsigned long frequency_Hz[20];
    float Frequency;
    TRISCbits.TRISC2=1;
    OSCCON=0x72;        /* set internal clock to 8MHz */
    LCD_Init();
    memset(frequency_Hz,0,20);
    LCD_String_xy(0,1,"Pulse"); 
 
    PIE1bits.CCP1IE=1;
    PIR1bits.CCP1IF=0;     
    CCP1CON=0x05;       /* Capture mode is selected for detecting Rising edge */
    CCPR1=0x00;         /*CCPR1 is capture count Register which is cleared initially*/
    TMR1IF=0;           
    T1CON=0x80;         /* Enable 16-bit TMR1 Register,No pre-scale,use internal clock,Timer OFF */
    TMR1=0; 
 TMR1ON=1; /* Turn-On Timer1 */ 
    while(1)        
    {    
        while(!(PIR1bits.CCP1IF));  /*Wait for Interrupt flag which is generated when edge is detected*/
        PIR1bits.CCP1IF=0;
        data1 = CCPR1;              /*Copy count of 1st edge detected*/        
            
        while(!(PIR1bits.CCP1IF));  /*Wait for Interrupt flag which is generated when edge is detected*/
        PIR1bits.CCP1IF=0;
        data2 = CCPR1;              /*Copy count of 2nd edge detected*/

        if(data1 < data2)
           {

            /*Calculation for Frequency Measurement*/
            signal_period = data2 - data1;
            Frequency = ((float)f_timer / (float)signal_period); /*Count for 1 cycle*0.5us gives period */
            sprintf(frequency_Hz,"%.3f  ",Frequency); 

            LCD_String_xy(2,0,frequency_Hz);
            
            } 
        TMR1=0;
        memset(frequency_Hz,0,20);
    }                              
}
Code mô phỏng


Không có nhận xét nào:

Đăng nhận xét