ディジタル・ポテンショメータ (1) MCP4012

 受動部品の半固定抵抗器は、電子工作でよく使われる部品です。ボリュームと同じ機能ですが、回転回数が数百回までと少ないのが特徴です。人が調整するときに便利ですが、自動化するには不便なデバイスです。電子的なボリュームにディジタル・ポテンショメータ(Digital POT)があります。

 半固定抵抗器は、抵抗の両端と可動接点(ワイパ)から構成されています。ディジタル・ポテンショメータはそのような接続を (a) potentiometer(ポテンショメータ・モード)、抵抗の片方を開放もしくは可動接点とショートしたタイプを (b) Rheostat(レオスタット・モード)と呼びます。半固定抵抗では、抵抗の片方を開放する使い方は推奨されていません。

インターフェース

 調べたところ、抵抗値を変更するインターフェースが3種類あります。

  • I2C
  • SPI
  • 独自方式

 I2Cの事例は、Arduino.ccでAD5171を利用例が説明されています。ここでは、2線を制御に用いた独自方法のMCP4012を利用します。SOT23の小型パッケージに入っているので、秋月電子通商の変換基板を利用してDIP化しました。

MCP4012のおもなスペック

 タップ数はD-Aコンバータのビット数と同様な値で、分解能を表します。電源が入ると、前回設定した値が設定されます。

  • タップ数 64
  • 抵抗値 2.1k、5k、10k、50kΩ(今回使用)
  • 温度係数 50ppm
  • 動作電圧 1.8~5.5V
  • 温度範囲 -40~125℃

抵抗値の増減タイミング

 増加時;U/DをHIGHにした後CSをLOWにしてシーケンスをスタートする。U/DをいったんLOWにし、スタート時から3usたってから再度500usの間HIGHにしたのちLOWにする。U/DをHIGHにし、つづいてCSをHIGHに、U/DをLOWにしCSをLOWにして終了。

 データシートのタイムチャートはFIGURE1-1です。

 下記のスケッチを動かして実測した波形です。

 減少時;U/DをLOWにした後CSをLOWにしてシーケンスをスタートする。U/DをいったんHIGHにし、スタート時から500usたってから再度HIGHにしたのち500us間LOWにする。U/DをHIGHにし、500us以降にCSをHIGHに、U/DをLOWにしCSをLOWにして終了。

 データシートのタイムチャートはFIGURE1-2です。

接続

Arduino          MCP4012  Arduino
5V 1ピン(Vdd) 6ピン(A)  抵抗端子
GND 2ピン(Vss) 5ピン(W)  可動接点
9番 3ピン(U/D) 4ピン(CS)  8番

スケッチ

 delayMicrosecondsは最小値が1ですが、確かめていませんが実際は数usになるようです。ns単位のコントロールはできないので、データシートにある3usというところだけを注意してdelayMicrosecondsの引数を決めました。

#define CS 9 // pin
#define UD 8 // pin

void setup() {
pinMode(CS, OUTPUT);
pinMode(UD, OUTPUT);
digitalWrite(CS,HIGH);
digitalWrite(UD,LOW);
Serial.begin(9600);
}

void Increment() {
digitalWrite(CS,HIGH);
digitalWrite(UD,LOW);
digitalWrite(UD,HIGH);
delayMicroseconds(2);
digitalWrite(CS,LOW);
delayMicroseconds(1);
digitalWrite(UD,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(2);
digitalWrite(UD,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(CS,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
digitalWrite(CS,LOW);
}

void Decrement() {
digitalWrite(CS,HIGH);
digitalWrite(UD,HIGH);
digitalWrite(UD,LOW);
delayMicroseconds(2);
digitalWrite(CS,LOW);
delayMicroseconds(1);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
delayMicroseconds(2);
digitalWrite(UD,HIGH);
delayMicroseconds(1);
digitalWrite(CS,HIGH);
delayMicroseconds(1);
digitalWrite(UD,LOW);
digitalWrite(CS,LOW);
}

void loop() {
Serial.println("Decrement; d , Increment; i ");
while (!Serial.available()); {
char a = Serial.read();
if(a == 'i'){
Increment() ;Serial.print(" i ");
} else if(a == 'd'){
Decrement() ;Serial.print(" d ");
}
}
delay(1000);
}

 5番と6番ピンをテスタの抵抗レンジで測定します。シリアルモニタの送信部分にdを入れると値は増加し、iを入れると抵抗値は下がります。

 

前へ

SpresenseでLチカから始める (8) SPIライブラリ ADS1220

次へ

SpresenseでLチカから始める (9) Wireライブラリ SHT31