きっかけ
以前にも「0~3.3VでDCDCコンバータの出力電圧を変更する(昇圧MT3608)」という記事を上げましたが、これは、トランジスタのベース電流を制御することで、トランジスタ自体を可変抵抗としていました。しかし、この方法だと、抵抗の選定が難しい上に、可変抵抗に線形性がないため、自分の中で納得行っていなかったので、今回は他の方法を模索してみました。
ちなみにうまく行ったら100W LEDを使用したシーリングライトを作成しようと思います。
理論・手段
今回は可変抵抗を作成してという方法をやめて、マイコンによるフィードバックを行うことにしました。つまり、マイコンで出力電圧を計測して、DCDCコンバータの制御ICに電圧上昇・降下の指示を直接与えました。メリットとしては、
・様々なDCDCコンバータで単純な計算で実装可能
・アナログ出力(DAC)が無いマイコンでも使用可能
・制御プログラムが単純
があります。中でも、制御プログラムが単純なのがいいです。デメリットしては
・マイコンの処理速度によって出力の安定性が影響される。
・改造前に比べ出力の安定性が低い。
・様々な処理を同じマイコン込んで行う場合の遅延。
こんな感じです。特に、DCDCコンバータ制御ICのチップ内で行なっていた処理をマイコンで行う事による遅延を起因とする不安定化が心配です。
DCDCコンバータの制御ICに電圧上昇・降下の指示をする方法ですが、フィードバック用の端子に、基準電圧よりも高い電圧を与えることで出力電圧降下、低い電圧を与えることで上昇となります。
回路図
今回のUC3843Aはフィードバックの基準電圧が2.5Vとなっていました。そのため、ESP32からのH(3.3V)、L(0V)の信号に合わせて、H(2.6V)、L(2.4V)を出力するような回路を作成しました。
こんな感じです。メイン部分はR1、R2、R3、Q1、R4です。R5、U1、U2は保護回路です。FBは制御ICのフィードバック端子に接続します。ESP32はESP32からの制御信号です。V1は2.4、2.6Vを作成するための定電圧電源です。実機では、制御IC用の電源10Vを使用しています。C1はなんとなく入れただけです。
動作ですが、ESP32がHだとR3がショートとなり、FBの電圧が下がります。ESP32がLだとR3にも電圧が加わり、FBが上がります。単純です。U1はなにかの弾みでESP32が常にHになってしまったときへの備えです。33Vのツェナーダイオードなので、出力電圧が35.5V以上でFBが2.5V以上となり、電圧がそれ以上上がらないようになります。U2は先程の現象が起きたときにFBが5V以上にならないようにするためのものです。どちらもDCDCコンバータを壊さないための保険です。
改良点
ここまで書いてあれなんですけど、記事を書いている時点で何個も改善できる点があります。そもそもこんな回路いらないです。直接フィードバック端子にESP32の出力を入力すれば問題なく動くと思います。ってことで、省略版も作成してみました。
回路図(省略版)
省略版はこんな感じにしてみました。部品点数が一気に少なくなりました。ちなみに抵抗はもともと付いていたいたものを流用しています。ツェナーダイオードを追加しただけとなります。
実装
実装前に一度ブレッドボードで仮組みしました。抵抗値が少しでも異なると、電圧が変わってしまい、制御不能になってしまうのでちゃんと抵抗を吟味してからら実装するのをおすすめします。
実装はこんな感じです。
もともとフィードバック端子についている抵抗類を外して、新たに接続しました。
実装(省略版)
省略版じゃない方と比べるとほんとに実装部品が少ないです。面倒な抵抗の選定などもいらないため簡単お手軽です。
ESP32のプログラム
以前にArduino向けに作成した電圧・電流計測のコードの電圧部分だけ使用して作成しました。こんな感じになりました。電圧計用の値の部分は人によって数値が変わると思うので、気をつけてください。
#define BOOT_SW 0 //DevKit上のBOOTボタン
#define Blue_LED 2 //DevKit上の青色LED
#define DCDC 36 //DCDCの出力電圧を計測
#define conFB 4 //DCDCフィードバックに使用する出力端子
//電圧計用の値
const float inV1 = 18.03; //校正に使用した電圧1
const int V1_VALUE = 580;//校正に使用した電圧1の表示値
const float inV2 = 5.00; //校正に使用した電圧2
const int V2_VALUE = 33;//校正に使用した電圧2の表示値
//V = katamuki * VALUE + seppennを求める
const float katamukiV = (inV2 - inV1) / (V2_VALUE - V1_VALUE);
const float seppennV = inV1 - katamukiV * V1_VALUE;
//DCDC制御変数
float DCDC_V; //計測した電圧
float out_V = 26; //希望電圧
const float low_V = 17; //この電圧以下でシャットダウン
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(Blue_LED, OUTPUT);
pinMode(conFB, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
DCDC_V = katamukiV * analogRead(DCDC) + seppennV;
if(DCDC_V >= out_V || DCDC_V <= low_V){ //電圧を下げないといけない時(計測電圧>=希望電圧or最低電圧=>計測電圧)
//digitalWrite(Blue_LED, LOW);
digitalWrite(conFB, LOW); //省略版の場合HIGH
digitalWrite(Blue_LED, LOW); //省略版の場合HIGH
}
else if(DCDC_V < out_V){
digitalWrite(conFB, HIGH); //省略版の場合LOW
digitalWrite(Blue_LED, HIGH); //省略版の場合LOW
}
}
動作試験
負荷として100WなLEDを接続して実験しました。とりあえず、問題なく動きました。
プログラムを少し変えて電圧を25~28Vの間をゆっくり変化させる感じにもしてみました。
できた!マイコンで電圧を自由に調整できるDCDCコンバータが
— Unagi Dojyou (@Unagi_Dojyou) May 9, 2023
とりあえず25〜28Vで電子ホタルをしてみてる pic.twitter.com/c3ChKv8BjY
問題点
色々問題点が見つかりました。
・入力の電源容量が小さく、負荷が大きい状態で起動すると入力電圧が10V以下となり、フィードバックの電圧が常に2.4V以下となり、電圧を上げ続けようとしてしまう。電圧を上げようとしても入力電源の容量を超えてしまい、電圧が上がらず、抜け出せなくなる。
・低負荷時にちらつく。
1つ目は、省略版で解消できています。問題点は2つ目です。この減少自体はもともと発生していたのですが、この改造で更に悪化しました。この問題は省略版で説明します。
動作試験(省略版)
省略版では無いものからESP32の出力が逆になるので注意が必要です。こちらも動作はしました。
問題点(省略版)
問題点としては、
・低負荷時にちらつく。
・コイル鳴き?がうるさい
入力の電源容量が小さいと起動に失敗する問題は解消しましたが、リップルとノイズが酷いです。
リップルだけで0.6Vくらいあり、ノイズはかなりあります。省略前はここまでひどくなかったように感じるので、(よくわかんないけど)コンパレータに接続されている位相保証用のコンデンサが悪さをしてるかもしれません。
省略前もあった問題の低負荷時の安定性ですが、リップルが1Vもあります。原因はESP32の出力が0.1msずつと遅いからだと思います。オシロスコープで測定してみると、0.1msだけHIGHを出力しても電圧が上がらず、0.2ms間HIGHにすると電圧が上がりすぎてしまう、といった現象が起きていました。これが、高負荷時なら目ではわからないくらい早い周期で起こりますが、低負荷だと目でわかってしまうのでチラつきとなってしまっています。
この現象を防ぐには、ESP32をコンパレータとして動作させるのではなく、別にコンパレータをつければいいと思います。そうすると、アナログ出力を使用しなければいけませんが…
まとめ
制御には成功したので実験は成功しましたが、実用化はしないと思います。低負荷時の安定性が致命的な問題です。線形性は無いがCdSとPWMの組み合わせの方がいい気がします。プログラムに一工夫必要ですが…
終わりに
なんか、語彙力が死んでる+ちゃんと書く気力が起きなくて、非常にわかりにくい説明&文になってると思います。(そもそもこんな記事に辿り着く人がいると思えないのであまり問題にはならないが…) ちゃんと説明してほしいことがあったらコメントまで