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%の波形が出力されます。
| レジスタ | 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周波数の関連
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); // 遅延(更新の速度)
}
}
}
PPS機能で、6出力ピンをどのpinにするか指定します。
PWM3をRC3に指定するなら、
RC3PPS = 14;
↑PWM3 を示す
PWM 信号を出力するピンは、TRIS ビットを"0"出力に設定する必要があります。