#freeze
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)

*発光ダイオード(LED)の明るさを変える(PWM) [#c2f1029b]

PIC内蔵の「PWM(Pulse Width Modulation)機能」を利用した簡単なプログラムを作成し、
24FJ64GA002の「PWM制御」機能の利用法、稼働を確認しました。  08/03/18

注1)24FはPWM信号の出力ピンを自由に設定できる仕様になっている。
今回はOC1(PWM1の出力)機能をRP15ピンに割りつけた。

注2)MikroC dsPICでは、Pwm_Init()関数に、所望のPWM周期に設定した際の、PWM分解能
(period)の値を返してくれる機能が追加された。
PWMのduty値設定の際、この戻り値periodを使用して設定するプログラムを書いておくと
汎用性の高い表現となる。
例:PWMのdutyを70%に設定する
pwm_period1 = Pwm_Init(5000, 1, 1, 2); //PWMの周期を5000Hzに設定
Pwm_Set_Duty(pwm_period1 * 70 / 100, 1); //PWM duty70%に設定 

関連MikroC dsPIC関数
unsigned int Pwm_Init( unsigned int freq_hz , unsigned int enable_channel_x, unsigned int timer_prescale, unsigned int use_timer_x);
void Pwm_Set_Duty(unsigned duty, unsigned channel);
void Pwm_Start(char enable_channel_x);
void Pwm_Stop(char disable_channel_x);

&attachref(P1010598.JPG,zoom,150x150,button){新しい写真添付};

 /**
 * 24F64の稼働テスト PWMの使用方法
 *
 * PIC24FJ64GA002
 * LED: RB14, RB15
 *
 *Clock: 8.0MHz 内蔵発振器使用
 *電源:乾電池2本(3.0V)
 *Device Flags:
 *_IESO_OFF _FNOSC_FRC _FCKSM_CSDCMD _OSCIOFNC_OFF _POSCMOD_NONE
 *_JTAGEN_OFF _GCP_OFF _GWRP_OFF _BKBUG_OFF _COE_OFF _ICS_PGx1 _FWDTEN_OFF
 *
 *_IESO_OFF 2速度スタートアップ無効
 *_FNOSC_FRC クロックは内蔵オシレータを利用(8MHz)
 *_FCKSM_CSDCMD 動作中のクロック切り替え&監視OFF
 *_OSCIOFNC_OFF RA3はI/Oとして利用 _POSCMOD_NONE 主発信機無効
 *_JTAGEN_OFF  JTAG無効    _GCP_OFF  コードプロテクト無効
 *_GWRP_OFF  プログラムメモリ書込み禁止 _BKBUG_OFF デバッグモードにリセット
 *_COE_OFF  Clip-onエミュレーション無効
 *_ICS_PGx1  ICSP書き込みにPGC1/PGD1を使う FWDTEN_OFF  ウォチドック無効
 *
 * MikroC dsPIC v4.0.0.0
 * (6,000Byte以下なら無料利用)
 */
 void main()
 {
     unsigned int pwm_period1, i;
 
     PORTB = 0b0000000000000000; //PortBの中身ををきれいにする
     TRISB = 0b0000000000000000; //PortB 16個全て0:出力に設定
     //RP15ピンにOC1機能(PWM出力)18(=0b10010)を割付
     RPOUTR7bits.RP15R4 = 1;
     RPOUTR7bits.RP15R3 = 0;
     RPOUTR7bits.RP15R2 = 0;
     RPOUTR7bits.RP15R1 = 1;
     RPOUTR7bits.RP15R0 = 0;
 
     pwm_period1 = Pwm_Init(5000, 1, 1, 2); //PWMの周期を5000Hzに設定
 
     LATBbits.LATB14 = 1; //照度比較用LED ON
     
     Pwm_Start(1);
     while(1)
     {
         for(i = 0; i < pwm_period1; i++)
         {
             Pwm_Set_Duty(i, 1); //LEDの明るさを徐々に変える
             Delay_ms(20); //0.02秒(=20ミリ秒)待つ
         }
     }
 }

~
~
★この情報は役に立ちましたか?
#vote(はい[4],普通[2],いいえ[2])

#comment_nospam