PSoCによる定電流源
by K.I
2012/07/17
Index
- PSoC3のユーザモジュールを見ていたら、定電流源のモジュールがあった。
- これは、PSoC1のモジュールには無いけど、センサとか使う時にあると便利だ。
- 何故、PSoC1には無いんだろう?
- アナログの構成はそんなに変わっていない(と思う)んだから、PSoC1でも出来るはず
- ということで調べてみると、 AN2089というのが見つかった。
- 圧力センサを繋ぐというのは、CQ出版の「PSoC3ボード+デバッグ・ボード」にあった例を参考にしました。
[top]
- AN2089では、どの様に定電流源を実現しているのか、追っかけてみる。
- 英文は苦手なので、ざっと読んで適当に意訳しただけだけど。
- x1のオペアンプの出力から、Rsetを通して負荷抵抗Rloadに接続する。
- 設定電圧Vsetと負荷電圧Vloadを比較して電流Isetをコントロールする。
- Isetは、出力電圧Voutと負荷電圧Vloadで表すと、
Iset = (Vout - Vload) / Rset
Vout = Vload - Vset
Iset = - Vset / Rset
- PSoCのINSAMPは、x1のオペアンプを構成できない。
- でも、SCBブロックを使って、x1のDiffAmpを構成することは可能。
- この基本回路を、PSoCのDiffAmpで構成する。
- VsetをDACで生成して、DiffAmpの負入力へ
- DiffAmp出力を、バッファで外部出力、
- 外部に接続した設定抵抗Rsetを通して、負荷抵抗Rloadへ
- さらに、DiffAmpの正入力に接続する
- VloadRef →負荷抵抗の接続先の電圧
- Vss,Vdd,そしてAGND等に接続可能だが、
- それぞれの電圧で出力電圧範囲が異なる。
Vss <= Vset+AGND <= Vcc
Vss <= Vload <= Vcc
Vload = VloadRef+Iset*Rload
- VloadRefをVccにセットした時、Rloadに電流を流し込む事や、
- VloadRefをVssにセットした時に、Rloadから電流を引くのは難しい。
Vout = VloadRef+Iset*(Rload+Rset)
- 動作範囲に関しては、式をそのまま書いただけ。ちょっと自信なし。
- VloadRefをGndにして、
- Rloadを、0〜300Ω
- Vloadが0〜1.2Vとなる様に、Isetは4mAとする1
- Vsetを-1.26Vとすると、Iset=-Vset/Rset=4mAから、Rset=316Ωとなる。
- PSoCの接続の都合で、DiffAmp入力はPort2になってしまうが、
- Port2が使えない場合は、x1のPGAを介して入力すれば良い。
- 但し、以下のようにVloadの入力電圧がシフト2するので、注意。
Vss+0.5 <= Vload <= Vcc-1
- このシフト分をキャンセルする簡単な方法として、
- 130Ωの抵抗Rshiftを、Rloadと直列に接続する(Rshift*Iset=130Ω*4mA=0.52V)
Vload: 0.53〜1.76V
Vout: 1.82〜3.02V
- ということで、1個の抵抗を外付けするだけで、
- PSoC1でも定電流源を構成することが出来る様だ。
- ここまでがAN2089の内容だが、実際どうなのか、やってみようと思う。
1これは、Isetを4mAとするためにVloadを0〜1.2Vとしたのかもしれない。
2何故、0.5Vシフトするのか、理解していないんだけど。。
[top]
- AN2089の、Figure9の構成
- DiffAmpの入力を、Port0から取れるようにPGAのバッファを入れる。
- 各モジュールをスタートして、DAC出力を約1.24Vに設定するだけ。
- ブレッドボードで組んでみる
- P0_4から330ΩでP0_2に接続、さらに330Ω、130Ωを通して、GNDに接続するだけ。
- 電流が少ない場合、例えば1/10の定数でどうなるかやってみる。
- P0_4から3.3kΩでP0_2に接続、さらに5.1kΩ、1.3kΩを通して、GNDに接続するのも試してみる。
→Rset=3.3kΩ、Rload=5.1kΩ+1.3kΩの配線
- Rset=330Ω、Rload=330Ω+130Ω で、130Ωをショートすると Rload=330Ω
- 或いは、Rset=3.3kΩ、Rload=5.1kΩ+1.3kΩ で、1.3kΩをショートすると Rload= 5.1kΩ
- GNDにつながる配線を外して、電流計(METEX P-10)を挟んで測定。
- 330Ω+130Ωで約3.78mA、330Ωでは約3.79mA
- 5.1kΩ+1.3kΩで約378uA、5.1kΩでは約377uA
- 抵抗が変化しても、電流変化は僅かであり、いちおう定電流動作していることがわかる。
[top]
- 秋月で扱っている圧力センサMPS2407を、この定電流源で使ってみる。
- このセンサは、歪ゲージがホイートストンブリッジになっている
- 駆動電圧はTypで5V、駆動電流は1mA、ブリッジ抵抗は5kΩなので、
- 単純に5V直結で、定電圧駆動しても良いが、定電流駆動した方が精度が良いらしい。
- 実験回路で試した、1/10の定数、つまり400uA狙いの定電流駆動、
- P0_4・P0_2間に3.3kΩを接続、VGAのオフセット分の1.3kΩは省略する。
- 定電流源で、圧力センサに電流を流して、その出力をPGAを通して、差動入力のADCで取り込む。
#define DAC_124 (15) // Define DAC = 1.24V (AGND-1.26 = 1.24)
BYTE data;
PGA_1_Start(PGA_1_HIGHPOWER);
PGA_2_Start(PGA_2_HIGHPOWER);
PGA_3_Start(PGA_3_HIGHPOWER);
DiffAmp_Start(DiffAmp_HIGHPOWER);
DAC6_1_Start(DAC6_1_HIGHPOWER);
LCD_1_Start();
LCD_1_InitBG(LCD_1_SOLID_BG);
M8C_EnableGInt;
DAC6_1_WriteStall(15);
ADCINC_1_Start(ADCINC_1_HIGHPOWER);
ADCINC_1_GetSamples(0);
LCD_1_Position(0,0);
LCD_1_PrCString(">Pressure Gauge");
for(;;){
while(!ADCINC_1_fIsDataAvailable());
data = ADCINC_1_bClearFlagGetData();
LCD_1_Position(1,0);
LCD_1_PrHexByte(data);
LCD_1_DrawBG(1,3,13,data>>2);
}
- ブレッドボードに組んで、圧力を掛けてみると、ちゃんと出力が変化する。
- 但し、圧力センサ出力の変化がちょっと小さい気がする。
- 息を吹きかけたぐらいでは、出力に変化が見られない。3
→圧力をかけない状態
- LEGOのポンプをつないでみると、確かに圧力で値が変化する。
- 再現性はあるので、圧力の検出は出来ているのだろう。
→圧力をかけた状態
- 変化が小さいのは駆動電流が少ないためかも4しれない。
- 5V直結で、定電圧駆動した方が、出力が大きくなると思う。
- ちなみに、どれぐらいの圧力が掛かっているか測ってみると、0.1MPa(約1気圧)ちょっとぐらい
→センサの代わりに圧力計を接続する
- 秋月の圧力センサ、MPS-2407-015ADは、絶対圧15PSIで、最大負荷圧力は2Xとなっている
- つまり、15x2=30PSIってことかな? 15PSIは、約1気圧なので、2気圧まで掛けられるということだと思う。
- 測った圧力は差分だと思うので、最大負荷圧力ギリギリ(ちょっと超えるかも)ぐらい掛けている計算になる。
- とりあえず実験的には、都合が良い範囲の圧力を掛けている感じだと思う。
参考:1気圧 = 1013mbar(ミリバール)= 0.1013MPa5、1bar = 0.1MPa = 14.5psi
3サーバダウンで写真やプロジェクトが消えてしまったので、写真だけ撮り直しました。(140109)
4なにか間違っている気がしないでもないけど。。
5一般的には、従来使われていたミリバールに合わせて、hPa(ヘクトパスカル)が良く使われる。
[top]
[電子工作関連に戻る]