Quantcast
Viewing latest article 7
Browse Latest Browse All 440

PIC16F1827 PWM テスト

 PIC16F1827は、CCP1からCCP4の4つのMWP出力を持っています。

Image may be NSFW.
Clik here to view.
イメージ 1

 PWMの動作原理は、JH7UBCホームページのPIC16F628A PWM テストの記事をご覧ください。

 PWMのPeriod(周期)とDuty Cycle、Duty比は、次の式で設定します。

Image may be NSFW.
Clik here to view.
イメージ 2

 テストとして、CCP3に1000Hz(周期1ms=1×10^-3s) デューティ比50%のPWM信号を出力してみます。

 PICのクロックは、内臓クロック8MHz(Tosc=1/8×10^6)とし、Timerは、Timer2を使います

 上記の式からPWM周期を決定するTimer2のPR2の値は

PR2 = Period / (4×Tosc × TMR2Prescale Value) - 1= 1×10^-3/(4×(1/8×10^6)×TMR2 Prescale Value) -1

       = 2×10^3/TMR2 Prescale Value  となります。

TMR2のプリスケーラの値によってPR2の値は次のようになります。

 Prescale Value   PR2
     1                   1999
     4                     499
     16                   124

 PR2レジスタは8bitですから0~255の値でなければなりませんので

 Prescale Value = 16     PR2 = 124 となります。

 デューティ比を50%としますので、CCPR3L = (PR2 + 1)/2 = 125/2 = 62 となります。

 プログラムです。

 CCP3CONレジスタのbit3:2=11でPWM modeに設定し、bit1:0=00で出力をactive highに設定します。

 CCPTMRSレジスタのbit5:4=00でCCP3にTMR2を割り当てます。

 T2CONレジスタのbit1:0=10でプリスケーラ値を1:16に設定します。同じT2CONレジスタのbit2=1とするとTMR2が有効になり、PWM信号が出力されます。

 実際に出力されたPWM信号の周波数を測定してみました。

Image may be NSFW.
Clik here to view.
イメージ 3

 998Hzでした。誤差2%というところです。
 #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#define _XTAL_FREQ 8000000   //クロック8MHz
void main() {
    OSCCON = 0b01110010 ;     // 内蔵クロック8MHz
    ANSELA = 0b00000000 ;     // AN0-AN4は使用しない。全てデジタルポート
    ANSELB = 0b00000000 ;     // AN5-AN11は使用しない。全てデジタルポート
    TRISA  = 0b00000000 ;     // PORTAは全て出力(  RA5は入力のみ)
    TRISB  = 0b00000000 ;     // RORTBは全て出力
    PORTA  = 0b00000000 ;     // PORTA初期化
    PORTB  = 0b00000000 ;     // PORTB初期化
   
    /* PWMに関する設定
     * CCP3(RA3,2番ピン)を使う
     * PWMの周波数は、1000Hz(周期は1ms)
     * デューティ比は、50%とする
     */
   
    CCP3CON = 0b00001100;   //PWM mode P3A,P3C active high,P3B,P3D active high
    CCPTMRS = 0b00000000;   //bit5-bit4=00,CCP3にTimer2を割り当てる
    PR2 = 124;              //Timer2の周期を設定
    CCPR3L = 62;            //デューティ比 50%
    T2CON = 0b00000110;     //prescale 1:16 Timer2 start
   
    while(1){
       
    }
}

Viewing latest article 7
Browse Latest Browse All 440

Trending Articles