ちょっとTea Time!? PICの動作電圧を調べてみる。 2020.1.2
1.ことの始まり。
機器の動作電圧はどんどん下がっていて、ロジック電圧も昔は5Vが標準でしたが、今では3.3Vがほぼ標準です。
そのためコントロールにつかっているPICも最近ではほとんど3.3Vで動かすようになっています。
PICも低電圧化がすすんでいて、以前は最大5.5Vまで使えていた品種がほとんででしたが、最近よく使う高速・大容量の
PICは最大電圧が3.6Vのものが多くなっています。すなわち3.3Vで使えということなんでしょう。
で、低電圧化が進むのは時代の趨勢なのでいたしかたありませんが、結構課題になってくるのはかなり低い電圧でも
PICが動作してしまうということです。これの何が問題かというと最近の事例(ページの最後の方)では、
CDP → FESP5142 → DAC4499 → IV変換
という構成で接続したときに、最初に電源をONするときには問題ないのですが、FESP5142の電源は入れた状態で、
一旦DAC4499の電源を落とた後に、再度DAC4499の電源を入れても再起動できない問題がありました。
一旦、FESP5142も電源を落としたのちの、DESP5142とDAC4499の両方に電源入れると問題ありません。
何が起こっているかといえば、FESP5142からDAC4499にはPCM信号を伝送するために10Pのリボンケーブルが接続
されているのですが、それをつたって電力がFESP5142からDAC4499に伝送されているということです。
特段、リボンケーブルには電源ラインは設けていなくてクロック信号のみですが、DAC4499のロジックICの入力に信号が入ることで、
ロジックICのVDD端子に電圧が漏れ出て、それがロジック電源全体の電圧を上げてしまいます。
実際に上記の構成でDAC4499の3.3Vライン(ロジック電圧)を測定してみたら、電源を切った状態にもかかわらず1.2Vありました。
おそらくこの電圧がかかっていることによりPICが停止せず、動作したままだったのだと思われます。
そのため、そこから電源が投入されて電圧が上昇した場合には、PICは正規の電圧で動こうとするだけですが、
液晶表示器は一旦電源が落ちている状態なので初期化コマンドが送られていないので、表示ができないというわけです。
液晶だけでなくAK4499も初期化のコマンドをうけられなかったことになります。
ということで、PICの動作電圧とBROWNOUTについて調べてみました。
2.いきなり結果
PICを正規の電圧で動作させて、その後に電圧を低下させてPICの発振が停止する電圧を測定します。
それと、PICがリセット状態となるためのリセット電圧と、電圧ゼロから上げていき最低起動電圧を測定してみました。
BROWNOUT 設定なし #USE NOBROWNOUT |
BROWNOUT 設定あり #USE BROWUNOUT |
動作電圧 | 備考 | ||
PIC16F886 | 発振停止電圧 |
1.2V (=リセット電圧) | 4.0V | 作電圧 2V〜5.5V |
往年の標準品(?)最初はよく使いました。 |
起動電圧 | 1.84V | 4.0V | |||
PIC16F1938 | 発振停止電圧 | 1.4V | 1.87V | 1.8-5.5V | PIC16F886で容量が足りなくなって、こちらに移行しました。 |
起動最低電圧 |
1.63V(=リセット電圧) | 1.87V | |||
PIC18F24K20 | 発振停止電圧 | 1.18V | 1.83V | 1.8-3.6V | プログラム規模と高速化の流れから18Fシリーズも使うようになってきました。 |
リセット電圧 | 0.94V以下 | 1.83V | |||
起動最低電圧 | 1.65V | 1.83V |
結果からわかったことは、BROWNOUT設定なしだと、より低い電圧まで動作をつづけます。ただし、再起動にはすこし高い電圧が必要です。
すこしやっかいなのがPIC18F24K20です。一旦発振停止電圧まで下がっても、そこから電圧が上昇しても発振は開始しません。
一旦リセット電圧である0.94V以下まで電圧を落とさないと、再起動できないということがわかりました。
それに対して、BROWN設定ありだと、さきよりすこし高い電圧で動作停止しますが、再起動との電圧のヒステリシスはほとんどありません。
ことのはじまりのような問題をすこしでも低減させるために、BROWNOUT設定は「あり」のほうが良さそうです。
ただし、あくまで効果があるというだけで、回路の電圧が発振停止電圧以下に下がらないと意味はありまんので、
約1.8Vというのはすこし低いかもしれません。
3.結論としては
・BROWNOUT設定は「有り」にしたおいたほうが良さそう。
・ただし、あくまで電源投入は周辺機器もふくめて同時に行うことが前提となる。
ということかな〜。
4.補足
PICの発振停止電圧を今回測定しましたが、その電圧に近づくと発振周波数は低下します。
参考にPIC18F24K20を64MHzで動作させた場合の、電圧と発振周波数の関係は以下になります。
2.3Vくらいまでは、がんばって64MHzで発振してくれるようです。
5.更なる対策?
PICには自身の電圧を検知して割り込みをかける機能があります(設定電圧はプログラムで指定)。
3.3V動作品の場合3.0V以下で割り込みをかけることもできるので、それを使えるようにしたほうがいいかも知れません。
とううことで、こういった割り込みプログラムを考えてみました。
#include "18F26k20.H"
#fuses INTRC_IO,NOWDT,NOMCLR,BROWNOUT,PUT
#use delay(internal=64MHz)
#define GOOD_VOLT (1)
#define BAD_VOLT (0)
int lowvolt_status=GOOD_VOLT;
#INT_LOWVOLT
lowvolt_isr()
{
disable_interrupts(INT_LOWVOLT);
if(lowvolt_status==GOOD_VOLT){
setup_low_volt_detect(LVD_30 | LVD_TRIGGER_ABOVE); // wake up at Vcc>3.0
lowvolt_status=BAD_VOLT;
enable_interrupts(INT_LOWVOLT); }
else reset_cpu();
}
main() {
setup_oscillator(OSC_64MHZ);
output_drive(PIN_B0);
delay_ms(500);
//
// interrupt if Vcc < 2.6V
setup_low_volt_detect(LVD_26 | LVD_TRIGGER_BELOW);
enable_interrupts(INT_LOWVOLT);
enable_interrupts(GLOBAL);
//
// main routine
// while(1){
if(lowvolt_status==BAD_VOLT) while(1){}; // if you want to stop program
in low voltage
}
}
多分、なにが行われているかわかりにくいと思いますが、ポイントは
・電圧が2.6V以下に下がったら、次に3V以上にあがったときにCPUをリセットする。
というものです。これだと、電源を切って一旦2.6V以下に下がればいくらCPUが止まっていなくても、次に3V以上
になった場合には一旦リセットがかかります。
また極端に立ち上がりの遅い電源の場合では、CPUの電圧が3Vを越えた時点で再度一回リセットがかかるようになります。
これなら、BROUNOUTだけでなくより確実にCPUにリセットをかけられるでしょう。
さらに調べると・・・・
どうやら近年のPICはBROWNOUTの電圧の設定ができるようです(ひょっとしだだいぶ昔から?)。
例えばプログラムの一文に下記を入れておけば、3VがBROWNOUT電圧になるようです。
これなら、一発で済みますね。
#fuses INTRC_IO,NOWDT,NOMCLR,BROWNOUT,BORV30,PUT
ただ、3Vだときついかな?ひょっとしてそのくらい電圧が下がるかもしれません。
設定範囲としてはBORV30,BORV27,BORV22,BORV18から選べるようなので、
2.7Vあたりが妥当かな?
いや!電源のことだから厳しくいきましょう!(笑
ということで3Vとしましょう。これから、新しいPICをつかうときは、この呪文を入れるように覚えておきましょう。
(おしまい?)