2017年8月31日木曜日

デジタル入力、出力 初級 実践編

では、実際にデジタル入力とデジタル出力を繋いでみます。
例として使用するのはArduino UNO
https://store.arduino.cc/usa/arduino-uno-rev3

0.資料の入手
まず何はともあれ必要なドキュメントを入手します。
上記サイトの
 DOCUMENTATION → SCHEMATICS IN .PDF から回路図を
 DOCUMENTATION → PIN MAPPING ATmega328P からpin配置を
入手してください。
pin配置の図にはAtmega168となっていますが、Atmega328Pと同じ配置なので気にする必要はありません。

http://www.atmel.com/ja/jp/devices/atmega328p.aspx
次に上記のサイトからAtmega328Pのデータシートを入手します。
ATmega328/P Complete  の横のアイコンをクリックして入手してください。

ATmega328PというのがArduino UNOで使用されているマイコンです。
回路図の右側の大きな四角(ZU4)がそれに当たります。

データシート等を入手するときは回路図に記載された部品の名前を検索するといいでしょう。

デジタルピン0, 1は他のICが繋がっていてややこしいので、
今回はデジタルピン2(PD2)と3(PD3)を繋いでデジタル信号をやり取りするケースを考えます。

1.内部回路

図18-1が内部回路の等価回路です。
ATmega328Pはプログラムで入力/出力を切り替えられるのでPD2もPD3も同じ回路と考えてください。

Pxnと書かれた四角がICの内部から外部に繋がる個所、
また右側のLogicと書かれた個所がICのさらに奥に繋がる個所です。
これより先は特に気にする必要がないため記載がありません。

右のRpuがプルアップ抵抗
プログラムから使用/未使用を切り替えられるのでFETがついています。
今回はおそらくプッシュプルの出力のため使用しません。

Cpinは高速でHi/Loを切り替えるようなときに影響してきます。
コンデンサに電荷をチャージする分、切り替えが遅れます。
今回は気にしなくても大丈夫です。

左のダイオード二つは静電気等から守るためについています。
電源電圧5Vよりも高い電圧やGNDよりも低い電圧が入力された場合、ダイオードを通して電流が流れることで回路の破損を防ぎます。
常に大きな電流を流していいようなダイオードではないため、長時間流れると壊れてしまいます。


続いて表18-1
プログラム内部でどのように設定するとどのような動作をするか記載されています。
HiもLoも出力でき、Hi-Zも設定できることがわかります。
つまり入力側でプルアップ抵抗を設定しなくとも動作します。
今回はプルアップ抵抗なしで設計します。

2.外部回路
前述のとおりプルアップ抵抗は不要ですので、そのまま繋げるだけとなります。

これで内部回路も含めて回路が明らかになったと思います。
わかりづらい場合、入出力をつなげた回路を紙に書き出してみるといいかもしれません。

3.絶対最大定格


32.1 Absolute Maximum Ratingsが絶対最大定格です。
Voltage on any Pin except RESET with respect to Ground が各ピンに入力してもよい電圧となります。
-0.5V から VCC+0.5V まで入力しても大丈夫です。
VCCは電源電圧で回路図のVCCと書かれたピンに入力された電圧です。


出力ピンの出力電圧は表32.2からVOL(Output Low Voltage)およびVOH(Output High Voltage)を確認します。
VOLの下限、VOHの上限が規定されていませんので内部回路から想像してGND, VCCまで出力されると考えてください。
絶対最大定格に対して-0.5V, +0.5Vの余裕があるため問題なしです。
入力側のICと出力側のICの電源が違う場合や6Vなど絶対値で規定されている場合は電源の精度も含めて計算してください。

DC Current per I/O Pin が各ピンが出力していい電流になります。
DC Current VCC and GND Pins にも注目してください。
こちらは電源ピンの電流の規定となります。
40mAの出力を5本利用したとしましょう。
合計は200mAとなりますが、この電流は電源ピンから入ってくるため、電源ピンの電流は200mA+αとなり絶対最大定格を超えてしまいます。
今回は出力にはデジタル入力が接続されているだけですので
プルアップ抵抗などがある場合はそちらに流れる電流も計算します。


表32.2からIIL(Input Leakage Current I/O Pin), IIH(Input Leakage Current I/O Pin) を確認します。
それぞれLo, Hiの時の入力電流となります。
ともに1uAなので問題ありません。

4.入力閾値


絶対最大定格を確認した時に使用したVOH(4.1V~VCC), VOL(GND~1.0V)がVIL, VIHの範囲内に入っているか確認します。
このとき、電流の条件が合わない場合、条件の悪い方に合わせます。
条件が記載の条件より悪い場合や設計が成り立たない場合は33項以降のグラフから値を補正します。
(今回は問題がなく、説明もややこしいので今回は割愛)

Loと認識する範囲はVILから-0.5V~0.3VCC
Hiと認識する範囲はVIHから0.6VCC~VCC+0.5V
その中間の値はどちらでもない、どちらと判定されても文句言えない範囲と認識してください。
ここでVCCの精度を調べる必要がありますが、説明の簡略化のため5V±0.1Vとします。

VCC=4.9Vとすると
VILは-0.5V~1.47V
VIHは2.94V~5.4V
VOH, VOLはVIH, VILの範囲に入っているので問題ありません。

VCC=5.1Vとすると
VILは-0.5V~1.53V
VIHは3.06V~5.4V
同様に問題ありません。

これでとりあえず動くレベルの回路計算は完了です。
業種に寄りますが実際は省略する部分もあります。
(理解していないと省略もできないですが)

2017年8月30日水曜日

目次のようなメモ

プログラムはやりたいことで検索するけど
回路は部品で検索するのでわけわかんないよねと言う話
足していって目次にしよう

・デジタル
デジタルの信号をやりとりしたい → デジタル入力、デジタル出力

・アナログ
センサなどのアナログの信号を入力したい → アナログ入力
アナログの信号がある値以上であるか判別したい → コンパレータ
アナログの信号のノイズを取り除きたい → フィルタ
アナログの信号を出力したい → アナログ出力
アナログの信号の大きさを変更したい → オペアンプ

・電源
ある電圧を出力したい(高精度、微少電流) → シャントレギュレータ
ある電圧を出力したい(高精度、少電流) → シリーズレギュレータ
ある電圧を出力したい(低精度、大電流、高効率) → スイッチングレギュレータ

・基本的に覚えておかないといけない事
オームの法則
パスコン

2017年8月29日火曜日

デジタル入力、出力 初級

まずはデジタル入力、出力の設計のやり方を紹介します。
え?アナログ回路やるのではないの?とお思いかもしれませんが、これもアナログ回路です。
基本的に基板上の物は全部アナログ回路です。
一般的にデジタル回路と言うのはFPGAやCPLDのようなプログラマブルなICやマイコンのようなICの中身を指します。
またデジタル回路の設計はハードウェア記述言語(HDL)を使用して設計します。

一見そんなこと簡単だろと思われるかもしれませんが、
『デジタル出力をデジタル入力に繋いで完成』
……というわけには行かないのです。
以下にざっくりと手順記載します。
間違ってること、不足していることもあるかもしれないので補足や指摘いただけるとありがたいです。


1.内部回路を調べる。
ICのデータシートやマイコンのハードウエアマニュアルを確認して内部回路を調べます。



出力側は大まかにこの5種類の回路。
FETがトランジスタになっている物もありますが特性が異なるだけで基本は同じです。

1番左がプッシュプルタイプ
VDDに繋がるFETがONするとHiを、OFFするとLoを出力します。
また両方OFFの状態をHi-Z(ハイインピーダンス)と呼びます。
消費電力を減らしたい場合や入力と出力を一つの端子で行いたい場合(バスなど)で使用します。
両方ONは壊れるので出力出来ません。

2番目、4番目がそれぞれプルアップ、プルアップと呼びます。
片方のFETが抵抗に変わっています。
抵抗ですのでHiLoが切り替わる速度はFETよりも遅いですが、FETを使用するよりも低コストで作れます。

3番目がオープンドレインやオープンコレクタと呼ばれます。
5番目がハイサイドスイッチ。
2番目、4番目の抵抗が外付けになった形です。
外付けの部品が増えるので少し面倒ですが、複数の出力を一つの入力に接続することが出来ます。
HiをFETで出力するICとLoをFETで出力するICが同時に存在すると、多大な電流が流れて壊れますが、この場合はHiかLoが抵抗になるので壊れない。



入力側は基本的に1種類ですが内部でプルアップやプルダウンが出来るようになっている場合があります。


2.外部回路
内部回路がオープンドレインやオープンコレクタの場合、プルアップ抵抗を接続する必要があります。
またハイサイドスイッチの場合はプルダウン抵抗を接続する必要があります。

プッシュプルの場合はどちらも付ける必要はないのですが、ノイズ対策や途中のコネクタ等の故障を考慮して、プルアップ抵抗やプルダウン抵抗を入れる場合があります。
少しめんどくさい話なのでここでは割愛。


3.絶対最大定格(Absolute Maximum Ratings)
各ICの電源ピン、入力ピン、出力ピンの電圧が絶対最大定格を越えないことを確認します。
特に注釈がなければ一瞬でも越えてはいけないと考えてください。
Hi/Loの切り替え時などにオーバーシュートにより本来の出力電圧よりも上がることがあるので多少の余裕を持ってください。
オーバーシュートについては別途説明します。

電源電圧は誤差も考慮して考えます。
電源電圧が5V±10%とすると、出力電圧は5.5Vまで上昇します。
つまり繋がれた入力ピンの絶対最大定格は5.5V以上必要となります。


出力ピンの出力電流が絶対最大定格を越えていないことを確認します。
接続された入力ピンのinput currentやプルアップ抵抗、プルダウン抵抗に流れる電流の合計が出力ピンの出力電流となります。
Hi, Loそれぞれ計算し、電源電圧は誤差を考慮して出力電流が一番大きくなる値を使用します。


4.入力閾値の確認
Hi出力時の電圧(High-level output voltage)の下限が入力電圧(High-level input voltage)下限より大きいことを確認します。
Lo出力時の電圧(Low-level output voltage)の上限が入力電圧(Low-level input voltage)上限より大きいことを確認します。
出力電圧は電源電圧に大して何V少ないかと定義されている場合があるので注意してください。
もちろん電源電圧は誤差を考慮する必要があります。
output voltageはいくつかの出力電流に分けて定義されていることがあります。
実際の出力電流より大きい物を選んでください。


これだけのことを考慮して設計すれば簡単なデジタル入出力は動くと思います。

【メモ】中級以降で書きたいこととか
・オーバーシュート、アンダーシュート、リンギング
・プルアップ、プルダウンの決め方
・バス、タイミング
・異種電源、ラッチアップ
・実際になんか回路を書いてみる
・もうすこしわかりやすく

アナログ回路の書き方

電子工作だmakersだIoTだと最近この界隈が賑やかに感じます。
色んな職種の方が好きなことやって楽しんでるようで見てるこっちも楽しいです。
でも電子回路のことはわからない。
調べてもよくわからない。
そんな話をよく耳にします。
初めからAruduinoやRasberryPiに接続する前提で作られた既存のシールドやモジュールを使用する分には電子回路の知識は必要ありません。
しかし他のICを使いたいときや少し高度なことをするとすぐに電子回路の知識(特にアナログ回路)が必要になってしまいます。

少し閑話休題で、アナログ回路のエンジニアってどうなのって話を……
・電気科出身の新人がアナログ回路を書けないことが多い
・他の分野からアナログ回路に転向したなんて話はあまり聞かない
・他の分野に転向した、文系職になったなんて話は結構聞く
・アナログ回路書けない電気電子のエンジニアって結構いる
・アナログ回路のエンジニアはITや機械に比べて少ない

脅すようになりますがアナログ回路は難しいんですよ。
・数学が必須
・やること、考えることが多い
・電気以外の知識も必要
・他人の回路の影響を受ける(直接繋がっていなくても)

そんでもみんなアナログ回路勉強しましょうと言いたい。
おもしろいから。

というわけで、ちょっとアナログ回路の書き方みたいなことをまとめてみようと思います。
とりあえずはつらつらとブログにまとめていって、ある程度まとまったら体系立ててどっかに整理します。
間違っているところとかあればコメント頂けるとありがたいです。

いきなり難しいこと書いてもしようがないので、
当面の目標としては新人さんが先輩に怒られないレベルで書きたいと思います。

最後になりますが、一言
【緩募】仕事

最近の充放電

充電上がりの温度が極めて低いCCCVΔV充電
電池寿命は温度に依存するなんて小耳にはさんだりもします
果たしてどうなのでしょうか

といわけでひたすら充電を繰り返すこと100回
やっと結果がでたのでまとめてみたいなと思います
と言うわけで凄い適当画面キャプチャですが結果

充電設定(ΔV):2A 6mV
充電設定(CCCVΔV):2A 6mV 3.24V@0.8A で終了
放電設定:3A 2V@0.8Aで終了
割と普通な設定だけ思います


まず内部抵抗
左下のグラフです
誤差が大きくてわかりにくいですが基本的にΔVの方が内部抵抗が小さい
これはあまり冷却時間を取っていないので温度の差が出たのかと思います
同じ温度条件ではCCCVΔVの方が低いです
100回充電した後でも大きな変化は見られません

容量(電力)
真ん中のグラフです
電力換算に換算したのが右のグラフ
両方とも20回くらいの充放電で立ち上がり劣化に変わります
CCCVΔVの方が劣化が早い
つまり熱よりも過充電による影響で劣化するのだと思われます
CCCVΔVはレースに限定し、電池起こしはΔVで行った方が良いでしょう
回数としては20回くらいと思いきや実はそうとも言い切れないのです

電池電圧
今回一番注目すべき右上のグラフです
電池電圧は充放電を行うと上がり続けます
100回に到達してもまだ上がり続けます
つまり容量を捨て慣らしつづければ(僅かですが)電圧を上昇させることが可能です


続いて20回目と100回目の放電特性の比較


前述の通りですが、
初期の電圧は100回目の方が高く
後半の電圧は20回目の方が高いと言う結果でした


ここからの方針ですが
電池の起こし方を変えてみようかと思います
いかに容量を減らさずに
いかに電圧を上げていくか
なんかそんな感じで