ただ今の日時:

ワンチップマイコン・PICでC言語を使った学習報告

1. 日付
2008年6月5日
2. テーマ
3桁LEDセグメントを使った電圧計の製作
3. 使用したPICマイコン
PIC16F876A-20/SP
4. 電源電圧とシステムクロック
電源:DC5V、クロック:20MHz
5. 開発環境
ハードウェア:ICD2(Microchip)、ICD-U40(CCS)、ブレッドボード(鰹H月電子通商)
ソフトウェア:PCWHD Compiler Ver4.073(CCS) 、 MPLAB IDE Ver8.10(Microchip)
6. 回路図
ここにあります!
7. プログラム
ソースファイル一式はここにあります。ZIPで圧縮しています。
8. 参照した主な書籍
「C言語によるPICプログラミング入門」 後閑哲也 著者 葛Z術評論社 発行・・・文献1
「CによるPIC活用ブック」高田直人 著者 東京電機大学出版局 発行・・・文献2

 今年(2008年)の1月2日にアップしたページでも言っていたと思いますが、「いつかはしたい!」と思い、忙しい中の合間をぬって、この半年間、全く何も知らない状態から、ようやく状況を報告できる段階になったので、アップを決意致しました。 (と言っても集中して勉強できた時間は延べ日数で半年のうち20日ほどしかありませんでした!)アセンブラしかしたことがない私にとって、C言語の世界は真新しいものばかりで、 「データ型」や「変数」、「文字コード」や「演算子」などから勉強しなければならない状況でした。無論「配列」や「ポインター」などまだまだ理解に至らないものが山積しています。 じっくりとあきらめずに続けて行けるよう頑張りたいと思います。なお、アップした回路図プログラム間違いや無駄などがあるかもしれません。そのあたりは勉強中と言うことでご容赦願います。できればご指摘やアドバイスを頂ければ幸いです。(メールなどで直接でもOKです)
 お決まりの条文ですが、ここに紹介するものは私個人が勝手に製作したもので、 万一製作されて事故などの被害にあわれても当方は一切責任を持ちませんので、ご理解とご了解のうえで、ご参照並びにご利用ください。できれば
勉強用として利用して頂ければ幸いです。なにせ私もまったくの素人ですから!

※ 2008年6月5日〜7日かけてダウンロードされた方へ!回路図とプログラムを修正しています。
  恐れ入りますが、入れ替えて下さい。

 きっかけ

 仕事がら色々な装置の調整をすることがあり、しばし数か所の電圧を同時に監視しなければならないことがよくあります。そのたびに何台ものテスターやオシロのプローブなどを充てては計測し、決して環境が良いとは言えない状況が気になっていました。 そんな中、せめて直流レベルだけでも「小さく」て「簡単」で、そこそこ「精度」があって、例えばクリップマグネットマジックテープなどと一体化して装置のあちこちに、この計器を貼り付けて、要所の電圧が測定できるモジュールができないかと探していました。そんな時、鰹H月電子通商で下記の3桁LEDモジュール を見つけたのがきっかけです。この3桁セグメントLEDとPICマイコンを使えば、それまでの悩みを解決できると思い、C言語・入門の最初の製作品として採用しました。



PARA LIGHT社製
C-533SR カソードコモン 赤色
鰹H月電子通商の価格 @200円


 具体的には

 大半の方は真っ先に先駆者の御仁のサイトを検索するでしょう。私も同様に7セグメントLED使った電圧計を探してみた所、いくつかは見つけたのですが、ほとんどがアセンブラでの内容が多く、 国内では見つけられなかったのが実情でした。(私の探し方がまずかったのかもしれません!) 次に海外で検索すると、C言語を使ったものを一つ見つけましたが、当然、回路図が異なるためプログラムが変わります。そんな中、いくつかのプログラムを眺めていると、「こうすれば良いのでは!? 」と言う私なりの理解が深まり、まずはプログラムを記述して動かしてみよう!と実行に移しました。

左の実験は、リファレンス電圧を2.5Vの専用IC(LM285-2.5V)を使用し、フルスケール2.5Vで、99.9と表示する前提でプログラムしたものを動作させています。
 表示はTM0の割り込みを使い、約3.3msの周期で桁を切り替えて表示しています。 クロック発信子には精度の良いものを使っていますが、この製品であればセラロックで十分でしょう。また、PICを変えれば内部発信モードを使っても十分で、部品も削減できます。回路図にはテスト用VRがありますが、ここには10kΩを駆動できるアンプを入れてフルスケールにあった電圧を入力させれば応用範囲が広がります。
 ちなみに消費電力は約57mAで少々大きめですが、セグメントに接続されている集合抵抗をもっと大きなもの(例えば1kΩくらい)にすればもう少し減らすことも可能です。他にも減らす方法はありますが・・・・


 回路図にはデバッグツールを接続するコネクタが描かれています。Microchip社のICD2やCCS社のICD-U40を接続します。 どちらも同じ信号ピン配置で、私の場合はプログラムデバッグ時はICD-U40で行い、PICへの書き込み時にICD2に換えています。当然、デバッグ時はリセット端子(1PIn)に接続されている47kΩ以外は外しておきます。

 精度について

表示値 入力電圧 真値 誤差率
80.0 1.993V 80.14 -0.17%
60.0 1.495V 60.11 -0.18%
50.0 1.248V 50.18 -0.36%
40.0 0.998V 40.13 -0.32%
20.0 0.498V 20.02 -0.12
10.0 0.254V 10.21 -2.1%
5.0 0.127V 5.11 -2.1%

リファレンス電圧:2.487V

左の表は表示値と入力電圧に関するデータです。
 最初に断らなければならないのは、上の写真の様にブレッドボードでの製作で、ご覧のようにかなりいい加減な組み方をしています。従って左表の10.0.V表示値と5.0V表示 値の精度がかなり悪い結果になっているのは、最下位桁の「1」に相当する入力電圧が「0.02487V」「0.002487V」(フルスケールと表示値より)に相当し、この桁を安定させるには上記の様な組み方では望ましくないことは言うまでもありません。 機会を見つけきちんと製作して評価したいと考えております。
 それにしては割と良い結果が得られています。


 苦労したことと、その他

 最初はリファレンス電圧を2Vで試験していたのですが、アナログ入力の電圧を徐々に下げていくと入力電圧がおよそ37%〜30%付近と25%〜8%付近で電圧表示が変化しない現象に見舞われました。そこでA/Dコンバータの使い方について、Webサイトで探していたところ、 ヒントとして精度を保証させるには二つの条件があることを教えられました。(文献1参照) しかし、今回のようなトラブルについては探し出すことはできませんでしたので、仕方なくリファレンス電圧を2V→2.5Vに上げた所、正常な値をサンプリングするようになりました。(機会があれば違うPICでも検証したいと思います。)
 これの発展として、アンプを含め全て面実装部品を利用すれば、3桁7セグメントの後ろに基板部品を搭載して、小さくまとめ、金属製のケースに入れて、入出力端子はBNCにしようと考えております。

 その後の調査で・・・

 2008年6月6日〜7日かけて上記の問題点について調査したところ、いくつかの原因が判明しましたので、改めて修正した情報をアップ致します。

a) 電圧表示値が変化しない原因
 これは、結論から言うとプログムミスです。アナログデータに使用している変数「adin0」と「ch0」があり、それぞれデータ型が異なっています。adin0が「 float型」でch0が「long型」にしていました。これを「float型」に統一してやるとリファレンス電圧を2Vにしても数値表示が変化しない現象はなくなりました。何故かは?今のところ分かりません。
b) 精度の問題
 いくつか原因がありますが、まずは「入力されている電圧の安定度があまりよろしくなかったこと」、さらに表示値の最小桁1dgitあたり2.487mVと非常に小さいため、「 ブレッドボードのアースの引き回しによる不安定さ」が起因していていました。しかし演算上の問題もあり、7セグメントに表示するための数値は整数処理しており、必要な数値のみ表示させ、さらに下の桁は「切り捨て」処理を行っていることから 最低でも1digtの誤差はあります従って下表の5.0Vは誤差の大小を議論するに当たらないと、思っております。
 これらはそれぞれ、入力のアナログを基準電圧ICを使ってい入れてみました。また、ブレッドボードのアースはリード線を複数本接続して強化しました。
表示値 入力電圧 真値 誤差率 表示値 入力電圧 真値 誤差率
5.0 0.1276 5.13 60.0 1.4938 60.08 -0.13%
10.0 0.2502 10.06 -0.6% 70.0 1.7422 70.07 -0.1%
20.0 0.4993 20.08 -0.4% 80.0 1.9922 80.13 -0.16%
30.0 0.7500 30.17 -0.56% 90.0 2.2402 90.10 -0.11%
40.0 0.9975 40.12 -0.3% 99.9 2.4862 99.99 -0.1%
50.0 1.2447 50.06 -0.12% Vref=2.4863V

 左表の誤差率は1digtの重みがあるため、評価法に問題があるかもしれませんが、参考のために載せています。おそらく、10bit近い精度が出ているのではないかと思います。


 総 評

 機会があれば外付けで精度のよいA/Dコンバーターで評価したいと思います。今時はシリアル通信型の小さなもので、高速で高精度のものが安く出回っていますから!では次回を