TOP > 電子部品 > デジタルポテンショメータ (X9Cxxx)

デジタルポテンショメータ (X9Cxxx)

(2017.10.29 作成)

(2017.11.11 更新)

(2017.11.16 更新)

 ディジタルポテンショメータとは簡単に言うと電気的に調整できる可変抵抗のことです。いくつかのメーカーから同様の製品で出ておりますが、ここでは旧Intersil社製のX9Cxxxについて紹介したいと思います。

 実際にはxxxという型番はなく、以下のどれでも同じように使えます

X9C102 102 = 10*10^2 = 1kOhm
X9C103 103 = 10*10^3 = 10kOhm 
X9C503 503 = 50*10^3 = 50kOhm
X9C104 104 = 10*10^4 = 100kOhm

 ディジタルポテンショメーターにはI2CSPIで調整するものもありますが、このX9Cシリーズは3線でUp/Down端子を使って抵抗値を1ステップずつ上げたり下げたりして、目的の抵抗値に設定するものです。

入手性

 このチップの使い方を説明する前に、まずなぜこのICを選んだかを紹介させてください。

  といっても理由は単純に価格です。Aliexpressでx9c103pなどとして検索すると10個単位だったりしますが、1個50円以下で購入することができます。送料込みなので、個人で購入するには最もお勧めの方法です。

  ただしSOICタイプのパッケージを購入したい場合はx9c103sとして検索するのですが、その場合右のようなモジュールがヒットします。

 しかしこのICの場合は外部に特に受動部品も必要なく、直接マイコンに接続できるのでDIPタイプのICで購入することがお勧めです(このページの一番下に動いている写真を載せています)。


使い方

 右に等価回路を示しますが、使い方は驚くほど簡単です。

 Vccに5V, または3.3Vを接続し、後はU/D, INC, CSの3ピンを使って任意の位置にRw/Vwの位置を調整するだけです。

 また、設定値を不揮発メモリに保存しておくことができるので電源投入時の初期抵抗値を固定することができます。

 実際の制御ピンの動作モードも左の5種類だけです。

 SPIのようにCSピンがLowになるとコマンド入力待ちなり、INCピンの立下りエッジでRw/Vw端子が移動します。

 この際U/DピンがHIGHだと大きい側へ、LOWだと小さい側へRw端子が移動します。最後にCSピンをHIGHに戻す際にINCピンがHIGHだとその時の設定値をメモリに書き込みます。

 動作に特に注意する点はないと思います。実際とても簡単に動きました。一つ注意する点としてINCピンは通常HIGHにしておいてください。なぜかよくわかりませんが、Up -> Downへ切り替えた際の1回目の立下りエッジが機能しませんでした。

 またポジションを0に設定しても約40Ωの抵抗が残ります。全体的に40Ωのオフセットが乗っているので実際の変化幅は40~9940Ω(X9C103の場合)になります。

ダウンロード

 こちらから作成した作成したライブラリをダウンロードしていただけます。使用法や環境設定についてはこちらを参照してください。

サンプルプログラム

 以下にArduino用のサンプルプログラムを示します。Arduino, STM32いずれもほぼ同じコードで動作します。

#include "DKS_Common_Arduino.h"
#include "DKS_GPIO_Arduino.h"
#include "DKS_DPOT.h"

void setup() {
  DKS::DigitalOut INC(2);
  DKS::DigitalOut UD(3);
  DKS::DigitalOut CS(4);

  Serial.begin(9600);
  Serial.setTimeout(15000UL); // タイムアウト設定(15秒)
  String str;

  Serial.println("X9Cxxx sample program");
  Serial.println("Hit enter to next step");

  Serial.println("0 ohm");
  DKS::DPOT::X9Cxxx dpot(DKS::DPOT::X9C103, &CS, &INC, &UD, true);
  str = Serial.readStringUntil('\n');

  Serial.println("5 kohm");
  dpot.MoveTo(50);  // 5kohm
  str = Serial.readStringUntil('\n');

  Serial.println("9 kohm");
  dpot.MoveRelative(DKS::DPOT::Upward, 40, true); // 9kohm, save
  str = Serial.readStringUntil('\n');

  Serial.println("1 kohm");
  dpot.SetValue(1000);  // 1kohm, not save
}

void loop() {}