ワンチップマイコン・PICでC言語を使った学習報告
今年(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日かけて上記の問題点について調査したところ、いくつかの原因が判明しましたので、改めて修正した情報をアップ致します。
表示値 | 入力電圧 | 真値 | 誤差率 | 表示値 | 入力電圧 | 真値 | 誤差率 | |
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コンバーターで評価したいと思います。今時はシリアル通信型の小さなもので、高速で高精度のものが安く出回っていますから!では次回を