I2Cで制御できるモータドライバモジュールDRV8830

 以前の記事ではTA7291PがPWMには不向きという事を書きました.
今回の記事ではPWMで制御できるDRV8830の動作確認をします.

DRV8830の概要

 DRV8830の特徴は以下の通り.(データシートより抜粋)

  • 安い(秋月で1個230円)
  • 内部DACにより電圧制御をしており,電源電圧が変化する電池用途に最適
  • 動作電圧が2.75~6.8Vと広い
  • 最大連続1Aまで出力可
  • 電源電圧,温度,電流(Current Limit と OCP)の保護機能

 モータに加わる電圧が指定した電圧になるようにPWMのデューティー比を変えるようです.
I2CアドレスはA0ピンとA1ピンを開放/GND/Vccとすることで最大9個まで変更できます.
保護機能が動作した場合にはFAULTピンがLowレベルになります.

 OCPは1.3A以上流れた場合にモータを停止させ,Current Limitは電流を制限しつつモータを回転させ続けます. Current Limitはモータの起動時に流れる突入電流を抑えるときに使えるようです.

回路

f:id:htn_hs:20180831152442p:plain:w500
回路図

 I2Cのプルアップ抵抗はAVRの内部プルアップがありますが,
波形がのこぎり波のようで不安だったので別途プルアップ抵抗を付加しました.

 A0とA1ピンは回路を簡単にするために開放としています.

 Current Limitは外部抵抗によって設定できます.

 R _ {sense} = 0.2 \ / \  I _ {limit}

今回は Current Limitによる制限電流を1Aとし,0.2Ωにしました.
データシートにはCurrent Limitを使わないなら直接GNDに接続しても良いと書いてありますが,
この抵抗がないとOCPによる保護が働いてモータが止まってしまいます.
電源を再起動させるかFAULTをリセットさせないと再度回せないので入れた方が良い.

実際の回路は以下の通り.

f:id:htn_hs:20180831134523j:plain:w400
実際に制作した回路

 0.2Ωは1Ωの抵抗を5つ並列させています.

 Current LimitによるFAULTが頻発していましたが, モータにノイズ除去用のコンデンサを追加したところ解決しました.

プログラム

// モータ正転 入力電圧 0.5V
#include <Wire.h>
enum {STANDBY, REVERSE, FORWARD, BRAKE};

void setup() {
  Wire.begin();
}

void loop() {
  double Vout = 0.5; // [V]
  byte drive = FORWARD;
  byte driverAddress = 0xC8 >> 1; // A0 開放 A1 開放
  byte controlAddress = 0x00;

  double Vref = 1.285; // 内部基準電圧

  // 出力電圧から送信データのフォーマットへ変換
  byte vset = (double) Vout / Vref * 16.0;
  byte data = drive | (vset << 2);

  Wire.beginTransmission(driverAddress);
  Wire.write(controlAddress);
  Wire.write( data );
  Wire.endTransmission();
}

 I2Cのアドレスはデータシートでは8bit分書かれていますが,
LSBは書き込みか読み込みのフラグなので上位7ビットがドライバのアドレスとなります.

 VSETと出力電圧の変換式はデータシートに書かれている

 V _ {out} = 4 \times V _ {ref}(V _ {set} + 1)\  /\  64

からVSETについて説いた式

 \displaystyle{ V _ {set} = \frac{V _ {out} }{V _ {ref} } \times 16 }-1

を使っています. ここで,Vrefは内部基準電圧1.285V.
実際にはVout=0の時に負の値となるのを避けるために-1を省略しました.
VSETは0x00〜0x05は予約となっていますが普通に動作します.

 無事モータが回り,DRV8830の動作を確認できました.
ただし,FAULTの原因を読み込んだりFAULTを解除する場合にはもう少し工夫が必要です.
ArduinoのI2Cライブラリでうまく読み込めなかったのでとりあえず保留.

参考リンク

  1. DRV8830を使ったDCモーターの制御(1): 猫にコ・ン・バ・ン・ワ

  2. 7-bit, 8-bit, and 10-bit I2C Slave Addressing – Total Phase

  3. I2Cモータードライバ・モジュール DRV8830 - サポート | ストロベリー・リナックス