Ultrafire C3 Cree Q5 - ランタイム改善 自転車けんちゃん

大学サークルで自転車に魅せられて30年以上たちました。 いまだにロングライドと言えば日の出から日の入りまで 走っています。

ホーム > 改造 - ライト > Ultrafire C3 Cree Q5 - ランタイム改善

Ultrafire C3 Cree Q5 - ランタイム改善

Ultrafire C3 Cree Q5 5-Mode LED Flashlight with Extension (1.5V~4.2V)
の4モード化とラインタイムを改善する為の改造を行いました。
UltraFire_C3_20120130-4.jpg

ノーマルですと2000mAhニッケル水素電池2本でランタイムは約1時間です。
自転車で使用するにはランタイムが短すぎます。
基板を交換するとほぼ同じ明るさのままランタイムが約1時間45分~2時間になります。

カッコ内の名称はDXで基板単体で購入する時の名称です。
左:元の基板
(5-Mode LED Driver Circuit Board for Flashlight (DC 0.9~4.2V))
右:DXで購入した基板
(17mm 1000mA 5-Mode with Mode-Memory LEDDriver Circuit Board for Cree XR-E Emitters (0.9~4.5V Input))
UltraFire_20120226-3.jpg UltraFire_20120226-2.jpg


改造後の状態です。
UltraFire_20120318-2.jpg UltraFire_20120318-1.jpg
新しい基板は、プラスの電極の周囲にもビッシリ部品が実装されています。
#2012/04/17追記
#何れの基板も3.7Vで使用すると回路が焼き切れます。
#TrustFire 14500で試してみたところ交換した基板は
#2つとも焼き切れて点灯しなくなりました。
#交換前の元の基板も同様でした。

基板自体の改造は、PICの交換と
PICの1番ピン-4番ピン間のジャンパー追加
(自作PICのリセット信号をプルアップするため)
のみです。この基板は電源瞬断の誤動作はしないので
コンデンサーの追加は不要です。

両端の半田は電気的接点です。高さは約1.5mm必要です。
適当に盛り上げてから、カッターナイフで成型しました。

PICのソースコードはこちらです。
お好きな方はご自由にコピー、流用、改造してください。
(参考にしたよ~ってコメントいただけるとうれしいです。)
// ========================================================
// バージョン   1.4 (2012/3/18)
// デバイス     PIC12F629(675)
// コンパイラ   HI-TECH C Compiler for PIC10-12-16 MCUs V9.83
// 作成者       自転車けんちゃん
// 仕様
//   UltraFire C3 Cree Q5のLED制御回路
//   4モード(点滅、Low-Mid-High点灯)
//   点滅:0.25秒周期で点滅(0.05秒ON,0.20秒OFF)
//   Low点灯 :5ms周期、デューティ50%のPWMでLEDを点灯
//   Mid点灯 :5ms周期、デューティ75%のPWMでLEDを点灯
//   High点灯:5ms周期、デューティ100%のPWMでLEDを点灯
//
// クロックの設定
//   Clock      :4MHz
//   命令     :1us
//   プリスケーラ :プリスケーラOFF
//   タイマ0(TMR0) :250us(1us x 250 x 1)
//   PWM周期    :5ms(250us x 20)
//
// I/Oポートの設定
//   GP0 (7 pin):PWM出力
//   GP1 (6 pin):NC  (WPU)
//   GP2 (5 pin):NC  (WPU)
//   MCLR(4 pin):MCLR(このピンはチップにWPU機能なし)
//   GP4 (3 pin):NC  (WPU)
//   GP5 (2 pin):NC  (WPU)

#include <htc.h>

// タイマ割込みの周期 250us(1カウント=1us)
// カウントアップ方式なので256-250を設定するただし、
// 割り込みにより再設定するので+アルファの調整が必要
#define TIMER_250us   (6+18)
// PWM点滅周期 5ms(=250us*20)
#define PWM_5MS     20
// PWMのデューティ 40%(=8/20) 80%(=16/20)
#define PWM_DUTY20    4
#define PWM_DUTY50    10
#define PWM_DUTY75    15
#define PWM_DUTY100   20
// 点滅周期 0.25秒(=5ms*50)
#define BLINK_250MS   50
// 点滅のON期間 100%=(50/50) 20%(=10/50)
#define BLINK_DUTY100 50
#define BLINK_DUTY20  10
// 点滅のMODE
#define MODE_BLINK    0
#define MODE_LOW    1
#define MODE_MID    2
#define MODE_HIGH   3

unsigned char pwm_cnt;    // PWMの一周期(5ms)をカウント
unsigned char pwm_h_cnt;  // PWMのHigh期間をカウント(1us/1カウント)
unsigned char pwm_h_width;  // PWMのHパルス幅
bit           pwm_h_flg;  // PWMのHigh期間を示すフラグ

unsigned char blink_cnt;  // 点滅の一周期(0.25sec)をカウント
unsigned char blink_h_cnt;  // 点滅のHigh期間をカウント(5ms/1カウント)
unsigned char blink_h_width;// 点滅のHigh期間の幅
bit           blink_h_flg;  // 点滅のHigh期間を示すフラグ

bit           t5ms_flg;   // 5ms周期で立つフラグ

unsigned char mode;     // 点灯モード
bit           mode_b0_flg;  // 点灯モードのbit0
bit           mode_b1_flg;  // 点灯モードのbit1

__CONFIG(
   FOSC_INTRCIO // INTOSC oscillator, I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKI
 & WDTE_ON    // WDT enabled
// & WDTE_OFF   // WDT disabled
 & PWRTE_ON   // PWRT enabled (74ms reset)
 & MCLRE_ON   // // GP3/MCLR pin function is MCLR
 & BOREN_ON   // Brown-out Detect(BOD) enabled
// & BOREN_OFF    // Brown-out Detect(BOD) disabled
 & CP_OFF   // Program Memory code protection is disabled
 & CPD_OFF);  // Data memory code protection is disabled

// =================== 割り込み処理 ====================
void interrupt ISR(void) {

  TMR0 = TIMER_250us;     // TIMERのリロード
  T0IF = 0;         // TMR0割り込みクリア

  if(!(--pwm_cnt)){     // -1してから0判定
    t5ms_flg = 1;     // 5ms周期でmain関数にフラグを渡す
                // PWMの1周期終了 次の設定を行う
    pwm_cnt = PWM_5MS;    // PWMの1周期カウンタを初期化
    pwm_h_cnt = pwm_h_width;// PWMのHパルス幅を設定
    pwm_h_flg = 1;      // PWMのH期間を示す
  }else{
    if(!(--pwm_h_cnt)){   // -1してから0判定
      pwm_h_flg = 0;    // PWMのH期間終了(カウンターはオーバーランする)
    }
  }

  GP0=pwm_h_flg & blink_h_flg;  // PWMがH期間かつ、点滅のH期間にONにする。
}
// ==================== ノイズに強くするために頻繁に再設定する値 ===========================
void init_periodic(void) {
  // コンパレータの設定
  CMCON  = 0b00000111;
        // 0 (COUT)
        // 0 (CINV)
        // 0 (CIS)
        // 111 (CM=111:コンパレータOFF)
#ifdef __PIC12F675_H
  // ADの設定
  ANSEL  = 0b00000000;
        // 0,000(Tad=2xTosc:2us),0000(AN3-0 OFF)
  ADCON0 = 0b00000000;
        // 0  (ADFM 0:AD変換データ左詰め, 1:右詰め)
        // 0  (VCFG 0:Vref=VDD, 1:Vref=Vref pin)
        // 00 (NU 00:初期値)
        // 00 (CHSx 00:アナログ入力ピンAN0, 00:AN0)
        // 0  (GODONE 0read:変換終了 1read/write:変換スタート)
        // 0  (ADON 0:ADC電源OFF, 1:ON)
#endif
  // I/Oの設定
  TRISIO = 0b00111110;
        // 00,111110(TRISIO5-0:GPIOの出力は0,入力は1)
  WPU    = 0b00111110;
        // 00,111010(WPU5-0:1でプルアップ,0で使わない)

  // WPUとタイマーの設定
  OPTION_REG = 0b00011000;
        //0 (nGPPU  1:WPU使わない, 0:WPU使う)
        //0 (INTEDG 1:INTピン立上がりエッジ, 0:立下り)
        //0 (T0CS   1:タイマ0のクロックを外部クロック使用, 0:内部クロックを使用)
        //1 (T0SE   1:タイマ0を外部クロックの立上がり同期, 0:立下り同期)
        //1 (PSA    1:プリスケーラをWDTで使用, 0:タイマで使用)
        //000 (PSx   (000:1/1 WDT プリスケーラ 18ms)

  if(mode==MODE_HIGH){        // High点灯のパラメータ設定
    blink_h_width = BLINK_DUTY100;  // 点灯の場合は周期と同じ値を設定
    pwm_h_width   = PWM_DUTY100;    // PWMのHパルス幅を設定
  }else if(mode==MODE_MID){     // MID点灯のパラメータ設定
    blink_h_width = BLINK_DUTY100;  // 点灯の場合は周期と同じ値を設定
    pwm_h_width   = PWM_DUTY75;   // PWMのHパルス幅を設定
  }else if(mode==MODE_LOW){     // LOW点灯のパラメータ設定
    blink_h_width = BLINK_DUTY100;  // 点灯の場合は周期と同じ値を設定
    pwm_h_width   = PWM_DUTY50;   // PWMのHパルス幅を設定
  }else{                // 点滅のパラメータ設定
    blink_h_width = BLINK_DUTY20; // 点滅の場合は点灯期間の長さを設定
    pwm_h_width   = PWM_DUTY50;   // PWMのHパルス幅を設定
  }
}

// ==================== 起動時に1回だけ設定する値 ===========================
void init_once(void) {

  pwm_cnt   = 1;    //次の割り込みで初期化が発生する値
  blink_cnt = 1;    //次の割り込みで初期化が発生する値

  pwm_h_flg = 0;    // 最初の出力は0
  blink_h_flg = 0;  // 最初の出力は0

  TMR0 = TIMER_250us; // TIMER周期 250us

  GP0 = 0;      // LED消灯

  T0IE = 1;     // TMR0割り込み許可
  GIE = 1;      // 全体割り込み許可
}

// ==================== メイン処理 ===========================
void main(void) {

  // モード記憶用変数のリフレッシュ
  // この記述が無いとSRAMの内容は破壊されます。
  mode_b0_flg  = !mode_b0_flg;
  mode_b0_flg  = !mode_b0_flg;

  mode_b1_flg  = !mode_b1_flg;
  mode_b1_flg  = !mode_b1_flg;

  if(!nPOR){
    // Power On リセットの時は点滅に設定
    mode_b0_flg  = MODE_BLINK&1;
    mode_b1_flg  = (MODE_BLINK>>1)&1;
  }else{
    //modeの個別ビットを一つの変数modeに変換
    mode = mode_b0_flg | (mode_b1_flg <<1 );
    //modeをインクリメント
    mode++;
    mode&=3;
    //mode変数を個別のビットに分解して格納
    mode_b0_flg=(mode&1)?1:0;
    mode_b1_flg=(mode&2)?1:0;
  }
  nPOR=1//Power On リセットフラグをクリア

  init_periodic();  // 周期的設定

  init_once();    // 起動時設定

  CLRWDT();     // ウォッチドッグのクリア
  while(1) {
    init_periodic();  // 周期的設定

    if(t5ms_flg){   // 5ms間隔のpwm周期で実行
      t5ms_flg = 0;
      CLRWDT();   // ウォッチドッグのクリア

      if(!(--blink_cnt)){       // -1してから0判定
                      // 点滅の1周期終了
        blink_cnt = BLINK_250MS;  // 点滅の1周期カウンタを初期化
        blink_h_cnt=blink_h_width;  // 点滅のパルス幅を設定
        blink_h_flg=1;        // 点滅のH期間を示す
      }else{
        if(!(--blink_h_cnt)){   // -1してから0判定
          blink_h_flg=0;      // 点滅のH期間終了(カウンターはオーバーランする)
        }
      }
    }
  }
}
[ 2012/03/18 19:23 ] 改造 - ライト | TB(0) | CM(0)
コメントの投稿













管理者にだけ表示を許可する
プロフィール

けんちゃん

Author:けんちゃん
東京在住、和歌山生まれ
自称、和田峠ニスト
中華カーボンと手組みホイールでシクロクロス参戦中