壊れたLED電球の中身(LED 15V用)を使ったランタン

回路はほぼ同じだが、こちらは12F683のPWMを使って20KHz Vrでデューティ比を可変としました。
コイル300μ Tr 2sc2120 消費電流は 最大200ma 念のために1時間タイマーでSLEEPに
しています。 計算では10時間ほど持つはずですが 未確認。
下にソースがあります。 詳細ご確認のほど。
6V → 15V  こんなモノでも最大50V程度までなるのでコンデンサーなど余裕を持つこと
Di は 通常検波用のモノを使ったが 結構 いけます。 瞬間程度なら1A でも壊れなかった。

HI−TECH C 9.8


戻る

/*
デジタルアンプ12F683 2015/04/26にほぼ動くようになった。
PWMとA-D変換を行った。 MAX80% MIN 1以下%のデューティ比になる」。
2015/05/20タイマーを付加した

*/
#include <htc.h>
#define _XTAL_FREQ 20000000


__CONFIG( FCMDIS // フェールセーフクロックモニタ動作禁止
& IESODIS // 内外クロックのスイッチオーバーモード動作禁止
& BORDIS // ブラウンアウト検出禁止
& UNPROTECT // データメモリ(EEPROM)のプロテクト禁止
& UNPROTECT // プログラムメモリのプロテクト禁止
& MCLREN // GP3/_MCLR端子は_MCLRで利用(自動的にプルアップされる)
& PWRTEN // パワーアップタイマ動作許可
& WDTDIS // ウォッチドッグタイマ動作禁止
& HS//INTIO //外部セラロック20MHz
);
//__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & BOREN_ON & MCLRE_OFF & IESO_OFF& FCMEN_OFF & CP_OFF) ;
//コンフィグレーション設定//(内蔵クロックを使用(CLKOUTは汎用入出力) &
//ウォッチドッグタイマ無効化 & パワーアップタイマ有効
// & ブラインアウト有効 & MCLRは汎用入力 & 2速度スタートアップ切替負荷
// & クロックモニタ検出不可 & プロテクト無効)//旧版(MPLAB IDE v8.66以前)はコンフィグレーション
//設定やレジスタ名が異なるため注意
// アナログ値の入力処理
unsigned int adconv()
{
unsigned int temp;

GODONE = 1 ; // PICにアナログ値読取り開始を指示
while(GODONE) ;
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です 最大1023

return temp ;
}



void main(void){
ADCON0 = 0b10000001 ; // アナログ変換情報設定AN0
__delay_us(20) ; // アナログ変換情報が設定されるまでとりあえず待つ

GPIO=0;
//OSCCON = 0b1110000; //111=8M 110=4M 101=2M 100 = 1M 011=500k 010=250k 001 =125k 000=31k
//1=外部クロック 0=内蔵クロック (発振器使用状態)
//1=発振安定 0=発振不安定 (高速クロック)
//1=発振安定 0=発振不安定 (低速クロック
//1=内蔵クロック使用 0=コンフィグレーション指定のクロック使用
ANSEL = 0b0001; //GP0(AN0)以外デジタル設定
CMCON0 = 0b111;
//コンパレータオフ GP0 GP1 GP2はデジタル入出力で使用
TRISIO = 0b000001;
//GP 5,4,3,2,1,0 (1=入力; 0=出力) //命令サイクル = (1sec/8MHz)*4clock*16(プリスケーラ)
//=8usec
PR2 =250; //8usec*(124+1) = 1msec(周期) = 1kHz 周波数の設定
TMR2 = 0; //TMR2プリスケール値
CCP1CON= 0b101100; //Duty微調整|PWMモード
CCPR1L =20;
T2CON = 0b100;// 0b110; //TMR2ON | プリスケーラ 1:1 TMRスタート指示とプリスケラの指示 これをOFFにすると停止となる。
//SLEEP()時には必ず停止をしなければ成らない。
unsigned int num ;
int a=0;
int b=0;
while(1)
{
a++; GPIO1=1; //SLEEP中MAXで点灯します。
if(a==6000){b++; a=0;} //1 Min - 1cnt 20μ秒程度遅れる。
if(b==59) //分の設定
{ T2CON = 0b000;CCP1CON= 0; SLEEP();}//一時間タイマー 現状維持の状態でお休みなため
asm("nop"); //PWM はT2CONをOFFにしないとSLEEP時ONのまま。
num=adconv()/4; //ここが最も肝心なせっていである。

if (num<2){num=2;} //リミッターのつもり。
if (num>150){num=150;} //これ以上増やしても電圧上がらず 300μH 2sc2021

CCPR1L =num; //Duty 10% 〜99% PR2=10;
__delay_ms(10); //For Timer
GPIO=0;




}
}

2SC1815と12F675で制作しましたがじゅうぶんどうさしました。
汎用の小型diでも200mA程度なら難なく動作しますし、 1815も十分このぐらいの
負荷には耐えます。 かんたんで随分と役に立ちます。

ランタン二世誕生 2個の押しボタンですべて操作

最新のチョッパー回路採用