17章:タイマ(PWMモード)

    作成2014.03.10

  1. STEP20_PWMMode
    (1)STEP20_PWMModeソースプログラム
    STEP20_PWMModeソースプログラムを以下に示します。
    /*****************************
     STEP20_PWMMode.c
    *****************************/
    
    #define _LEGACY_HEADERS
    
    // インクルードファイルの読み込み
    #include <pic.h>
    // コンフィギュレーションワードの設定
    __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO );
    
    // プロトタイプ宣言
    void InitPWM (void);
    void InitTimer2 (void);
    
    // メイン関数
    void main (void)
    {
    	// 1,2,17,18端子を入出力端子に設定
    	CMCON = 0x07;
    	
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
    	
    	// 入出力設定
    	TRISA = 0x20;
    	TRISB = 0x00;
    	
    	// PWMモード設定関数の呼び出し
    	InitPWM();
    	
    	// タイマ2設定関数の呼び出し
    	InitTimer2();
    	
    	// 永久ループ
    	while(1)
    	{
    		// LED1点灯
    		RB0 = 0;
    	}
    }
    
    // PWMモード設定関数
    void InitPWM (void)
    {
    	// RB3端子を出力端子に設定
    	TRISB3 = 0;
    	
    	// CCPのモードをPWMモードに設定
    	CCP1M3 = 1;
    	CCP1M2 = 1;
    	CCP1M1 = 0;
    	CCP1M0 = 0;
    	
    	// 周期を100μ秒に設定(99 + 1μ秒)
    	PR2 = 0b01100011;
    	
    	// Hの時間を99μ秒に設定(396 × 0.25μ秒)
    	CCPR1L = 0b01100011;
    	CCP1X = 0;
    	CCP1Y = 0;
    }
    
    // タイマ2設定関数
    void InitTimer2 (void)
    {
    	// プリスケーラ値を1に設定
    	T2CKPS1 = 0;
    	T2CKPS0 = 0;
    	
    	// TMR2レジスタをクリア
    	TMR2 = 0;
    	
    	// タイマ2起動
    	TMR2ON = 1;
    }
    


  2. CCP1CONレジスタ
    pic16f62xa.h
    volatile unsigned char CCP1CON @ 0x17;
    bit CCP1M0 @((unsigned)&CCP1CON*8)+0;
    bit CCP1M1 @((unsigned)&CCP1CON*8)+1;
    bit CCP1M2 @((unsigned)&CCP1CON*8)+2;
    bit CCP1M3 @((unsigned)&CCP1CON*8)+3;
    volatile bit CCP1Y @((unsigned)&CCP1CON*8)+4;
    volatile bit CCP1X @((unsigned)&CCP1CON*8)+5;
    // CCPのモードをPWMモードに設定
    CCP1M3 = 1;
    CCP1M2 = 1;
    CCP1M1 = 0;
    CCP1M0 = 0;
    CCP1M3:CCP1M0: CCPx Mode Select bits
    0000 = Capture/Compare/PWM off (resets CCP1 module)
    0100 = Capture mode, every falling edge
    0101 = Capture mode, every rising edge
    0110 = Capture mode, every 4th rising edge
    0111 = Capture mode, every 16th rising edge
    1000 = Compare mode, set output on match (CCP1IF bit is set)
    1001 = Compare mode, clear output on match (CCP1IF bit is set)
    1010 = Compare mode, generate software interrupt on match (CCP1IF bit is set, CCP1 pin is
    unaffected)
    1011 = Compare mode, trigger special event (CCP1IF bit is set; CCP1 resets TMR1
    11xx = PWM mode

    // Hの時間を99μ秒に設定(396 × 0.25μ秒)
    CCP1X = 0;
    CCP1Y = 0;
    CCP1X:CCP1Y: PWM Least Significant bits
    Capture Mode: Unused
    Compare Mode: Unused
    PWM Mode: These bits are the two LSbs of the PWM duty cycle. The eight MSbs are found in CCPRxL.


  3. PR2レジスタ
    pic16f62xa.h
    unsigned char PR2 @ 0x92;
    // 周期を100μ秒に設定(99 + 1μ秒)
    PR2 = 0b01100011;
    *周期を設定します。
    The PWM period can be calculated using the following formula:
    PWM period = [(PR2) + 1] ? 4 * TOSC *(TMR2 prescale value)


  4. CCPR1Lレジスタ
    // Hの時間を99μ秒に設定(396 × 0.25μ秒)
    CCPR1L = 0b01100011;
    CCP1X = 0;
    CCP1Y = 0;
    pic16f62xa.h
    volatile unsigned char CCPR1L @ 0x15;
    PWM DUTY CYCLE
    PWM duty cycle = (CCPR1L:CCP1CON<5:4>)*Tosc * (TMR2 prescale value)
    *CCPのレジスタ
    *パルス信号のH時間を設定
    *TMR2レジスタの値とCCPR1レジスタ+CCP1X,Yの値が一致した時CCP1端子をLレベルにする。


  5. TMR2レジスタ
    // TMR2レジスタをクリア
    TMR2 = 0;
    pic16f62xa.h
    volatile unsigned char TMR2 @ 0x11;
    *タイマ2のレジスタ
    *クロックがはいるとカウントアップする。


  6. T2CONレジスタ
    // プリスケーラ値を1に設定
    T2CKPS1 = 0;
    T2CKPS0 = 0;
    pic16f62xa.h
    volatile unsigned char T2CON @ 0x12;
    bit T2CKPS0 @((unsigned)&T2CON*8)+0;
    bit T2CKPS1 @((unsigned)&T2CON*8)+1;
    T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits
    00 = 1:1 Prescaler Value
    01 = 1:4 Prescaler Value
    1x = 1:16 Prescaler Value


  7. タイマ2起動
    TMR2ON = 1;
    bit TMR2ON @((unsigned)&T2CON*8)+2;
    TMR2ON: Timer2 On bit
    1 = Timer2 is on
    0 = Timer2 is off


  8. RB3端子を出力端子に設定
    TRISB3 = 0;
    pic16f62xa.h
    volatile unsigned char TRISB @ 0x86;
    volatile bit TRISB3 @((unsigned)&TRISB*8)+3;


  9. STEP20_PWMModeソースプログラムの実行
    *RB0に接続したLEDが明るく点灯します。
    *RB3に接続したLEDが暗く点灯します。









18章:最終章に行く。

トップページに戻る。