日々の記録

ほどよく書いてきます。

定電流回路

2013年09月30日 23時12分20秒 | 電子工作

3Vから2V程度まで電流一定動作をする回路が必要になった。ちょっと大きな電池を放電しきってから捨てるらしい。
始めはDC-DCで昇圧して5Vの電源を作り、オペアンプでMOSFETを制御したが、部品が多いし、放電回路をいくつかってなると面倒なので、バイポーラトランジスタでの回路でお手軽簡単に済ませようかと思った。


回路は簡単。PNPトランジスタが少々大きくて電流増幅度βが100程度しかないので、NPNトランジスタと組み合わせたインバーテッドダーリントンにしてます。空中配線でも何とかなるかと思ったけど、ちょっとつらい。
シミュレーションではまあ、2V程度までならまあ、よさそうな特性を持っているのでまあ、勘弁してほしい。

当然のようにトランジスタは相当発熱するので放熱には多少の気遣いが必要である。回路では2SA1943-Oを使っているが、TO-220くらいのパッケージ(Tc=25℃でPc=25Wほど、放熱板なしでPc=2W程度)のものでもいいと思う。

この回路、たぶん壊れないだろうが、うっかり放熱板が取れたら発熱を担うトランジスタが壊れる可能性がある。温度が上がってブレークダウン(→これはショートモードで破損のはず)なので、念のためヒューズでも入れておけばまあいいかな。

この回路、逆に接続したら電流流れるかな?シミュレーションモデルはベースとコレクタ間のダイオードを考えてない気がするから、トランジスタを全部上下反転させてマイナス電源でシミュレートしてみたらいいかな。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

8ピンマイコン(ADCで読み込んでPWMで出力)

2013年09月24日 00時16分55秒 | その他雑記

ふとマイコンを使ったPWM出力を使って電力制御ができるはずと思い至ってプログラム書いてみた。
過去に作った8ビットのADCルーチンはそのまま活用。実はミス見つけたのでこっそり直した。

昔、コンパレータかやや高速なオペアンプを使い、擬似的な三角波を作り、これと可変抵抗からの電圧を読み込んでPWM制御をやった。
256段階のPWM制御でいいのであればマイコンのPWMでいいんじゃないかと思う次第。
PWMは1.2MHzで255カウントするので、1200/256=4.7kHz程度。目視であれば十分な速度。もしもっと速度を早くしたいなら、内臓クロックが1.2MHz以外にも、2.4MHz、4.8MHz、9.6MHzと選べるので、
9.4kHz(=2.4MHz/256)、18.8kHz(=4.8MHz/256)、37.5kHz(=9.6MHz/255)も選べる。せいぜい9.4kHz程度でいいかと思うけど。

以下プログラムのコード。
delayを使わないので、F_CPUのdefineは不要なんだけど、入ってる。


/*
* _20130923_Tiny13A_ADCtoPWM.c
*
* Created: 2013/09/23 23:42:27
* Author: m
*/

 
/*
ATTiny13A Pin割り振り
1:PB5 RESET ADC0 →出力端子に設定しちゃうとリセット出来なくなるので使わない
2:PB3 CLKI ADC3
3:PB4 ADC2
4:GND
5:PB0 MOSI OC0A
6:PB1 MISO OC0B
7:PB2 SCK ADC1
8:VCC
 
*/

#define F_CPU 1200000UL
#include <avr/io.h>
#include <util/delay.h>
 
#define Level4 179 // =255/5*3.5
#define Level3 153 // =255/5*3.0
#define Level2 128 // =255/5*2.5
#define Level1 102 // =255/5*2.0
 
unsigned char AnalogRead8bit(unsigned char Ch)
{
//8bit分解能で十分なのを前提に設定を行っている。
unsigned char ADC_result;
//デジタル入出力からの切り離し
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (1<<ADC1D) //同ADC1を切り離す(1設定で切り離し実行、0設定で接続)
| (1<<ADC2D) //同ADC2
| (1<<ADC3D); //同ADC3
 
ADMUX
= (0<<REFS0) //Reference: 0でVCC参照, 1で1.1V内部電圧源
| (1<<ADLAR) //ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる
| (Ch); //ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応
 
ADCSRA
= (1<<ADEN) //ADC enable
| (1<<ADSC) //ADC Start Conversion 1にすると変換開始
| (0<<ADATE) //ADC Auto Trigger Enable (for Continuous Conversion)
| (0<<ADIF) //ADC Interrupt Flag 変換完了すると1になるらしい
| (0<<ADIE) //ADC Interrupt Enable 変換完了したときに割り込み許可
| (0b100); //Clock Division: ADコンバータはクロック50-200kHzで性能がよい
//分周は0のとき2、それ以上の時2^n分周 1.2MHz(Default)のとき16分周(100)で75kHz。9.6MHzのとき128分周(111)で75kHz
 
loop_until_bit_is_set(ADCSRA,ADIF); //ADIFビットが1になるまでムダループ
ADC_result = ADCH;
 
//ピン切り離しの解除
 
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (0<<ADC1D) //同ADC1を接続(1設定で切り離し実行、0設定で接続)
| (0<<ADC2D) //同ADC2
| (0<<ADC3D); //同ADC3
 
return ADC_result;
}
 
void SetPWM(unsigned char Duty_0_255)
{
TCCR0A
= (1<<COM0A1) //OC0A端子をターゲットに、COM0A1:A0は高速PWM設定で以下の動作(高速PWMで使うモードのみセット)
| (0<<COM0A0) //10;BottomでHigh, 比較一致でLow、11;BottomでLow、比較一致でHigh
| (0<<COM0B1) //COM0B1:B0は出力がOC0Bになるだけで、同じ設定
| (0<<COM0B0) //
| (1<<WGM01) //WGMレジスタはTCCR0BのWGM02とあわせて設定
| (1<<WGM00); //WGM2:0が 011で8bit高速PWM動作
TCCR0B
= (0<<FOC0A) //非PWM動作のときのみ有効。今回は0設定
| (0<<FOC0B) //同上
| (0<<WGM02) //TCCR0AのWGMビット参照
| (0<<CS02) //CS0xでプリスケーラ設定
| (0<<CS01) //000停止、001=1分周、010=8分周、011=64分周、100=256分周、101=1024分周
| (1<<CS00); //110=T0ピン下降端(外部クロック)、111=T0ピン上昇端(外部クロック)
 
OCR0A=Duty_0_255;
//OCR0B=0b00000; //OCR0Bは使わないのだ!
 
}
 
int main(void)
{
DDRB = 0b00000011; //出力端子設定
while(1)
{
SetPWM(AnalogRead8bit(2));
}
}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ビットセットマクロ(備忘録)

2013年09月17日 00時31分09秒 | その他雑記
ビットをひとつ変更するマクロ。便利なんじゃないかと思っている。

#define cbi(addr,bit)     addr &= ~(1<<bit)		//clear bit
#define sbi(addr,bit) addr |= (1<<bit) //set bit
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino UNO R3でドットマトリックスLEDを点灯する。

2013年09月11日 00時47分21秒 | 電子工作

I tried to use dot matrix led with Arduion UNO R3

Arduino UNO R3でドットマトリックスLEDを点灯させてみた。


I bought this matrix leds at Nihonbashi Osaka, this is easy to use on bread board.
the interface is serial with clock signal (receiving data with HC595).


ドットマトリックスは、大阪日本橋のデジットで購入。ブレッドボードに刺すだけ超簡単。
クロックドシリアル接続 Dot812_88D_13SU ダイナミック駆動8×8ドット LEDモジュール
共立エレショップにはまだ登場してないかも

詳細はデジットブログへ
http://trackback.blogsys.jp/livedoor/digit4555/51883614
カラム側が0で点灯なので間違えないこと。以下のArduinoプログラムも反転出力させています。
active low with column lines.

データの作成はさすがに面倒臭いのでエクセルを使いました。というか、このテのものはデータ作成がほぼすべてですね。
I used microsoft Excel to make binary data as below. I have no idea to make font data. 


条件付書式で、1を書き込むと赤くなるようにしてある。コレで絵が見やすくなります。
上から1,2,4,8,16,32,64,128(2^0~2^7)と重みを乗算してから全部加算し8ビットのデータにします。文字の下の部分の列をメモ帳に貼り付け、TABを,に置換して配列にすればOKさ。

以下Arduinoのプログラム内容


//Define Pins connected to 74HC595
int latchPin = 2;
int clockPin = 3;
int dataPin = 4;
 
//Data. Make sure to use PROGMEM
prog_uchar Data[] PROGMEM = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
254,16,16,16,254,0,28,42,42,26,0,254,
0,0,254,0,28,34,34,28,0,3,0,0,60,2,28,2,60,0,
28,34,34,28,0,62,16,32,32,0,254,0,28,34,34,254,0,250,0,0,0,
60,2,28,2,60,0,94,0,32,124,34,0,254,32,32,30,0,0,0,62,72,136,72,62,0,
62,16,32,32,0,28,34,34,254,0,60,2,2,62,0,94,0,62,16,32,32,30,0,28,34,34,28,0,0,0,
252,2,2,2,252,0,254,64,56,4,254,0,124,130,130,130,124,0,0,0,
254,144,152,148,98,0,68,146,146,146,108,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
//Macro to access data on flash memory
#define DataList(number) pgm_read_byte(&Data[number])
 
void setup() {
//uses 3 pins for output, Latch, Clock, and Data.
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//ground latchPin and hold low for as long as you are transmitting
for(unsigned char k =0;k<156;k++){
for(unsigned char j =16;j>0;j--){
/* counting j for speed control */
for(unsigned char i=0;i<8;i++){
digitalWrite(latchPin, LOW); //start sending data
shiftOut(dataPin, clockPin, MSBFIRST, ~DataList(i+k+8)); //column data to right side LED matrix, Low to light
shiftOut(dataPin, clockPin, MSBFIRST, 1<<i); //common data, High to light
shiftOut(dataPin, clockPin, MSBFIRST, ~DataList(i+k)); //column data to left matrix
shiftOut(dataPin, clockPin, MSBFIRST, 1<<i); //common data
digitalWrite(latchPin, HIGH);
}
}
}
}


今回は左側、右側の順番にデータを送っているのだが、ところてん的なデータの流れがあるので右側に送り出す信号を予めぶち込んでおいて、左側のデータをたたき込む、こんな手順です。
左右逆転するときは、データを送り出す順番に気をつける。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

LTSpiceでOPA134, LM358を使う

2013年09月03日 01時38分39秒 | 電子工作

TI OPA134をLTSpiceで使えるようになったので、その方法をメモしておく。

まず、以下の内容でOPA134.asyファイルを作成し、
プログラムファイル\LTC\LTspiceIV\lib\sym\Opampsフォルダに入れる。

Version 4
SymbolType CELL
LINE Normal -32 -32 32 0
LINE Normal -32 32 32 0
LINE Normal -32 -32 -32 32
LINE Normal -28 -16 -20 -16
LINE Normal -28 16 -20 16
LINE Normal -24 20 -24 12
LINE Normal 0 -32 0 -16
LINE Normal 0 32 0 16
LINE Normal 4 -20 12 -20
LINE Normal 8 -24 8 -16
LINE Normal 4 20 12 20
WINDOW 0 16 -32 Left 0
WINDOW 3 16 32 Left 0
SYMATTR SpiceModel LM358.lib
SYMATTR Prefix X
SYMATTR Description National LM358
SYMATTR Value LM358
SYMATTR Value2 LM358
PIN -32 16 NONE 0
PINATTR PinName In+
PINATTR SpiceOrder 1
PIN -32 -16 NONE 0
PINATTR PinName In-
PINATTR SpiceOrder 2
PIN 0 -32 NONE 0
PINATTR PinName V+
PINATTR SpiceOrder 3
PIN 0 32 NONE 0
PINATTR PinName V-
PINATTR SpiceOrder 4
PIN 32 0 NONE 0
PINATTR PinName OUT
PINATTR SpiceOrder 5




次にオペアンプの回路をTIのサイトから手に入れる。
http://www.tij.co.jp/product/jp/opa134
からPSpiceモデルのダウンロードを選ぶとzipファイルがダウンロードできるので、そのファイルの中からOPA134.libファイルを取り出し、
プログラムファイル\LTC\LTspiceIV\lib\sub
フォルダへコピーする。
リンク切れに備えて、いかがOPA134.libの中身

* OPA134
*$
*****************************************************************************
* (C) Copyright 2011 Texas Instruments Incorporated. All rights reserved.                                            
*****************************************************************************
** This model is designed as an aid for customers of Texas Instruments.
** TI and its licensors and suppliers make no warranties, either expressed
** or implied, with respect to this model, including the warranties of 
** merchantability or fitness for a particular purpose.  The model is
** provided solely on an "as is" basis.  The entire risk as to its quality
** and performance is with the customer.
*****************************************************************************
*
* This model is subject to change without notice. Texas Instruments
* Incorporated is not responsible for updating this model.
*
*****************************************************************************
*
** Released by: Analog eLab Design Center, Texas Instruments Inc.
* Part: OPA134
* Date: 20MAY2011
* Model Type: ALL IN ONE
* Simulator: PSPICE
* Simulator Version: 16.0.0.p001
* EVM Order Number: N/A 
* EVM Users Guide: N/A
* Datasheet: SBOS058
*
* Model Version: 1.0
*
*****************************************************************************
*
* Updates:
*
* Version 1.0 : 
* Release to Web
*
*****************************************************************************
* CONNECTIONS:		 NON-INVERTING INPUT
*	                 | INVERTING INPUT
*       	         | | POSITIVE POWER SUPPLY
*               	 | | | NEGATIVE POWER SUPPLY
*	        	 | | | | OUTPUT
*       	         | | | | |
* PIN CONFIG FOR OPA134 :1 2 3 4 5
*
* This model is also applicable to OPA2134 and OPA4134
*****************************************************************************
.SUBCKT OPA134   1 2 3 4 5
C1   11 12 3.240E-12
C2    6  7 8.000E-12
CSS  10 99 1.000E-30
DC    5 53 DX
DE   54  5 DX
DLP  90 91 DX
DLN  92 90 DX
DP    4  3 DX
EGND 99  0 POLY(2) (3,0) (4,0) 0 .5 .5
FB    7 99 POLY(5) VB VC VE VLP VLN 0 248.0E6 -250E6 250E6 250E6 -250E6
GA    6  0 11 12 402.0E-6
GCM   0  6 10 99 4.020E-9
ISS   3 10 DC 160.0E-6
HLIM 90  0 VLIM 1E3
J1   11  2 10 JX
J2   12  1 10 JX
R2    6  9 100.0E3
RD1   4 11 2.490E3
RD2   4 12 2.490E3
RO1   8  5 20
RO2   7 99 20
RP    3  4 7.500E3
RSS  10 99 1.250E6
VB    9  0 DC 0
VC    3 53 DC 1.200
VE   54  4 DC .9
VLIM  7  8 DC 0
VLP  91  0 DC 40
VLN   0 92 DC 40
.MODEL DX D(IS=800.0E-18)
.MODEL JX PJF(IS=2.500E-15 BETA=1.010E-3 VTO=-1)
.ENDS OPA134

*$



もう、使えるようになる。




外にはLM358などは便利だろう。 LM358.libは

*//////////////////////////////////////////////////////////////////////
* (C) National Semiconductor, Inc.
* Models developed and under copyright by:
* National Semiconductor, Inc.  

*/////////////////////////////////////////////////////////////////////
* Legal Notice: This material is intended for free software support.
* The file may be copied, and distributed; however, reselling the 
*  material is illegal

*////////////////////////////////////////////////////////////////////
* For ordering or technical information on these models, contact:
* National Semiconductor's Customer Response Center
*                 7:00 A.M.--7:00 P.M.  U.S. Central Time
*                                (800) 272-9959
* For Applications support, contact the Internet address:
*  amps-apps@galaxy.nsc.com

*//////////////////////////////////////////////////////////
*LM358 DUAL OPERATIONAL AMPLIFIER MACRO-MODEL
*//////////////////////////////////////////////////////////
*
* connections:      non-inverting input
*                   |   inverting input
*                   |   |   positive power supply
*                   |   |   |   negative power supply
*                   |   |   |   |   output
*                   |   |   |   |   |
*                   |   |   |   |   |
.SUBCKT LM358       1   2  99  50  28
*
*Features:
*Eliminates need for dual supplies
*Large DC voltage gain =             100dB
*High bandwidth =                     1MHz
*Low input offset voltage =            2mV
*Wide supply range =       +-1.5V to +-16V
*
*NOTE: Model is for single device only and simulated
*      supply current is 1/2 of total device current.
*      Output crossover distortion with dual supplies
*      is not modeled.
*
****************INPUT STAGE**************
*
IOS 2 1 5N
*^Input offset current
R1 1 3 500K
R2 3 2 500K
I1 99 4 100U
R3 5 50 517
R4 6 50 517
Q1 5 2 4 QX
Q2 6 7 4 QX
*Fp2=1.2 MHz
C4 5 6 128.27P
*
***********COMMON MODE EFFECT***********
*
I2 99 50 75U
*^Quiescent supply current
EOS 7 1 POLY(1) 16 49 2E-3 1
*Input offset voltage.^
R8 99 49 60K
R9 49 50 60K
*
*********OUTPUT VOLTAGE LIMITING********
V2 99 8 1.63
D1 9 8 DX
D2 10 9 DX
V3 10 50 .635
*
**************SECOND STAGE**************
*
EH 99 98 99 49 1
G1 98 9 POLY(1) 5 6 0 9.8772E-4 0 .3459
*Fp1=7.86 Hz
R5 98 9 101.2433MEG
C3 98 9 200P
*
***************POLE STAGE***************
*
*Fp=2 MHz
G3 98 15 9 49 1E-6
R12 98 15 1MEG
C5 98 15 7.9577E-14
*
*********COMMON-MODE ZERO STAGE*********
*
*Fpcm=10 KHz
G4 98 16 3 49 5.6234E-8               
L2 98 17 15.9M
R13 17 16 1K
*
**************OUTPUT STAGE**************
*
F6 50 99 POLY(1) V6 300U 1
E1 99 23 99 15 1
R16 24 23 17.5
D5 26 24 DX
V6 26 22 .63V
R17 23 25 17.5
D6 25 27 DX
V7 22 27 .63V
V5 22 21 0.27V
D4 21 15 DX
V4 20 22 0.27V
D3 15 20 DX
L3 22 28 500P
RL3 22 28 100K
*
***************MODELS USED**************
*
.MODEL DX D(IS=1E-15)
.MODEL QX PNP(BF=1.111E3)
*
.ENDS
*$

subは上記OPA134をいじればいい。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino UNO R3とドットマトリックスでHello worldの表示を

2013年09月03日 00時55分19秒 | 電子工作



データ入力大変。

  1. //Pin connected to ST_CP of 74HC595
  2. int latchPin = 2;
  3. //Pin connected to SH_CP of 74HC595
  4. int clockPin = 3;
  5. ////Pin connected to DS of 74HC595
  6. int dataPin = 4;
  7.  
  8. //Hello, world! data
  9. prog_uchar Data[] PROGMEM = {
  10. 0,0,0,0,0,0,0,0,0,254,16,16,16,254,0,28,42,42,26,0,254,0,0,254,0,28,34,34,28,0,3,0,0,60,2,28,2,60,0,28,34,34,28,0,62,16,32,32,0,254,0,28,34,34,254,0,250,0,0,0,0,0,0,0,0
  11. };
  12.  
  13. #define DataList(number) pgm_read_byte(&Data[number])
  14.  
  15. void setup() {
  16. //set pins to output because they are addressed in the main loop
  17. pinMode(latchPin, OUTPUT);
  18. pinMode(clockPin, OUTPUT);
  19. pinMode(dataPin, OUTPUT);
  20. }
  21. void loop() {
  22. //count up routine
  23. //ground latchPin and hold low for as long as you are transmitting
  24. for(unsigned char k =0;k<57;k++){
  25. //jは時間稼ぎのループのため
  26. for(unsigned char j =0;j<32;j++){
  27. for(unsigned char i=0;i<8;i++){
  28. digitalWrite(latchPin, LOW);
  29. shiftOut(dataPin, clockPin, MSBFIRST, ~DataList(i+k));
  30. shiftOut(dataPin, clockPin, MSBFIRST, 1<<i);
  31. digitalWrite(latchPin, HIGH);
  32. }
  33. }
  34. }
  35. }
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする