ESP32とL6470でモータを回してみた③【KVAL検討】
ESP32とL6470を使ってステッピングモータを回したシリーズの記事が増えてきたので「もくじページ」を作成しました。→もくじページのリンク
前回までの振り返り
・自作のESP32基板とL6470使用 ステッピングモータドライブキット(以後L6470)を使ったステッピングモータの回転に成功し、オシロスコープを使ってL6470からの出力を観察しました。
今回やったこと
KVALを変えることでL6470からのモータ出力がどのように変化するか、オシロスコープを使用し確認した。
使用した部品や機器など
①ESP32基板
自分で設計したESP32ですが、もちろん他からの購入しても同じです。
②L6470使用 ステッピングモータードライブキット
秋月電子通商から購入しましたが、ストロベリー・リナックスでも同様の基板を購入できるようです。
③ステッピングモータ
こちらも秋月電子通商から購入したバイポーラー ステッピングモーター「 ST-42BYH1004」です。2相バイポーラステッピングモータであれば、なんでもいいです。
④オシロスコープ
岩崎通信のデジタル・オシロスコープ DS-5107B
電子回路を勉強するのに便利かと思い数年前に中古品を2~3万円で購入しました。全く使用していませんでしたが、今回初めて使いました。使い方はよくわかりませんが、USBメモリに画像を出力できました。

https://www.iwatsu.co.jp/tme/ds/ds5100b/
今回使用したコード
#include <Arduino.h>
#include <SPI.h>
#define PIN_SS 5
// L6470に命令を送る関数
void transfer(uint8_t data) {
digitalWrite(PIN_SS, LOW);
SPI.transfer(data);
digitalWrite(PIN_SS, HIGH);
}
void setup() {
Serial.begin(115200);
//********************************************
//ESP32にどのプログラムが入っているか後から確認できるように、
// 書き込んだプログラムの情報をシリアルモニタに表示(必須ではない)
while (!Serial);
Serial.println("=== ESP32 Program Info ===");
Serial.println("Program: 260516_esp32_L6470_motor_test2.cpp");
Serial.print("Build Date: ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.println(__TIME__);
Serial.println("==========================");
//********************************************
pinMode(PIN_SS, OUTPUT);
digitalWrite(PIN_SS, HIGH);
SPI.begin();
SPI.setDataMode(SPI_MODE3);
delay(200);
// デバイスリセット
transfer(0xC0);
//****************** 今回の実験で変更する値 ******************
// KVALの設定
transfer(0x0A); transfer(0x29); // KVAL_RUN
// ステップモードの設定
transfer(0x16); transfer(0x07); // STEP_MODE
//**********************************************************
}
void loop() {
// 1秒間、正転(Runコマンド 0x51 + 速度3バイト)
transfer(0x51);
transfer(0x00); transfer(0x5F); transfer(0xFF);
delay(30000);
// 1秒間、停止(SoftStopコマンド 0xB0)
transfer(0xB0);
delay(1000);
}コードの以下部分を書き変えて確認しています。
//****************** 今回の実験で変更する値 ******************
// KVALの設定
transfer(0x0A); transfer(0x29); // KVAL_RUN ←定速回転時の印加電圧
// ステップモードの設定
transfer(0x16); transfer(0x07); // STEP_MODE ←ステップモード
//**********************************************************
KVALとはなにか?
一言で言うと、「モーターに供給する電圧(パワー)の最大値を決める設定値(係数)」で、電源電圧にこのKVALの割合(0〜100%)を掛け算して、モータ電圧を調整しています。つまり、モーターのトルク(回る力)をコントロールするためのレジスタです。ただし、実際に電圧を変えているのではなく、PWM(Pulse Width Modulation:パルス幅変調)によって「ON」になっている時間の割合を変化させることで見かけ上の電圧を制御する技術です。
L6470は各動作に応じて以下4つのKVALレジスタが用意されていますが、基本的には同じ考えなので今回はKVAL_RUNのみ確認しました。
KVAL_HOLD: 停止(保持)時の印加電圧
KVAL_RUN: 定速回転時の印加電圧
KVAL_ACC: 加速時の印加電圧
KVAL_DEC: 減速時の印加電圧
KVALレジスタは8ビット(0〜255、16進数で 0x00 〜 0xFF)の範囲で設定します。
オシロスコープでL6470からの出力をみた
回路とオシロスコープのプローブ取付位置は図1のとおりです。なお、マイクロステップでのON/OFFがなされるとよくわからなくなるので、STEP_MODEを0x00(フルステップ)とし、波形を見ました。

図2は5ms/divで取得した波形です。KVAL100%は完全な矩形波になると思ったのですが、L6470によって調整が入り一度の出力中に縦筋が数本入っています。まあ縦筋の本数は少ないので一度の出力中は、ほぼ電源電圧である8Vが出力されています。
KVAL75%は縦筋の量が増え、モータに掛かる電圧は8V×0.75=6Vで実質6Vの電圧が掛かります。25%、50%も同様に実質の電圧は下がっていると思いますが、オシロの波形は縦筋で塗りつぶされてしまい違いがわかりませんね。

そこで、図3は0.5ms/divで取得した波形です。こちらであれば、25%と50%の波形に違いが見えました。

パワーサプライ表示電流
私が使用しているパワーサプライには出力の電流表示がついていますので
各KVALに対する電流値を読み取りました。モータは無負荷の状態なので負荷の大きさで変わるとは思いますが、KVAL25~75%までがほぼ直線で増加し、75~100%の間では傾きが小さくなっています。

まとめ
KVAL_RUNの値を25~100%の間で変更し、ステッピングモータへの出力波形を観察しました。その結果、値が小さくなるほどON時間が短くなり、モータへの出力が抑制されていることが確認されました。
12Vの電源電圧で5Vのモータを使用し最大のトルクが必要な場合は、5V/12V=106 ⇛0x6A と設定できますが、この値を基に以下の考え方で低めに設定するのが良さそうです。
KVAL_HOLD(停止時): モーターが止まっている時は、少しの電圧でも電流が流れすぎて発熱します。そのため、低めに設定します。
KVAL_RUN(定速時): 回転中は「逆起電力」が発生して電流が流れにくくなるので、停止時より高い電圧が必要です。
KVAL_ACC/DEC(加減速時): 慣性に打ち勝つために、最も大きなパワーが必要になります。
