« BeagleBone Blackを試す (5) | トップページ | BeagleBone Blackのハードウエア不具合 »

2014年2月23日 (日)

勝手に正誤表: 「BeagleBone Blackで遊ぼう!」

標題の書籍 [Kindle版] を買ったと以前の記事に書いた。

リンクを貼っておきながらこう書くのもナンだが、色々と期待ハズレがあった。それにも増して「これはマズイだろう」と思える外付け回路が記載されている。

期待ハズレは私が勝手に期待を膨らませた結果なので仕方が無い。しかし「マズイ」と思える内容を放置するのはやっぱり「マズイ」ので、「私ならこうする」と言う意味の代替案を提示してみる。

あくまで個人的な代替案だ。私が作るなら間違いなくこのようにすると確信できる水準までしっかり検討したつもりだが、それが完全で誤りが無いことを保証することはできない。実際に使われる場合は各自の責任で再確認していただくようお願いする。

/*-----------  -----------*/

トランジスターを使ってLEDを点滅する回路

Led_tr

「書籍の図5」は電流増幅作用の説明図そのものだ。私は随分永いこと半導体回路と付き合っているが、LEDを点滅させるのにこの様な回路を使っている例を見たのは初めてだと思う。一般論として、この回路の「マズイ」点は以下の通りである。

  • コレクター電流のバラつきが大きい (hFEのバラつきがそのまま反映される)
  • コレクター電流の温度変化が大きい (hFEの温度係数とコレクター・ベース間の漏れ電流の変化がそのまま反映される)
  • コレクター損失が大きい
  • 熱暴走する可能性がある

「代替案」は常識的な飽和スイッチ回路だ。hFEに依らずコレクター電流の値は一定なので、GRクラスに限らず2SC1815なら何でも使える。ただしLEDの順方向電圧のバラつきと温度変化の影響を受けるが、コレクター電流の変化幅は「書籍の図5」よりも小さい。

なぜ常識的な回路にしなかったのか未だに理解できないが、正常動作時について検討してみると「書籍の図5」の回路は意外と実害が無い事が分った。

検討の前提は以下の通りだ。

対象 項目 想定値 単位
2SC1815GR 直流増幅率 最小:200, 標準:300, 最大:400 (接合温度=25℃) -
直流増幅率の温度係数 +0.5 %/K
コレクター・ベース間漏れ電流 0.1 (接合温度=25℃) µA
コレクター・ベース間漏れ電流の温度変化率 接合温度が10K上昇する毎に2倍 -
コレクター・エミッター間飽和電圧 0.1 (全温度範囲) V
接合-周囲間の熱抵抗 250 K/W
LED 順方向電圧 最小:1.8, 標準:2.1, 最大:2.6 (周囲温度=25℃) V
順方向電圧の温度係数 +4 mV/K
接合-周囲間の熱抵抗 200 K/W

この内コレクター・ベース間漏れ電流は耐圧ギリギリの60Vの電圧を加えた時の最悪値で、厳し過ぎる条件だと思う。しかし今回の動作条件に合った漏れ電流の最悪値について信頼できる情報が無いので、安全サイドの前提として採用している。

ブレッドボード上で動作させる場合を想定して、周囲温度5℃、25℃、および40℃について計算してみた。

項目 周囲
温度 [℃]
書籍の図9 代替案 単位
最小 標準 最大 最小 標準 最大
コレクター電流 5 6.1 9.3 12.5 8.6 10.4 11.6 mA
25 6.8 10.3 13.9 8.9 10.7 11.9
40 7.4 11.2 15.2 9.1 11.0 12.1
コレクター損失 5 18.5 27.9 37.5 0.9 1.0 1.2 mW
25 20.6 31.1 41.7 0.9 1.1 1.2
40 22.3 33.7 45.2 0.9 1.1 1.2
接合温度上昇
(接合温度
   - 周囲温度)
5 4.7 7.0 9.4 0.2 0.3 0.3 K
25 5.2 7.8 10.5 0.2 0.3 0.3
40 5.6 8.5 11.4 0.2 0.3 0.3

「代替案」のコレクター電流変化は25℃基準で-20~+13%であるのに対して、「書籍の図5」は-41~+48%と変化幅が大きい。またコレクター損失は最大38倍で、接合温度が周囲温度よりも10K前後上昇している。しかし回路全体の電力消費を考えると「代替案」のR3で発生している電力消費がトランジスターに移っただけである。また計算結果から熱暴走の兆候は見つからない。厳し過ぎる漏れ電流を前提にして計算した結果がこうなので、現実にはこの温度範囲で熱暴走が起こる可能性はほとんど無いと言えるだろう。

コレクター電流の変化が「マズイ」と言うべき水準なのかどうかは、仕様としてどの程度の差異を許容するか、と言う問題である。LEDの最大順方向電流が20mA以上で (大抵の場合そうである)、書籍の本文の様に「しかし、あまり神経質になる必要も無く、中央値の300を使って計算しておけばたいていの場合は問題ありません。」と言った立場を取るなら「マズイ」水準ではない。しかしこれを結論にするのには違和感が残る。

なぜ違和感が残るのか? どうやらFoolproofになっていないことが一番「マズイ」と言うことらしい。

「書籍の図5」と「代替案」それぞれの回路で、電源を入れた状態で何かの拍子に2SC1815のコレクターとエミッター、またはコレクターとベースを短絡してしまった場合を考えて欲しい。これら端子の組み合わせは隣同士なので、何かの拍子に短絡してしまう事態は想定事故の範囲内だ。「代替案」の回路では短絡している間入力信号と無関係にLEDが点灯するだけである。しかし「書籍の図5」だとLEDが破損する可能性が高い。これは「代替案」のR3に相当する抵抗が「書籍の図5」には無いことによる差である。

また人体にプラスの静電気が帯電した状態でトランジスターのベースに触れたときにも同様のことが言える。

Esd

Esdgraph

ただしこの場合大きな電流が流れている時間が短いので1回の事象が直ちに故障につながらないかもしれないが、次第に劣化したり何回目かで故障したりするような、結構厄介なパターンの障害が発生しそうである。ただし「代替案」でもベース・エミッター間に短時間だが大きな電流が流れているから、帯電防止ストラップなどの対策が欠かせないとも言えそうである。

なお「代替案」のR2は省略可能だ。こうすると多少ノイズや漏れ電流の影響を受けやすくなるが、人間が目視するLEDを点滅させることだけが目的なら問題ない。こうすれば「書籍の図5」の回路よりも部品点数が1多いだけである。

私はウッカリ者なので、1~2の抵抗が節約できても Foolproofになっていない回路を選ぶ勇気は無い。

 

チャタリング対応のスイッチ回路

「チャタリング」は多分和製英語だ。英語の情報を探す場合はBounce (またはBouncing)、あるいは「チャタリング対策」の意味で Debounce (またはDebouncing) をキーワードにして検索する必要がある。

Sw_input

回路図に記入したHi/Loの値は、Pullup/Pulldownが無効になっている場合にGPIOが受け取るはずの電圧だ。これに対してGPIOの要求入力電圧レベルは、BBBに使われているSoC Ti AM3359のデータシートによれば以下の通りである。

Ds_eleccharac

  • VIH High-level input voltage ≧2V
  • VIL Low-level input voltage ≦0.8V

Loレベルは0.8V以下でなければならないから、常識的には「書籍の図9」の回路は動かない。「代替案」のようにしてRail-to-railの振幅を確保する必要がある。

もう一つ「マズイ」のはスイッチに流れる電流が小さ過ぎる事である。スイッチの電圧・電流定格には最大値と最小値があるが、後者は見過ごされがちだ (最小定格を表示していない製品があるのは困ったことである)。最小定格よりも小さな電流で使うとon状態が不安定になり、最悪の場合正常にonしなくなる。一般的な小信号用スイッチでは最小電流定格が1mAのものが多い。回路図に記載した電流値 (スイッチをonした直後→定常状態) の通り「書籍の図9」は1桁電流が小さ過ぎる。ただしキーボード用のスイッチには最小定格電流が10µAのものもあるので、この様なスイッチに限定するなら「書籍の図9」の回路でもスイッチに流れる電流に関してはOKである。

しかしなぜ「書籍の図9」の様に、明らかにLoレベルが高過ぎる回路にしたのか腑に落ちない。動作確認せずに原稿を書いているとは思えないので、何か事情があってこうなったと考えるべきなのかもしれない。見落としている条件がないか調べたら、入力を受けているP9.15 (GPIO_48) は起動時にディフォルトでPulldownされていることが判明した。

root@arm:/sys/kernel/debug/pinctrl/44e10800.pinmux# cat pins | grep 0840
pin 16 (44e10840) 00000027 pinctrl-single

PADレジスタに設定された値の下位8ビットの内訳は以下の通りで、

0x27 = 0b0010111
Bit
7 Reserved = 0
6 conf_<module>_<pin>_slewctrl = 0: Fast
5 conf_<module>_<pin>_rxactive = 1: Receiver enabled
4 conf_<module>_<pin>_putypesel = 0: Pulldown selected
3 conf_<module>_<pin>_puden = 0: Pullup/pulldown enabled
0-2 conf_<module>_<pin>_mmode = 111: Mode 7

Pulldownが有効に設定されていると確認できる。書籍で「PADコントロールレジスタのビットと意味」の表に「ビット3: プルアップダウン無効=0、 有効=1」とあるのはりだ。AM3359の信号線やレジスタのビットの名前は、正論理・負論理の違いを意識しない命名規則になっているので注意が必要である。

Pulldownがあれば「書籍の図9」の回路でも必要なLoレベルが確保できる可能性がある。しかし今度はHiレベルが確保できるかどうか怪しい。Pulldown/pullupの標準電流値は約100µAである。しかしこれは抵抗ではなく定電流ダイオードに近い特性だと考えられるのだが、電圧-電流特性の情報がないのでスイッチon/offでどのような電圧になるか正確に計算できない。ただしPulldownのある条件でも「代替案」の回路のLoレベルは0Vであり、Hiレベルは「書籍の図9」の回路よりも高い電圧になる。従って「書籍の図9」の回路で動くのなら「代替案」の回路はもっと確実に動くハズである。

しかし正確な状況の分らない回路を使うのは個体差で動いたり動かなかったりするおそれがあるのでマズイ。本来Pulldownを無効にすべきだが、書籍の構成上それはできない。この回路はDTO (Device Tree Overlay) を未だ説明していない場面で使われるのだ。こう言った制約がなければAM3359のGPIOに内蔵されたDebounce cellを使うべきだろう。先に紹介した最小電流定格10µAのスイッチなら、Debounce cellとPullupを有効にすればスイッチ以外に外付け回路は不要である。なおDebounce cellを有効にする方法として確認できたのはgpio-keysドライバーを利用するDTOを使うこと、および/dev/memをmmapして制御レジスタを操作することである。後者の方法を使う場合GPIO_DEBOUNCENABLEとGPIO_DEBOUNCINGTIMEレジスタに必要な設定を行うのに加え、CM_WKUP_GPIO0_CLKCTRLレジスタのOPTFCLKEN_GPIO0_GDBCLKビットおよびCM_PER_GPIOn_CLKCTRL (n=1..3) レジスタのOPTFCLKEN_GPIO_n_GDBCLK (n=1..3) ビットを1にセットする必要がある。

「代替案」のR3は、ラッチアップ防止のために必要かもしれない。詳細は覚えていないが、C-MOS ICの信号端子とVSSまたはVDDの間にコンデンサーを接続する場合、ラッチアップ防止のため電流制限抵抗が必要だと言う記述を以前見かけた記憶がある。その根拠となるシナリオは、「代替案」の回路に基づいて説明すると以下の通りである。

  • コンデンサー C は通常電源電圧まで充電されている
  • 何らかの理由で電源電圧が急に低下すると、GPIO端子電圧が電源電圧よりも高くなる状況が発生する
  • この場合R3が無いとGPIO端子からかなり大きな電流がSoCに流れ込む可能性があり、ラッチアップが起こり得る

このシナリオが疑われる事象を以前実際に経験しているので、ラッチアップの可能性がないか常に検討するようにしている。

この話を先に進めるにはラッチアップとは何か、またどうやって起こるかについて触れておく必要があるだろう。簡略化・一般化したI/O端子の等価回路は以下のようだと考えられる。

Gpio_example_3

AM3359の等価回路情報が得られていないのであまり正確ではないと思うが、重要なのは入力保護のためのクランピングダイオードや出力ドライバーの寄生ダイオードが存在していることだ。このためI/O端子の電圧がVSS~VDDの範囲を外れ、その差がダイオードの順方向電圧を超えると電流が流れてしまう。

単なるダイオードならラッチアップは発生しない。しかしC-MOS構造の場合、正確にはダイオードではなく2つの寄生トランジスターが存在し、それらがサイリスターを構成してしまっているためラッチアップが発生する。

Latchup1

話を簡単にするためインバーターの場合を示しているが、SoCのI/O端子も基本的に同じと考えてよい。ここでInput端子の電圧がVDDよりも0.7V以上高くなった場合を想定すると、

Latchup2

  • ➀ 寄生PNPトランジスターのエミッター・ベース間が順方向にバイアスされるのでInputからベースを経由してVDD、およびコレクターを経由して寄生NPNトランジスターのベースに電流が流れる。
  • ➁ 寄生NPNトランジスターのベース・エミッター間が順方向にバイアスされるので、Inputから寄生PNPトランジスターのベースに流れ込む電流が強化される。またInputの電圧が低下してもVDDから寄生PNPトランジスターのエミッター・ベース間が順方向にバイアスされ続ける。
  • ➂VDDから寄生PNPトランジスターを経由して寄生NPNトランジスターのベース・エミッター間を順方向にバイアスする経路が確立するので、VDD・VSS間に大きな電流が流れ続ける。これがラッチアップであり、電源の供給を止めない限り解消しない。

Input電圧がVSSよりも低くなった場合や、InputをOutputに置き換えた場合でも順番は異なるが最終的に同じ状態になる。ただし引き金となる電流にはラッチアップを起こすために必要な最小値があり、AM3359のデータシートによればJEDEC JESD78Dのテスト条件で45mAである。

Ds_absmax1しかし電流の波形によってはこれよりも少ない電流でラッチアップを起こす可能性があるらしい。

学会誌2003 Electrical Overstress: Electrostatic Discharge (Eos/esd) Symposium Proceedingsに掲載された資料によれば、引き金となる電流パルスの立ち上がり時間が短くなると、JEDEC JESD78Dのテスト条件ではラッチアップを起こさないデバイスでも比較的少ない電流、例えば16mA程度でもラッチアップを起こす場合があることが示されている。また立ち上がり時間が数nsの場合、パルス幅5µs以上あれば少ない電流でラッチアップを起こす場合がある。これらの数値がAM3359にそのまま当てはまる訳ではないが、傾向が似ている可能性を考慮しておく必要があるだろう。

今問題にしているシナリオは急な電源電圧の低下である。数nsの間に0.7V以上電源電圧が低下する事象が起こる場合がそんなにあるとは思えないが、絶対無いと言い切れるものでもない。悩ましい話だが、抵抗1本追加するだけなので悩むくらいなら対策しなさい、と言う事だろう。R3として1kΩを入れておけば、電源電圧の範囲でどのような電位の組み合わせになっても電流は最大3.3mAに制限されるので、ラッチアップのリスクをかなり減らせるハズである。

特別な制約を置かずに考えると、アナログ回路に頼らずGPIO内蔵のDebounce cellを使うのがベストだ。最小限の外付け部品点数で済むし、ラッチアップの心配もせずに済む。

 

LM61BIZをADCに接続する回路

ADC入力電圧が許容範囲を超えないようにする保護回路である。書籍では一通り保護回路を説明した上で、ダイオードの順方向電圧分は過電圧になる可能性が残っていることを認めている。「クランプダイオードで確実にADCの破損が抑えられるわけではありませんが、何も対策しないよりは安全になると考えておいていいでしょう。」と一節を結んでいるが、本当にそうなのだろうか。

Adc_input1残念ながら「書籍の図13」の回路は最もあり得る事故からADCを保護できていない。むしろADC以外に電源電圧1.8Vで動いている全ての回路を危険にさらす可能性がある。書籍でも言及されている想定事故だが、LM61BIZの隣接するピン2と3をショートしてしまったらどうなるか考えてみよう。

Adc_input2一般的な電源回路が出力電圧の上昇を抑える手段は供給電流を減らすことだ。そのため負荷が消費するのを超える電流が外部から流れ込んだ場合、出力電圧が制御できなくなる。今回の例に当てはめると、3.3V電源の電流供給余力が1.8V系の負荷電流よりも小さければクランプダイオードは期待通りの効果を発揮するが、3.3V電源の電流供給余力が勝っていると1.8Vレールの電圧が上昇しAIN電圧が3.3Vに到達してしまう。これがどちらに転ぶか負荷の状況などにより一概に言えないが、後者に当てはまる場合が少なくないのではないだろうか。

代替案ではLM61BIZ出力に抵抗を入れクランプダイオードに流れ込む電流を最大1mAに制限した。これにより1.8Vレールの電圧上昇はほぼ完全に防ぐことができる。また順方向電圧の低いSBD (Schottky barrier diode) を使ってクランプ時の過電圧を抑えるようにしたが、これでも完全にAM3359の定格を満足できていないので「不完全な代替案」である。

クランプダイオードの順方向電圧による過電圧がどの程度許容されるのか、少し詳しく見てみたい。

BBBのADCの入力電圧範囲は0~1.8Vで、それを超えるとADCが壊れると記述しているものをこの書籍以外にも多数見かけるが、これは半分誤りである。入力電圧範囲0~1.8Vは正常にAD変換できる範囲であって、これを超えても直ぐに壊れる訳ではない。

Ds_adc_input_range「Full-scale Input Range」は文字通りADCのフルスケールに対応する入力範囲の意味で、これを少し超えても正常に測れなくなるだけだ。壊れない範囲を確認するには「Absolute Maximum Ratings」を見る必要がある。

Ds_absmax2上から2番目の矢印「Steady State Max. Voltage at all I/O pins」が該当項目で、-0.5V~当該I/Oに供給された電源電圧+0.3Vの範囲はOKである。「当該I/Oに供給された電源電圧」は実際に供給されている電圧で、一番下の矢印の注意書きにあるように供給されている電圧がゼロ、つまり電源が供給されていない場合の許容電圧範囲は-0.5V~+0.3Vになる。なおこの図の最初の矢印「VDDA_ADC」はADCに供給してもよい電源電圧の最小/最大値である。これを含め規定の電源電圧が1.8Vの部分は2.1Vが最大許容値なので、「書籍の図13」の回路でLM61BIZのピン2と3をショートした時の1.8V電源電圧が2.6Vになるようだと完全にアウトである。AINが3.3Vになるのももちろんアウトだ。

本題のADC入力の許容電圧範囲だが、加えても壊れない最大値は電源電圧+0.3Vと言う事になる。つまりクランプダイオードの順方向電圧が0.3V以内ならOKである。今回選んだSBDは電流を2mA流したときの順方向電圧が0.26~0.33Vの製品だ。温度が低い場合も考えると、1mA電流を流した場合でも順方向電圧の最大値は0.3Vを超えると考えられ、残念ながらアウトである。もっと順方向電圧の低いSBDもあるが、それらは逆方向漏れ電流が多く、ADCの入力信号誤差が大きくなり過ぎるので使えない。

「Absolute Maximum Ratings」は通常1項目でも超えることは許されない。しかし今問題になっている項目「Steady State Max. Voltage at all I/O pins」も同様に考えるべきか、特に「不完全な代替案」のように電流が制限されている場合は多少緩和できる場合もあるのではないかと思える。つまりI/O端子の過電圧でデバイスが損傷する原因がラッチアップであるなら、電流を制限していれば問題にならない場合があるのではないか、と言う事だ。TI E2E Support Forumを探すとそう言う趣旨かもしれないと思えるスレッドが見つかったが、あまり明快ではないので、確実に大丈夫と言い切れる根拠としては弱い。今のところ多分大丈夫だが誰も保証できない代替案である。真剣にこの線を追求するなら自分でSupport Forumに質問を投げるべきだが、具体的なアプリケーションがないのにそこまでやる元気はない。悪しからず。

少し複雑になるが、1.8V動作のOPアンプを使えば「Steady State Max. Voltage at all I/O pins」を満足するようにできる。

Adc_input3ブレッドボードに組み立てる場合を考えDIPパッケージのOPアンプを選んだ。4回路入りなので、使っていない入力ピン (5, 6, 9, 10, 12および13) はAGNDに接続する。そうしないと消費電流が異常に増えたり動作が不安定になったりする可能性が考えられるからだ。

この代替案の場合OPアンプが1.8V動作しているので、よほどのことがない限りADCに過電圧を加える心配は無い。またこのOPアンプは最大入力範囲を電源電圧±1Vまで許容していて、入力電流の許容値も明記されているので、安心してこれで大丈夫だと言える。

Ds_mcp6004OPアンプの入力電流の最大定格は±2mAであるのに対して、前の図の回路では最悪でも±0.5mAに制限するようにしている。この回路は、D1およびD2の漏れ電流が充分小さければ信号源インピーダンスがかなり高くてもOKなので、汎用的なADCバッファとして使えると思う。

何か問題があるとしたらOPアンプの入手先が限られる事だろう。私はRSオンラインで見つけた。

DIPパッケージにこだわらなければ1.8V動作のOPアンプは多数見つかるが、許容入力電圧が電源電圧範囲±1Vとデータシートに明記されているのはMCP6004と同じMicrochip社の製品に限られるようだ。他に以下の様にTi OPAx314シリーズのデータシートには、

Ds_opa314「入力端子はプラスマイナス両方の電源レールにダイオードでクランプされている。電源レールを0.5V以上超えてスイングし得る入力信号は10mA以下に電流制限すべきである。」と明記されている。これならば「不完全な代替案」で未解決だった電圧は許容値を超えるが電流を制限するアプローチはOKだと判断できる。ただしこれは、このOPアンプに限ったことだ。AM3359にも当てはまる可能性は充分考えられるが、誰も保証していない推測でしかない。

ちなみに「代替案2」の回路でOPAx314シリーズを使うと、かなり汎用性の高い入力バッファになりそうである。データシートにクランプダイオードが内蔵されている旨明記されているのでD1とD2が省略できる。またR2とR1を1本にして値を10kΩにすると最大±100Vの入力電圧に耐えることができる。さらに常温付近の入力バイアス電流が最大±10pAなので、信号源インピーダンス10MΩでも誤差は最大±100µVだ。以上全て計算値であり試作してみないと確かなことは言えないが、ちょっとした計測器代わりにはなりそうである。

ADCを使うことにこだわらないなら、デジタル出力の温度センサーを使える。インターフェイスがやや特殊ではあるがMaximの1wirreデバイスDS18B20が最も旬ではないかと思う。もちろんI2CやSPIのデバイスもあり、用途により使い分ければよい話である。これらデジタル出力のデバイスは、アナログ出力のものと比べて高価である場合が多いが、同時に精度や分解能が勝っている場合も多いので充分に費用に見合った効果が得られるのではないかと思う。

特に何か前提を置かずに温度を測ることが目的なら、デジタル出力センサーを使うのが最も妥当なアプローチだろう。

 

今回のまとめ

書籍「BeagleBone Blackで遊ぼう!」に掲載された外付け回路の多くは「一応動く」レベルのものだ。何かの拍子に壊れたり、温度などの環境条件の変化や個体差で動かなくなったりするおそれがある。

これに対して今回勝手に「代替案」を提示してみた。見てもらって分っていただけると思うのだが、代替案はコテコテに作り込んだ複雑な回路ではなく、書籍に掲載されたものに最小限の変更を加えたものだ。それら変更は綿密な検討で裏付けたつもりだが、うまくいっただろうか。「これは一種の『神は細部に宿る』だ!」なんて言ってみたいものが、己の未熟さを痛感する結末が待っていそうである。

|

« BeagleBone Blackを試す (5) | トップページ | BeagleBone Blackのハードウエア不具合 »

BeagleBone Black」カテゴリの記事

IT」カテゴリの記事

趣味」カテゴリの記事

コメント

リクエストに応えて頂きありがとうございました!

内容がとても濃く、私のレベルでは1度読んだだけでは理解し切れませんでしたので、ゆっくりじっくり拝読させていただきます。

ありがとうございました。

投稿: BBB newbie | 2014年2月24日 (月) 13時06分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/543745/59187225

この記事へのトラックバック一覧です: 勝手に正誤表: 「BeagleBone Blackで遊ぼう!」:

« BeagleBone Blackを試す (5) | トップページ | BeagleBone Blackのハードウエア不具合 »