私が、PICマイコンを使い始めたのは、およそ3年前。そして、現在にいたって、私は 一つの結論に達した。
「PICは、なんて言うか、化け物だね」 なんでだろ。ソケットに逆差ししたのに、クロック設定間違えて発熱させたのに。 生きてるよ。なんでだろ。MOSFETといい、PICといい、どうにも訳わからんくらいに 頑丈です。いや、他のマイコンとか知らないけどさ。
とりあえず回路設計資料HTML化プロジェクトと(勝手に)題して、己のダメっぷり を存分に外部に放出中の回路屋、kzが、PICマイコンの周辺回路について、ちょこっと だけ書いてみました。ちなみに、今回は16F8x、16F87x系ということで話を進めます。
Electrical Characteristics(電気的特性)えぇっと、とりあえず、基本になりつつありますが、データシートを見てください。 もちろん、英語マニュアルの方です。え?日本語版?なにそれ・・・
いや、存在を知らないわけではないのです。日本語版には、電気的特性が書いてません。 なので、英語版です。それだけ。
とりあえず、今はこれだけ。
- ● Voltage on VDD with respect to VSS : -0.3 to 7.5V
VSSに対するVDDの変動範囲を示しています。VSSが0Vである場合、 -0.3から7.5VまでVDDに加えることが出来るわけです。これは、 電位差について言っているので、たとえば、VSSが-5Vだとするならば、 VDDは-5.3から2.5Vまで加えることが出来るということになります。 その他のピンは、同じような文章で、VDDのところにそれぞれ、 "any pin", "MCLR","RA4"などと書かれた所に書いてあります。
- ● Maximum output current sunk by any I/O pin : 25[mA]
各I/Oピンが出力時に引き込める最大電流を示しています。 ポートを出力設定、値を0としたとき、 ポートに流れ込んでもよい電流の最大値を示しています。25mAといえば、 LEDですね。軽く点灯できます。えげつないですね。まったく。
- ● Maximum output current sourced by any I/O pin : 25[mA]
ポートを出力設定、値を1としたとき、 ポートから流れ出すことの出来る電流の最大値を示しています。 あれ?上と同じですか?同じなんですか?どうなってんですか? TTLなんて使ってた頃から見れば、信じられない話ですね。まったく
- ● PIC16F87X-20 VOLTAGE-FREQUENCY GRAPH
電源電圧と動作周波数の関係を表したグラフで、これを見ると、動作周波数が16MHzまでなら 電源電圧が4.0Vまで下がっても、動作できることを示しています。
リモコンなどの送信機は、基本的にバッテリーをもたせるために、動作周波数を低くしますが、 PIC16F87X-20だと、動作周波数を低くしても、電源電圧の変動幅が小さいので、しばらくすると 電源電圧の低下から、誤動作が頻発します。 PIC16LF87X-04だと、動作周波数を低くすると、電源電圧が2Vまで低下しても動作が保証されるので リモコン向きなのではないかと思います。
- ● VDD:の電源電圧の最小供給量 min と最大供給量 max
クロックのモードによって違いますね。XT(4MHz以下)だと4.0から5.5Vまでなのに、 HS(20MHzまで)だと4.5から5.5Vまでになってます。
っつーわけで、PIC周りの回路をさくっと作っていきましょか。
LEDを光らせる基本回路は次のとおりです。
図1 LEDを光らせるLEDに対して直列に抵抗とか付いてますね。なんでこんな値なんでしょうか。
LEDを光らせるためには、ある程度の電流が必要です。まず必要なのは電池(当然か) とりあえず直につなげても光ります。えぇ、光りますとも、びかーっと。えげつない 光量ですけど。LEDに流すことの出来る電流は限られています。電池を直付けしただけでは いったい何アンペア流れるかわかりません。なので、抵抗をはさんで、電池の電圧と LEDに流せる電流から抵抗を決定します。 LEDのデータシートを見ればわかるんですが、一般的に流れる電流は5〜25[mA]、 電圧はだいたい2V必要です。ここでは、2V、10[mA]で考えます。その計算は、
R = V / I = (5-2) / 10e-3 = 300[Ω] -> 330[Ω] (*) I = V / R = (5-2) / 330 = 0.0152[A] = 9.1[mA]なのでだいたい同じ * 計算した値の抵抗が無いときは、それに近いものを選ぶ時があります。 今回は、300Ωが無かったので、330Ωで代用しています。です。中学で習うような式ですけど、これから永遠に付き合う事となる、オームの法則です。 さる電気工学科の先生曰く、「全てはオームの法則で説明できる」だそうです。 この回路をそのままPICに対応させると、こんな感じになります。
図2 PICで光らせる
LEDをたくさん光らせたいです。光らせたいったら光らせたいんですっ!なんて駄々こねて 次のような回路作ってみました。
図3 燃える回路図名通り、燃えるかもしれない回路であることはわかるでしょうか?並列に接続された LED点灯回路には、PICのI/Oから供給される5V電圧が等しくかかります。だって、並列 接続なんだもん。だから流れる電流は、一つのLEDにつき10[mA]となるので、全体で80[mA]。 PICのI/O一つが流せる電流は、25[mA]なので、オーバーしてしまいます。 LED3個以上付いたらアウトですね。図3の回路でLEDを光らせるには、LED一個に流せる電流は
I = 25[mA]/8 = 3[mA]・・・かなり弱い光になる、ってかたぶん光らない。そんなときに便利な道具、 トランジスタなるものを召喚してみます。具体的には次のように使います。
図4 トランジスタでPICのI/Oと8個のLED点灯回路との間になにか変なものが付きましたね。これがトランジスタ です。
さて、トランジスタの詳しい説明なんてしてたら日が暮れます。なので、さくっと、 やわらかく、いるとこだけ。
トランジスタは、ベースとか言う端子に流した電流の何倍かの電流をコレクタと言う端子から エミッタとか言う端子へ流します。スイッチみたいなものです。 そんな機能をもってるんです。とりあえずこんだけの理解で、トランジスタは動きます。 今回は2SC1815とかいうトランジスタを使います。ちなみにこれは、NPN型という 種族です。ほかにPNP型とか言うのもいます。違いは、ベースから電流を引き込むか、 押し出すか、だけです。
では、ベースに流した電流をどれだけ増幅してくれるか?それは、hfeという もので決定できます。hfeは実験などで求める事も出来ますが、トランジスタを 眺めるだけでわかることもあります。トランジスタに"GR"とか"Y"とか記述してある かと思います。データシートには、電気的特性の下に"GR:200〜400"とか "Y:120〜240"とか記述してあるので見てみてください。hfeとベースを流れる電流Ib とコレクタ・エミッタ間を流れる電流Iceとの関係は次の式で表されます。
Ice = hfe × Ibここで、用いるトランジスタに"Y"と 印刷されているとして、hfe=120(最小値を使う)とします。では、図4で緑色に囲んだ 抵抗、何でこんな値なのか、計算してみますかね。
Ice = 10[mA] × 8[個] = 80[mA] Ib = Ice / hfe = 80[mA] / 120 = 0.68[mA] R = VDD / Ib = 5[V] / 0.68[mA] = 7.3[kΩ] -> 6.8[kΩ]で代用っと、このように計算していくと、PICから流すべき電流は たったの0.68[mA]。それだけでLED8個を同時に点滅できるようになりました。 この回路は、LEDのダイナミック駆動(注1)なる方法に応用できます。
リモコンには必須であり、もっとも遊べる部分。それがコントローラの 入力部だと思います。例年凝ったコントローラを作ってくる人が多いですが、やっぱり 入力部分(ジョイスティックとかポテンショメータとか使ったり)が一番凝りやすい ですね。外見も同じですけど(六法全書が、、六法全書がぁ〜)。ええっと、さて、 そんな入力部分ですが、ここでは、とりあえず、ぽちっと入力するもの(よくあるスイッチ) の回路について、少しだけ書いてみます。
さて、とりあえず、次のような回路を、何も考えずに作ってみる。
図5 スイッチを介してVDDにつなげるこの回路の問題点。わかりますか?スイッチを入れてる時はいいんだけど、 離した時はどうなるんでしょか?答えは、、、わかりません。だって入力ピンは どこにもつながって無いんだもん。じゃ、どうすりゃいいんでしょね?
そんなわけで、次のような回路を考えました。
図6 こんどは、スイッチ離したらVSSになるぞこれで、スイッチを入れた時はVDD、離したときはVSSで、ほら!、0か1かわかるじゃないですか! ってなわけで、 この回路に電池をつなぎ、いざ、入力スイッチを押してみます。瞬間、配線から煙が、煙がぁ! ・・・・まぁ、考えればすぐにわかる事なんですけどね。じゃあ、そうならない為には何が必要でしょうか?
先ほどの事故は、電源間がショートし、ものすごい電流が配線に流れた為、配線から熱が発生した結果、 燃えたんですね。要は、ものすごい電流が流れなきゃいいんです。電流を制限する 為に必要なもの、そう、抵抗です。じゃ、これならどうでしょうか?
図7 抵抗、入ったよはい、これで燃えません。この抵抗の事をプルダウン抵抗と呼びます。同じようにプルアップ 抵抗なるものもあり、こっちは電源の+側とI/Oの間に入れます。デフォルトで 入力の値をどちらにするかで変えていきます。 さて、このプルダウン抵抗、なんでこんな値なんでしょうか?
ここで、データシートの、VIL(Input Low Voltage)と、ILI(Input Leakage Current) を見てください。VILとは、入力ピンがLレベル(0の値)だと認識する電圧の事です。この 電圧以下をLレベルと認識します。データシートには同じ項目に二つの場合が 書いてあります。電源電圧 を限った場合と、全ての電圧範囲(Entire range)の場合です。ここでは、電源電圧を 5Vとするので、電源電圧を限った時の値0.8Vを使いましょう(全ての電圧範囲のところに ある式0.16VDDをVDD=5Vで計算したら出てくるんですけどね)。ILIは、ピンが入力モード の時、そのピンが何もつながっていない(ハイインピーダンスと言う)場合、そのピンから 流れ出す電流のことです。データシートには1μAと書いてあります。
さて、ここで私がしたい事は、図7のA点に流れるILLを抵抗に流し、A点の電圧をVIL以下 にすれば、スイッチを 離している時は、入力ピンはスイッチOFFを認識することが出来ます。では、実際に計算。
R = VIL / ILI = 0.8[V] / 1e-6[A] = 800[kΩ]すごい値ですね。まぁ要するにこの値より小さい抵抗値なら何でもよいのです。なので、10[kΩ] とかにしておけばよいです。この場合、
VIL = R × ILI = 10e3 × 1e-6 = 0.01[V]なので、確実に入力ピンはスイッチOFFを認識することが出来ます。
ちょっと余談
今やICは、CMOSとかいう、ほとんど電流を食わないトランジスタで構成されているので、 入力時の流れ出し電流はH/Lともに入力リーク電流という項目で表記されるようになりました。 学校の実験でいまだに使っているバイポーラトランジスタ(図4で使ったやつ) でできたICだと、入力時の流れ出し電流は、Lレベルで0.4[mA]、Hレベルで20[μA]だったので、 プルダウン抵抗を計算すると、500[Ω](余裕を見て330[Ω]にする)とかになってしまいます。 PICは基本的にCMOSで作られているので、図7みたいな抵抗値でも十分なのです。っていうか あまり小さい値だと、スイッチを入れたときにプルダウン抵抗に流れる電流が大きくなって 電力消費が激しくなります。
ほっとくと、泣き出します(嘘
いやまぁ、電源周りではいろんなことが起こるので、対処は必要です。まず、電圧変動という現象が起きます。これは、電源に電圧を供給している電池が 何らかの要因で一瞬電圧が低下した場合、PICは暴走あるいは挙動不審になります。 そんなときに便利なのが、この、"コンデンサ"なんですよ奥さん!
・・まぁ、夜明けも近いので、このテンションは許してください。 それはさておき、コンデンサを次のように入れます。
図8 コンデンサを、、図8の(a)は、何も対処しなかった時、電圧が突然変動した(あるいはノイズがのった) 場合の電源電圧の波形です。図8の(b)は、対処した場合の電源電圧の波形です。 もし、図8(a)の時、電圧がPICの動作電圧範囲より下がったら、PICは動作が不安定 になります。図8(b)の電圧変化はとても小さいですね。なんででしょうか?
大雑把に言うとコンデンサとは、電荷という、まぁ電気の素みたいなものを貯める事ができるので、 電圧が下がったら、コンデンサから電荷が供給され、電圧が上がったら、コンデンサに電荷が蓄えられます。
少し難しく言うと、コンデンサは高周波成分だけを通す 素子で、図8(b)の場合、瞬間的な変化が発生した場合、 その瞬間的な変化(高周波成分)だけをグランド(電池のマイナス側) に流すことが出来るんです。
このコンデンサのことを、バイパスコンデンサ(パスコン)といいます。どうでもいいですが、 何も知らない一年生に"パスコン"と言って、"パソコン"の事と勘違いさせて喜んでいるばか者です、 私は。
さて、他にもあるのですが、長すぎるので、とりあえず列挙しときます。自分で調べてみれ。
- 電源に電圧を供給するのに三端子レギュレータを使う
- 電源の逆ざし防止にダイオード
- 電源周りのノイズ除去にコイルをはさむ
いらないと思ったら、この節は飛ばしてください。さて、リセットは一番重要な行為なのですが、ロボコンの回路にはなぜかそれが省かれます。 いや、私だけかもしれないが、、
ここでは、リセットを行う外付け回路について書いてみたり。 さて、データシートの電気的特性の最初のほう、絶対定格あたりにこんな注意書きがあります。
Voltage spikes below VSS at the MCLR pin, inducing currents greater than 80 mA, may cause latch-up. Thus, a series resistor of 50-100. should be used when applying a “low” level to the MCLR pin, rather than pulling this pin directly to VSS.
"Voltage spikes"とか"latch-up"とか言ってます。訳わかんないっすね(注2)。結論としては、なんかいろいろ 危ないから、リセットピンをVSSに接続(Lレベルでリセットされるんです)する時は、50〜100Ωの抵抗 いれてね、と言うことです。実際には次のような回路を構成します。
図9 リセット回路なにかいろいろ部品がついてますね。一つ一つ見ていきますか。赤線でくるんだところは、 積分回路と言います。ローパスフィルタとも言いますが。図9の(a)に示したとおり、リセット端子にかかる電圧は、 なまった感じになります。何がしたいんでしょうね。
たとえば、電源の立ち上がり(目的の電圧になるまでの時間)がものすごく遅かったら、 PICは中途半端な電圧を電源に加えられるので、動作が不安定になります。そこで、 その中途半端な電圧の間中、ずっと、リセットがかかるようにすると言うのが、 この積分回路の役目です。でも、電源の立ち上がりがそんなに遅くない場合は、 PIC内部のすごい機能(注3)が何とかしてくれます。 この積分回路の抵抗値とかはどうやって決まったんでしょね?
積分回路の役目は、電圧の立ち上がりを遅くすることでした。では、スイッチを入れて から、電源電圧が立ち上がって、リセットピンがリセット状態から解放されるまでの 時間は何で決まるんでしょか?これは、時定数という値できまり、具体的には次の計算式 で求まります
t = R×Cうわ、簡単ですね、なんとも。たとえば、電源の立ち上がり時間が50ミリ秒だったとすると、
RC = 50[msec]となります。(注4)ここで、抵抗の値は、データシートにあるVILとILIで範囲が決まってしまいます。 リセットピンにもVILとILIが存在しちゃうんです。 VIL,ILILのリセットピン(MCLR)の項目を見てください。そこからVIL=0.2×VDD、ILI=5μA であることがわかります。よってRは、
R < (0.2 × 5)[V] / 5e-6[A] < 200[kΩ]となります。この値からコンデンサは、
R = t/C < 200[kΩ] C > t / 200[kΩ] > 50e-3[秒] / 200[kΩ] > 0.25[μF]と、値の範囲が決まります。とりあえず、0.33μFでも使っときましょう。だとすると抵抗値Rは
R = t / C = 50e-3[秒] / 0.33e-6[F] = 15.15[kΩ] -> 15[kΩ]になります。はぁ、やっとできた。
ちなみに青線でくるんだあのダイオードは電源を切った時に、コンデンサに残った電荷 を早くどこかへやって、リセットピンをLレベルにする為に入れています。
- 注1:
- ダイナミック制御は、LED表示機を複数つないで表示させるための方法です。
- 注2:
- Voltage spike)スパイク電圧は、瞬間的にVSS以下になる電圧が発生する現象の事で、 (Latch-up)ラッチアップは、CMOS内部の寄生サイリスタに微小電流が流れて、大電流 を流してしまう現象の事です。
- 注3:
- (Power on reset)パワーオンリセットと呼ばれる機能で、VDDが安定するまでリセット する機能です。
- 注4:
- 時定数とは、電圧が目標電圧の63.2%になるまでの時間を示すものなので、 電源の立ち上がりに50[msec]かかるとすると、リセットピンのHレベルと認識する電圧の最低値 (データシートより0.8*VDD[V])以下である時間が50[msec]である必要があります。今回の場合、時定数 RC=50[msec]としたので、電源電圧が立ち上がる頃は、リセットピンはまだ0.632VDD[V]であるので、電源 電圧が安定した状態でリセットが解除されると分かります。
誤動作の原因を、次の二つに分類してみました。
- 内的要因(プログラム、回路、機構の設計ミス等)
- 外的要因(ノイズ、外乱、動作環境)
はぁ、なんか堅苦しいな。そういや誰かこんな感じで考察した人がいたような気がするのだが。 まぁ、とりあえず、この二つについて、なんかそれっぽいことをちょこっと書いてみましたってのが この節です。
一つ実例を挙げてみます。
2002年ロボコンにおいて、S-kenマシンに搭載した回路には、大きなバグがありました。 それは、リモコンのスイッチを離したにも関わらず、マシンが動き続けるというものでした。
原因はいたって単純。受信側がリモコンからの信号を常に入力し、それに基づいてマシンの 動作を決定する、という仕様だったので、リモコンからの信号が途絶える、つまり、なにか 障害物などでさえぎられたり、角度等で信号が入らなくなったりした場合、マシンは動作を 決定できず、前の状態を維持し続けてしまいます。その結果、通信エラーが起きている間は、 ひたすら前の入力状態に基づいて、動作しつづけてしまったんです。
さて、まず、最初にこの現象に気づいた時期が、地区大会一ヶ月前。まずは普通にびっくりして、 それから「受信状態が悪い」とか、「ノイズのせいだ」とか、いろいろと憶測しながら、 原因を探しました。そして、実は通信エラーが起きた時、受信信号を再度読み込む為に、ループ しつづけている際に、モーターへの制御信号がそのままになっている事に気づきました。
なら、通信エラーしたらモーターを止めればいいじゃないか、と考えたものの、そうすると、通常の 通信時にたまに発生する通信エラーの時でもモーターを止めてしまうので、操作性の低下、さらには 操作できない、といった状態になってしまいます。結局、改善の無いまま、地区大会に 出場する事となってしまいました。
っで、これを改善するのに、タイムアウト処理を用いて、ある一定時間以上通信エラーが発生 すると、モーターを止めてしまうようにしたのが、2003年ロボコンマシンの回路でした。
何かあれば、即モーターを停止する、モータ制御信号はプルダウンしておく等々、常に安全な方向 に動作が向かうように設計する事で、内因的な問題により発生する誤動作は防げると思います。
電源電圧
実例としては、電源電圧の低下です。
電池は減ります。この単純明快な事実に、結構気づかなかったりします。 いや、私だけかも、、
ええっと、回路が出来て、実験を何度か重ねるうち、突然、誤動作する時、 まずは、バッテリーの残量を調べましょう。ぶっちゃけ、誤動作のほとんどが、 電源電圧の低下でした。PICの動作範囲は、データシートの電気的特性に 動作周波数と電源電圧のグラフで示されていますが、これに示される 範囲を出てしまうと、当然、動作が不安定になります。
なので、暴走したらまず、電源電圧をチェックしてみてください。
ノイズ〜♪
誤動作の原因が、明らかにノイズの仕業とわかるようなら、ノイズ対策しなきゃいけないんでしょうね。 ただ、わたしは、ノイズの仕業による回路の暴走なるものを経験した事がありません。ってか、ノイズ のせいだと勘違いしてたものばかりで、、
ノイズには、放射ノイズ(外から飛んでくるノイズ)と伝導ノイズ(線路を伝わってくるノイズ)というものに分かれます。 放射ノイズは、グランドに接地したアルミホイルで大抵、なんとかできます。しかし、放射ノイズの影響って、 あんまり見かけないんですよね、、
伝導ノイズは、T型フィルタを用いれば大抵なくなります。T型フィルタとは、次のような、コイルとコンデンサ で構成される回路で、これを信号線に直列に挟めば、ノイズは低減される、らしいです。
図10 T型フィルタぶっちゃけ、これ良く分かりません。伝達関数でも求めてみる必要があるのやら、、
あと、この回路、各値の設定があまりに変だと、波形がなまります。なので、値の設定には、 十分な注意が必要です。ただ、このT型フィルタは、表面実装タイプのものが市販されている ようなので、そっちを使うのが賢明かと、、
でもやっぱり、ノイズ除去というと、ローパスフィルタでしょうね。ローパスフィルタとは、 低い周波数の信号だけを通過させる"フィルター"の一種で、具体的に言うと、図9で示した 積分回路がそれにあたります。 ノイズは、基本的に高周波成分を多く含むので、ローパスフィルタを通過できません。
ノイズに弱い部品といえば、センサの類でしょうね。センサから取り出した信号は、 大抵微弱で、数ミリボルトとか数マイクロアンペアとかいった値をとることが多いです。 なので、センサ回路からの入力にローパスフィルタを入れたりします。
図11 ローパスフィルタ
馬鹿でかい文書で申し訳ない限りです。ほんと、人の読む気を削ぐような文字量、配置、 飾り気の無い図・・・・うぅ
それにしても、強引な説明が多々ありましたね。トランジスタのところとか。 なんていうか、基本的に一年向けのつもりで書いていたら、なんだか訳のわからない 説明になってしまいました。でも、一年向けと言う割には、回路図内の横三本線な図形は 何ですかとか、LEDってなんですかとか、PICっておいしいんですかとか、こういった本当に 基本的な質問に答えていないような気がするわけです。結局、そのへんは、自分で調べろ、ぐぐっとけ みたいな感じなんですよ。
というか、こんなノリの文章しか書けないのは、なんというか、ダメダメなんですけど、直らないんですよね。 人格破綻してるし(オィ
えーっと、とりあえず突っ込み歓迎!ってか、たぶん何か間違ってる気がしますので、鵜呑みにしたら痛い目見るかも?
1)電子工作の実験室:http://www.picfun.com
2)データシート:PIC16F8x、PIC16F87x
3)その他たくさん、、(オィ