閲覧総計:16885  (本日:1  昨日:1)

【目次】(項目をクリックすると飛べます)


発光ダイオード(LED)の明るさを変える(PWM)

PIC内蔵の「PWM(Pulse Width Modulation)機能」を利用した簡単なプログラムを作成し、
18F2320が持つ2つのCCPの「PWM制御」機能の利用法、稼働を確認した。  07/09/29

注)18F2320の場合、PWM信号はCCP1がRC2から発振され、CCP2の発振は、RC1かRB3かの
便利な方を選べる。
注)CCP = Compare/Capture/PWM

・内蔵発振器(8MHz)を利用する。
・MCLRはPIC内部プルアップで利用する。

【結果】PWMで2つの発光ダイオード(LED)の明るさを独立して制御出来る事が確認
出来た。

※C18のプログラムを追記 07/10/04

関連MikroC関数
void Pwm1_Init(unsigned long freq);
void Pwm2_Init(unsigned long freq);
void Pwm1_Change_Duty(unsigned short duty_ratio);
void Pwm2_Change_Duty(unsigned short duty_ratio);
void Pwm1_Start(void);
void Pwm2_Start(void);
void Pwm1_Stop(void);
void Pwm2_Stop(void);

P1010549.JPG

MikroCのプログラム

/**
* 18F2320の稼働テスト
* PWM機能で2つの発光ダイオードの明るさを徐々に変える
*
* RC1: LED (CCP2出力)
* RC2: LED (CCP1出力)
* RC3: LED (照度比較用)
*
*Clock: 8.0MHz 内蔵発振器使用
*Device Flags:
* _INTIO2_OSC_1H _WDT_OFF_2H _MCLRE_OFF_3H _LVP_OFF_4L
* (その他はデフォルト設定でOK)
*
* MikroC v7.0.0.3
*/
void main()
{
    unsigned short int i; //使用変数の定義

    //PICの初期化
    PORTC = 0b00000000; //PortCの中身をきれいにする
    //内蔵発信機 8MHz使用に設定
    OSCCON = 0b01110000;
    TRISC = 0b00000000; //PortC 8個全て0:出力設定
    PWM1_Init(5000); //PWM1の初期化 (5KHz周期指定)
    PWM2_Init(5000); //PWM2の初期化 (5KHz周期指定)

    PORTC.F3 = 1; //照度比較用LED ON

    PWM1_Start(); //PWM1機能スタート
    PWM2_Start(); //PWM2機能スタート

    do //doとwhileの間を繰り返す
    {
        //2つのLEDの明るさを徐々に変える
        for (i = 0; i < 256; i++)
        {
            PWM1_Change_Duty(i); //PWM1のDuty変更
            PWM2_Change_Duty(255 - i); //PWM2のDuty変更
            Delay_ms(30); //30msec待つ
        }
    } while(1); //doとwhileの間を繰り返す
}

★この情報は役に立ちましたか?

選択肢 投票
はい 10  
普通 6  
いいえ 10  

C18のプログラム

関連C18関数
void OpenPWM1(char period);
void OpenPWM2(char period);
void SetDCPWM1(unsigned int dutycycle);
void SetDCPWM2(unsigned int dutycycle);

/**
* 18F2320の稼働テスト
* PWM機能で2つの発光ダイオードの明るさを徐々に変える
*
* RC1: LED (CCP2出力)
* RC2: LED (CCP1出力)
* RC3: LED (照度比較用)
* Clock: 8.0MHz 内蔵発振器使用
*
* C18 StudentEdition v3.12
*/
#include <p18f2320.h>
#include <pwm.h>
#include <delays.h>

//config設定
#pragma config OSC = INTIO2 //内部発振器を利用
#pragma config WDT = OFF //ウォッチドッグタイマOFF
#pragma config MCLRE = OFF //MCLRを内部プルアップ
#pragma config LVP = OFF //低電圧ICSP制御OFF
//その他のconfigはデフォルト設定のまま

void main(void)
{
    unsigned int i; //使用変数の定義
	
    //初期化
    PORTC = 0b00000000; //PortCの中身をきれいにする
    OSCCON = 0b01110000; //内蔵発振器を8MHz使用に設定
    TRISC = 0b00000000; //PortC 8個全て0:出力設定

    PORTCbits.RC3 = 1; //照度比較用LED ON
    OpenPWM1(255); //PWM1をオープン
    OpenPWM2(255); //PWM2をオープン
	
    while(1)
    {
        //LEDの明るさを徐々に変える(1024分解能)
        for (i = 0; i < 1024; i++)
        {
            SetDCPWM1(i); //PWM1のDuty変更
            SetDCPWM2(1023 - i); //PWM2のDuty変更
            Delay10KTCYx(1); //5msec待つ
        }
    }
}

★この情報は役に立ちましたか?

選択肢 投票
はい 13  
普通 1  
いいえ 8  

添付ファイル: fileP1010549.JPG 2229件 [詳細]