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

Bài 9. PIC 18F450 PWM

Giới thiệu

Pulse Width Modulation (PWM) là một kỹ thuật mà theo đó chiều rộng của xung được thay đổi trong khi vẫn giữ tần số của hằng số sóng.
Thế hệ PWM
Thế hệ PWM
Một chu kỳ xung bao gồm chu trình ON (5V) và chu kỳ OFF (0V). Phần mà tín hiệu được BẬT trong một khoảng thời gian được gọi là chu kỳ nhiệm vụ .

Chu kỳ nhiệm vụ (phần trăm) = \ frac {Ton} {Tổng thời gian} \ ast 100

Ví dụ: Một xung với khoảng thời gian 10ms sẽ vẫn ON (cao) trong 2ms.Trước đó, chu kỳ nhiệm vụ sẽ là
D = 2ms / 10ms = 20%
Thông qua kỹ thuật PWM, chúng tôi có thể điều khiển công suất được cung cấp cho tải bằng cách sử dụng tín hiệu ON-OFF. Các tín hiệu PWM có thể được sử dụng để điều khiển tốc độ của động cơ DC và thay đổi cường độ của đèn LED. Hơn nữa, nó cũng có thể được sử dụng để tạo ra tín hiệu sin.
Pulse Width Các tín hiệu điều chế với chu kỳ nhiệm vụ khác nhau được hiển thị bên dưới
Chu kỳ nhiệm vụ PWM
Chu kỳ nhiệm vụ PWM

Bộ điều khiển PIC18F4550 có mô-đun PWM 10 bit trong xây dựng được gọi là mô-đun CCP. Pin CCP1 (RC2) được sử dụng để tạo tín hiệu PWM. Nó cần phải được cấu hình như đầu ra.

Chân PIC18F4550 PWM

Chân PIC18F4550 PWM
Chân PIC18F4550 PWM

Trong PIC18F4550, chỉ có Timer2 mới có thể được sử dụng để tạo PWM. TMR2 là thanh ghi Timer2 16 bit được sử dụng để giữ số đếm.
Trong PIC18F4550 các thanh ghi sau được sử dụng để tạo PWM.
Lưu ý:  Ở đây, chúng tôi đang sử dụng mô-đun CCP1. Nếu chúng ta muốn sử dụng mô-đun CCP2 thì chúng ta cần phải sửa đổi tên đăng ký là CCPR1L thành CCPR2L, CCP1CON thành CCP2CON.
Ngoài ra, làm cho pin RC1 là đầu ra cho thế hệ PWM.
CCPR1H và CCPR1L đăng ký
Trong mô-đun CCP, có một thanh ghi 16 bit được chia thành hai thanh ghi 8 bit - CCPR1H và CCPR1L.
CCPR1H và CCPR1L đăng ký
Đăng ký CCPR1

  • Chỉ CCPR1L được sử dụng để quyết định chu kỳ nhiệm vụ của PWM. CCPR1H không phải là người dùng có thể truy cập cho chế độ PWM.
  • Khi PIC18F4550 tạo ra xung PWM 10 bit, để thiết lập chu kỳ nhiệm vụ, nó sử dụng thanh ghi 10 bit. 8 bit (MSBs) DC1B9: DC1B2 cao hơn của thanh ghi này nằm trong thanh ghi CCPR1L (8 bit) và 2 bit thấp hơn (LSBs) DC1B1: DC1B0, được sử dụng cho phần thập phân trong chu kỳ nhiệm vụ, nằm trong thanh ghi CCP1CON 5 và 4 tương ứng.
  • Vì vậy, giá trị 10 bit cho chu kỳ nhiệm vụ được biểu thị bằng CCPR1L: CCP1CON <5: 4>
Đăng ký PR2
  • Nó là một thanh ghi 8 bit được sử dụng để tải một số đếm cho một khoảng thời gian xung (TPWM).

Làm việc của PWM trong mô-đun ĐCSTQ

PIC18F4550 PWM thế hệ làm việc sơ đồ khối
PIC18F4550 PWM thế hệ làm việc
  1. Tải giá trị thời gian trong thanh ghi PR2 và giá trị chu kỳ nhiệm vụ trong thanh ghi CCPR1L: CCP1CON <5: 4> và khởi tạo chốt CCP1 làm đầu ra.
  2. Cấu hình T2CON đăng ký và đặt thanh ghi TMR2 thành 0. Ngoài ra, hãy khởi động Timer2.
  3. Bây giờ khi một trận đấu xảy ra giữa các thanh ghi PR2 và TMR2, pin CCP1 được kéo cao và TMR2 bị xóa.
  4. Giá trị của CCPR1L cùng với CCP1CON <5: 4> là số đếm cho chu kỳ nhiệm vụ được chuyển đến CCPR1H.
  5. Cuối cùng, TMR2 được so sánh với CCPR1H cùng với hai bit thấp hơn của chu kỳ nhiệm vụ. Khi phù hợp, pin CCP1goes thấp.
TMR2 và PR2 làm việc cho thế hệ PWM

Đây là cách PWM được tạo ra trong PIC18F4550.

Đăng ký CCP1CON : Đăng ký kiểm soát CCP1 cho PWM
Đăng ký CCP1CON
Đăng ký CCP1CON

DC1B1: DC1B0
Hai bit này là các LSB được sử dụng để xác định giá trị thập phân của chu kỳ nhiệm vụ.
CCP1M3: CCP1M0: bit lựa chọn chế độ mô-đun CCP1
11xx = chế độ PWM
Các kết hợp khác được sử dụng cho chế độ chụp và so sánh.
Tính toán
Bây giờ làm thế nào để thiết lập giá trị cho thanh ghi PR2 xác định giá trị thời gian của một xung.
PR2 = \ frac {Fosc} {(Fpwm \ ast4 \ ast Giá trị Prescale Timer)} - 1

Ở đâu,
Fpwm - Tần số tín hiệu PWM

Bây giờ, chúng ta hãy xem làm thế nào để thiết lập một giá trị cho CCPR1L mà quyết định chu kỳ nhiệm vụ của một xung. Chúng ta biết rằng một chu kỳ nhiệm vụ là một số% của PR2 (thời gian) đăng ký. Ví dụ, nếu PR2 là 199 thì chu kỳ nhiệm vụ 20% của 199 được cho bởi,
CCPR1L: CCP1CON <5: 4> = 4 \ ast (PR2 + 1) \ ast (\ frac {Chu kỳ nhiệm vụ} {100})
ví dụ
(CCPR1L: CCP1CON <5: 4>) = 4 × (199 + 1) x (20/100)
(CCPR1L: CCP1CON <5: 4>) = 40 = 0b0010100000

Vì vậy, tải MSB 8 bit ở trên dẫn đến các bit CCPR1L và 2 LSB trong CCP1CON <5: 4>.
tức là CCPR1L = 0b00101000 = 0x28
      CCP1CON <5: 4> = 0b00
Lưu ý: Giá trị CCPR1L (chu kỳ nhiệm vụ) phải luôn nhỏ hơn hoặc bằng giá trị PR2 (dấu chấm). Nếu giá trị CCPR1L lớn hơn giá trị PR2, ghim CCP1 sẽ không bị xóa. Điều này cho phép một chu kỳ nhiệm vụ 100% và cho đầu ra.
Lưu ý: Tuy nhiên, nếu giá trị PR2 vượt quá giá trị 8 bit tức là 255 thì chúng tôi phải tăng giá trị quy mô trước Timer2.
Độ phân giải tối đa PWM
\ frac {\ log (\ frac {Fosc} {Fpwm})} {\ log 2}   bit
Chu kỳ nhiệm vụ PWM phải là một giá trị từ 0 đến (2 ^ Độ phân giải PWM) - 1.

Các bước lập trình

  1. Tải giá trị PR2 sẽ quyết định thời gian của xung.
  2. Đặt chu kỳ nhiệm vụ bằng cách tải một giá trị trong CCPR1L: CCP1CON <5: 4>
  3. Định cấu hình đăng ký CCP1CON để đặt chế độ PWM.
  4. Khởi tạo pin CCP1as một pin đầu ra sẽ cung cấp cho đầu ra PWM.
  5. Cấu hình đăng ký T2CON và bật TMR2 bằng T2CON

Ứng dụng 1

Hãy để chúng tôi tạo ra 10KHz PWM với chu kỳ nhiệm vụ 20%.

#include "osc_config.h"
#include <pic18f4550.h>

void main()
{

    OSCCON = 0x72; /* Set internal clock to 8MHz */
    TRISC2 = 0;  /* Set CCP1 pin as output for PWM out */
    PR2 = 199;  /* Load period value */
    CCPR1L = 40; /* load duty cycle value */
    T2CON = 0;  /* No pre-scalar, timer2 is off */
    CCP1CON = 0x0C; /* Set PWM mode and no decimal for PWM */
    TMR2 = 0;  /* Clear Timer2 initially */
    TMR2ON = 1;  /* Timer ON for start counting*/

    while(1);

}

Ứng dụng 2

Bây giờ, chúng ta hãy kiểm soát cường độ của đèn LED bằng cách tạo PWM với chu kỳ nhiệm vụ khác nhau bằng cách sử dụng PIC18F4550.
#include "osc_config.h"
#include <p18f4550.h>

void MSdelay(unsigned int);

void main()
{
    unsigned int duty_cycle;  
    OSCCON=0x72;         /* set internal clock to 8MHz */
    TRISCbits.TRISC2=0;  /* Set CCP1 pin as output for PWM out */
    PR2=199;             /* load period value in PR2 register */ 
    CCPR1L=1;            /* load duty cycle */
    T2CON=0;             /* no pre-scalar,timer2 is off */
    CCP1CON=0x0C;        /* set PWM mode and no decimal value for PWM */
    TMR2=0;
    T2CONbits.TMR2ON=1;  /* Turn ON Timer2 */
    while(1)
    {

        for(duty_cycle=1;duty_cycle<199;duty_cycle++)
        {
            CCPR1L = duty_cycle;   /* load duty cycle */
            MSdelay(20);
        }
        MSdelay(500);
        
        for(duty_cycle=199;duty_cycle>1;duty_cycle--)
        {
            CCPR1L = duty_cycle;   /* load duty cycle */
            MSdelay(20);
        }
        MSdelay(500);
    }
    
}

void MSdelay(unsigned int val)
{
     unsigned int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<165;j++);      /*This count Provide delay of 1 ms for 8MHz Frequency */
 }

Code mô phỏng
Tệp đính kèm

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

Đăng nhận xét