PIC16F1619の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
PWM (Pulse Width Modulation)
2020−04−05

16F1619には、分解能10ビットのPWM専用モジュールが2組(PWM3,PWM4)あり、タイマー2、4または6と連携してPWM信号を発生させることができます。2本あるCCPモジュールにも、同機能のPWMモジュールがあるため合計4組のPWMモジュールがあります。
PWMモジュールがどのタイマーと連携するかは、CCPTMRSで変更することができますが、ここではタイマー2との連携例で動作を説明します。PWMの繰り返し周期は、タイマー2のPR2の設定値で決定し、デューティーサイクルは PWMxDCH と PWMxDCL に分けて保存されています。タイマー(TMR2)とPR2の値が一致するとTMR2をリセットします。同時に、PWM出力を”1”にセットし、PWMxDCH と PWMxDCLの値を、コンパレータ内部レジスタにコピーします。この値が、TMR2の値と一致するとPWM出力を”0”にリセットします。つまり、PR2の設定値の半分の値をPWMxDCHにセットすればデューティー50%の波形が出力されます。

PPS機能で、6出力ピンをどのpinにするか指定します。
PWM3をRC3に指定するなら、
RC3PPS = 14;
     ↑PWM3 を示す

PWM 信号を出力するピンは、TRIS ビットを"0"出力に設定する必要があります。

PWM output PPS表記
PWM3 14
PWM4 15
レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
PWMxCON PWMxEN - PWMxOUT PWMxPOL - - - -
PWMxDCH PWMxDCH<7:0>
PWMxDCL PWMxDCL<7:6> - - - - - -
CCPTMRS P4TSEL<1:0> P3TSEL<1:0> C2TSEL<1:0> C1TSEL<1:0>
RxyPPS - - - RxyPPS<4:0>
レジスタ BIT 説明 1 0
PWMxCON 7 PWMxEN PWMx モジュール ON/OFF ON OFF
5 PWMxOUT PWMx 出力値 (Read only) 1 0
4 PWMxPOL PWMx 出力極性 負論理 正論理
PWMxDCH <7:0> PWMxDCH PWMx デュティサイクル 上位 8 bit
PWMxDCL <7:6> PWMxDCL PWMx デュティサイクル 下位 2 bit
CCPTMRS 7 P4TSEL1 PWM4 連携タイマー (-)
 00 : TMR2  01 : TMR4  10 : TMR6
6 P4TSEL0
5 P3TSEL1 PWM3 連携タイマー
 00 : TMR2  01 : TMR4  10 : TMR6
4 P3TSEL0
プリスケラ値 1/64 1/16 1/4 1/1
PR2 セット値 0xFF 0xF9 0xFF 0xF9 0xFF 0xF9 0xFF 0xF9
Fosc 1MHz 15.3Hz 15.6Hz 61Hz 62.5Hz 244Hz 250Hz 976Hz 1KHz
4MHz 61Hz 62.5Hz 244Hz 250Hz 976Hz 1KHz 3.91KHz 4KHz
16MHz 244Hz 250Hz 976Hz 1KHz 3.91KHz 4KHz 15.6KHz 16KHz
32MHz 488Hz 500Hz 1.95KHz 2KHz 7.82KHz 8KHz 31.2KHz 32KHz

FoscとPWM周波数の関連

PWMのプログラム例

PushSWを押続けている間、PWMのデューティサイクルを連続的に変化させるプログラムです。 デューティサイクルの変化をLEDの明るさで確認することができます。

<プログラム>

/*********************************************************************
*  File name: PWM 3
*  Notes: 32MHz内部クロック PLLはOn
*        LED    RC5
* PIC16F1619  MPLAB X IDE with XC8
* 2020-4-5
* Copyright (c) 2017 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 32000000
#define LED LATC5
#define PushSW RC4

// CONFIG
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = ON
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC

/*********************************************************
                         Main application
 *********************************************************/
void main(void)
{
    OSCCON = 0b11110000;	// PLL ON; 8Hz_HF; FOSC;
    TRISC5 = 0;           // Outputs RC5
    RC5PPS = 14;
//------------ Initialize PWM ----------------------------------
    T2CON  = 0b10000000;         // Timer 2 PS1/1設定
    PR2    = 0xFF;               // Timer2 Period Register設定
    PWM3CON= 0b11000000;         // 正論理出力
    PWM3DCH= 0x80;               // デュティサイクルを設定
    while(1){                    // 繰り返しループ
        if(!PushSW){             // PushSWが押されれば
            PWM3DCH += 1;        // デュティサイクルを+1し更新
            __delay_ms(5);       // 遅延(更新の速度)
        }
    }
}