ただ今の日時:

デジタルポテンションメータの実験


 実験の目的と回路の概要

前から「したい」と思っていたのですが、下の回路図を見て下さい。 (※ 実際には製作しておりません)

クリックすると拡大します。

■ 回路の構成概要説明

 回路構成はご覧の通りワンチップマイコンPIC16F88)とデジタルポテンションメーターICだけの制御で、2回路入りのモノマルチIC74HC221のパルス幅制御を構築します。
左下には幅を広げる「Up」ボタンと幅を狭める「Down」ボタンを配備し、パルスを発生させるための「START」と「STOP」のボタンもつけました。ついでにUp時とDownにLEDを点灯させています。 もう一つの切り替えスイッチでは、周波数デューティの可変切り替えを行っています。


 こんな回路を思いついたのは、もうかなり昔のことで(マイコンなどは別として)、モノマルチ2個で発信器ができるのは知っていました。しかし、デューティを変えるのはちょっとした回路と工夫が必要になります。色々考えましたが回路規模が大きくなり、 気に入りませんでした。また、モノマルチを2個の発振回路では、周波数がかなり高く出せていました。実力では10MHz〜50MHzくらいまでは出たと思います。(デューティー50%、10ns(H)+10ns(L)で50MHz!)
PICマイコンでPIC16F88を選択した理由は、部品を出来るだけ少なく簡単に組み込め、発信器を内蔵していて、価格が安いことを目標にしました。別な理由では使用する予定のポテンションメーターが3線式SPIシリアル制御をするもので、プログラムの負担を軽減するためでした。 もちろん価格も230円(秋月電子の価格)で非常にリーズナブルで高機能が選択の理由です。
もう一つの登場は、デジタルポテンションメーターです。私が始めて見たものは確か、分解能32bit64bitのものでした。 これを見てすぐ「上の回路に使って見たい」と考えました。今では1024bit2048bitが出回り、2回路4回路入りのものまで、各社のラインナップがかなりあります。 ・・・そんな時期にいつも読んでる電気の雑誌の広告に、新製品!とうたわれた製品を見つけ、サンプル請求をしたところ、すぐに送られてきたものが下記のものです。

 ← 上表面  ←裏半田面

特徴は上の英文を見て下さい。データーブックからの抜粋です。結構すごい性能をしています。     MAX5499の内部ブロック図

 半田付けと実装

 MAXIM社のデジタルポテンションIC、「MAX5499ETE」($3.6/1000個ロット)がそれで、確かMAX5495を請求したのですがなぜかこれが送られてきました。 (詳しくは型番でヒットしますのでサイトで確認願います)ご覧のように非常に小さく、実装に悩みました。悩んでいても事は進まないので、無理やりリード線を半田付けしてブレッドボードに実装しました。

半田付け端子部は、1ピン幅0.3mmピッチ0.8mmで割りと大き目ですが、いざ半田付けするとなると、技量が無いのか、写真のようになってしました。 「まあ、動作すればいいや!」との感覚で半田付けをしました。結構しっかり付いたのには驚いています。
当然、量産などはこの様には行きませんね!


 実験回路の配線

 実験回路は全て「ブレッドボード」を使いました。最近、秋月電子から買いましたが、ずいぶん安くなったものだと驚きでした。回路規模が小さいものだと、このボードはまさに、(*^-°)vオッケェー♪  Goodです。

 左写真が全体像。右写真がMAX5499を両端オスのICピンを使い、ラッピング線を半田付けしてブレッドボードに実装しました。余談ですが、プログラムがうまく動かない時に、このICを疑り、何回も取り外しては付けるを繰り返すうち、2本ほど半だが外れました。 技量が問われる場面に直面して、自分ながら恥ずかしい限りでした。
気を取り直して、ボードに実装しているものは、中央やや左にPIC16F88マイコン、2色LED(Upの時は赤色が点灯し、Downの時は青色が点灯します)、 白ボタン(Upスイッチ)、黒ボタン(Downスイッチ)、リセット用R(10k)、C(0.1uF)が各1本だけです。発振回路が内蔵しているのは非常にありがたいマイコンです。一番左にあるICのようなものは20MHzのクロック発信器で、使用していません。

 シーケンスとプログラミング

 一番時間がかかった作業です。その理由は簡単です。3年ほどプログラミングから遠ざかっており、思い出すのにかなりの時間を要したためです。また、最新のマイコンの理解にも多少ですが時間を要しました。
では心臓部であるポテンションメーターのタイミングを見てください。(回路図も参照して下さい)

クリックすると拡大します!

 ごく普通のタイミングで、結構高速に動作します。大半の時間は60ns平均で、このタイミングで一番長いのはCSの一番右側のtcswの150nsです。(MAX5499.pdf データブックより抜粋。以降同様)

クリックすると拡大します! クリックすると拡大します!

 上の表にある「Wiper Register 1」と「Wiper NV Register1」は抵抗1の制御用で、2個ありますから当然、「Wiper Register 2」と「 Wiper NV Register2」は抵抗2の制御に使われます。
 実際の制御はWiper Registerの書き込みだけでは抵抗値は変わりません。NV Registerに書き込んで始めて内蔵する抵抗が変化します。

コマンドやデータを送るタイミング表を見て下さい。a)の24bit送信とb)の8bit送信があります。直接Wiper RegisterやNV Registerレジスタに書き込むときは24bit送信を行います。また、Wiper RegisterからNVRegisterへのコピーやNV RegisterからWiper Registerへのコピーを行う時などは、 8bit送信で行います。

タイミングチャートには出ていませんが、このNV Registerに書き込んだ後は、必ずCSのピンを「12ms」の間、’H'にしておかなければなりません。(データブックより)上の表にあるコマンドで、NV Registerに書き込み又は、 Wiper Registerからのコピーがされる時もこの時間が必ず必要です。一方、Wiper Registerは、事前設定みたいな役割で、設定後にCOPYコマンド実行で抵抗値を可変させる動作をするのに用います。

取り急ぎ、動作させるためのプログラムは作りました。欲しい方はメールを頂ければ差し上げます。

 プログラムの概要として簡単ですが、内部発振使用 8MHz設定SPI 機能使用、あとは普通のI/O機能を使っただけです。プログラム全体として約200バイト程度のものです。 この後、モノマルチを動かしたりする機能を入れれば、300バイト程度になると思われます。私はもっぱら「アセンブラ」を使っています。C言語も良いのですが、凝った作りをするのはアセンブラが一番です。メモリー量はたっぷりあるのですが、アセンブラだと バンク切替などを気にしなけばなりません。しかし、この程度であればそれほどの規模にはなりません。おまけに無料ですから!後日、プログラムを整理したらソースをアップします。

 動作波形

 このポテンションメータの動作確認ですごい勘違いを発見しました。それは、デジタルテスターを用いて、抵抗値を測定していたことです。このポテンションメータに内蔵する2個の抵抗は、ただ単に抵抗値を測定することは普通のハンディーテスターなどでは出来ないことが判明しました。 (高級な測定器であれば可能かも??)中の等価回路を覗いてみたいものです。
手っ取り早いのは単に電流を流せばいいわけで、最大に流せる電流値は、カタログより、±1mAとなっている。電流を流すことにより、電圧が得られるので、その電圧を測定して、動作の検証を行います。 くせものがこの1mAです。
 先の目的であったモノマルチでの応用が少し、難しくなってきました。現在検討中ですが、単純計算でも5V/1mA=5kΩと言う抵抗値で10nsの幅を想定すると、2pFと言うコンデンサーが必要です。 かなり低い値ですが、このあたりは実際に製作しないと何とも言えません。
 それでは各部の波形を見て生きましょう

← 1) 全体のPIC→MAX5499の送信波形です。

上がMAX5499のCS真ん中がMAX5499のSCLK一番下がMAX5499のDINです。

CSの波形が長い幅で2回、短い幅で1回、合計3回立ち下がっているのが分かります。長い幅は24bit送信のときです。短い幅は8bit送信のときです。
長い幅は、1回目が内部抵抗1の設定データで、 2回目が内部抵抗2の設定データです。3回目の短い波形はWiper Registerの1と2のデータを、NV Regiosterの1と2にコピーしている時間です。
全体として、60us+12ms=12.06msと言う時間で、2個の抵抗設定データが送信できています。


← 2) 一番左の部分を拡大した波形です。

 CSが立ち下がって約1us後SCLKの一つ目のパルスが発生しています。 この一つ目のパルスの立下りでDINのデータが送られてきています。このときのデーターはWiper Register 1にデータを直接か聞き込むコマンドとして、2進数で b '00000001' (0x01) が送信され、SCLKに入力されている8個のパルスの内、最後の立ち上がりのところで、DIN はすでに 'H' になっています。これがデータの '1' に相当します
ちなみに、SCLKのパルス幅は 250ns となっていて、SPI送信クロックを1/4の設定(最大設定です!)にしているためで、元の発振源が8MHz、それを 1/4 にすると 2MHz、その逆数が 0.5uS となり1サイクルの周期になります。デューティ 50% としての 'H'パルス幅は1/2となるため、250nsとなります。


 ↑ 3)、4)
上の2枚の波形は、左が2)の波形の一番右の最後の部分を拡大したところです。DINが立ち上げってから約 3.5us 後に次のSCLKのクロックパルスが発生しています。右の写真はそのクロックを8個分表示した波形です。 CSはずっと 'L' のままで、DINは 'H' のままです。この時に送信したデータは、Wiper Regsiter1の上位バイトに b'1111 1111'(0xFF)を設定しています。だから、DIN が 'H' のままなのです

← 5) 2番目のデータ送信波形

 2番目は、Wiper Regsiter1に下位バイトデータとして b'1100 0000'(0xC0)を設定して送信しています。勘違いしやすいのが、DINの波形です。DINの信号は、PIC側でラッチされているので、 データ最初のほうでわざわざ 'L' などにしません。さて、SCLKの1回目(D7に相当)の立ち上がりと2回目(D6に相当)の立ち上がりの時、DINは 'H' の状態です。残りのクロックの立ち上がり時は全て 'L' です。つまり0xC0と言うデータになります。


← 6) 2番目のデータの終了とCSの立ち上がり

 Wiper Register1の下位バイトデータのLSB側の拡大波形と、CSの立ち上がり部の波形です。これで内部抵抗1の設定値がMAX5499に転送されました。

次のCSの立下りから内部抵抗2の設定データの送信が、上の2)〜6)の波形と同様に観測できます。


← 7) NV Registerへの転送

 2番目のデータ送信以降から途中を省略して、最後のコマンドとして、Wiper Register1と2NV Register1と2へコピーするコマンド実行します。コマンドコードは表より、b'00100011'(0x23) と言うコマンドになります。
SCLKのそれぞれのクロックの立ち上がり時のDINの状態を確認してください。コードが読み取れます。 波形は省略しますがSCLKの最後のクロックが立ち上がってから約 2.7us 後にCSは立ち上がります。 その後、12msの時間がおかれ、NV Registerに転送が完了し、内部抵抗1と2にデータが格納され設定値に応じた抵抗に変更されます。
ちなみに抵抗値は、b'0000 0000 00xxxxxx' で約 110Ωです。 b'1111 1111 11xxxxxx' 約 50.11kΩになります。詳しくは、データブックを参照して下さい。