8.PWM (Pulse Wide Modulation) 機能について

 

 PIC16F88にはPWM機能が備わっています。 この機能はタイマ2(TMR2)機能と併用することで、PWM機能を実現しています。PWMはソフトで比較的簡単に実現できますが、正確なパルスを出力するためには割込み機能は利用できなくなります。(割込みが頻発すると、その処理にCPU時間を費やされて周期やパルスの幅(デューティ・サイクル)が狂ってくるからです。) ハードウエアとしてPIC16F88に備わっているPWM機能は初期設定を済ませれば、専用のロジックとしてソフトの力を借りずにパルスを出力し続けます。 しかもデューティ・サイクル・レジスタ(CCPR1L)に任意の時点でデューティ・サイクル値を書き込めば、容易にパルスの幅(デューティ・サイクル)を自在に変化でき、PWM制御が可能になります。

ここでは、PWM機能を使って方形波を出力する方法を紹介します。(デューティ・サイクル値を中点で固定することで方形波を出力する)

 

 

 

 

 

 

 

 

 


8.1 コーディング例

このコーディングはチップの9ピン(CCP1)から38KHzの方形波を出力させる為にイニシャライズ処理の中で初期設定をしたものです。(このコーディングは全コーディングからPWM機能関連を抜粋したもので、このままでは使えません。)

;

;******************************************************************

;  Pulse Generator   Rev.01  (programed 2009)

;

;******************************************************************

                                          LIST                    P=PIC16F88

                                   #INCLUDE         "P16F88.INC"

                                        __CONFIG    _CONFIG1, _INTRC_IO & _CCP1_RB3 & _BODEN_OFF & _WDT_OFF & _CP_ALL & _PWRTE_OFF

& _CPD_OFF & _LVP_OFF & _MCLR_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF

四角形吹き出し: PWMの出力ピンはCONFIG定義でRB0(6ピン)か又は、PB3(9ピン)のどちらかを選択できる。                                         __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

;

                                         

                                          省略

                                         

;

;******************************************

; Initialize Routine

;******************************************

INIT

              BSF                     STATUS,RP0                   ;bank1

;set clock

              MOVLW              070H                                 ;internal clock 8 MHz

              MOVWF              OSCCON                    ;

;initialize PORTs

              MOVLW              020H                                 ;init ports

            MOVWF              TRISA                               ;

              MOVLW              0C1H                                 ;

            MOVWF              TRISB                               ;

四角形吹き出し: PR2レジスタで周期を設定する。ここでは38KHzを出力するので53をセットする。              CLRF                   ANSEL                              ;

;

              MOVLW              .53                                     ;set TMR2 (PWM period (26 uS)

              MOVWF              PR2                                   ;

              BSF                     PIE1,TMR1IE                   ;enable TMR1 interrupt                 

;initialize USRT

              MOVLW              020H                                 ;async,8bit,no-parity,TXEN

              MOVWF              TXSTA                               ;

四角形吹き出し: 38KHzの方形波を出力するのは、デューティ比を50:50にするので、PR2レジスタの設定値の半分の値(26)をデューティ・サイクル・レジスタ(CCPR1L)に書き込み、TMR2レジスタはゼロにした後CCP1CONレジスタでPWMモードに設定する。
その後、T2CONレジスタでTMR2を起動すると、パルスがCCP1ピンから出力する。
 デューティ・サイクル・レジスタ(CCPR1L)に1〜52までの値を任意の時点で書き込めばPWMの制御が可能になる。
              MOVLW              .51                                     ;2400bps

              MOVWF              SPBRG                              ;

;permit week-pullup of PORTB

              BCF                     OPTION_REG,WPU         ;permit week-pullup of PORTB          

              BCF                     STATUS,RP0                     ;bank0

;Set PWM and Stert TMR2 (38KHz)

              MOVLW              .26                                     ;set duty cycle (13 uS)

              MOVWF              CCPR1L                            ;

              CLRF                   TMR2                                ;set zero to TMR2

              MOVLW              0CH                                   ;set PWM mode

              MOVWF              CCP1CON                         ;

              CLRF                   T2CON                            ;start TMR2 counter ( prescaler 1:1

                                                                                 ; ,postscaler 1:1 (13 uS) )

              BSF                     T2CON,TMR2ON             ;start TMR2

;Stert TMR1

              CLRF                   INTCH                              ;reset int. timer

              CLRF                   INTCL                               ;

              MOVLW              030H                                 ;ready TMR1(262 ms interval)

              MOVWF              T1CON                              ;

                                         

                                          省略

                                         

 

 

8.2 後書き

PWM機能を使って方形波を出力する方法を説明しましたが、デューティ・サイクル・レジスタ(CCPR1L)にボリューム値を変換して書き込めば、簡単にPWM制御ができ、ラジコンやロボットのサーボ等を動かすことができます。 ただ残念ながら1チャンネル分しかないので、ファンの回転制御等には利用できます。

以上