Raspberry Pi 5 + L6480でステッピングモータが動かなかった原因4つ
Strawberry LinuxのL6480V2キットを57mm大型モータ(ST-57BYG076)でRaspberry Pi 5から動かそうとして、動くまでに4つの壁があった。同じ構成でハマる人向けに、症状→原因→対処だけ書く。
環境
| 項目 | 内容 |
|---|---|
| ドライバ | Strawberry Linux #12080 L6480V2キット |
| モータ | #12082 ST-57BYG076(3V / 3A/相 / 1Ω / 1.8°) |
| 電源 | 24V(Mean Well LRS-200N2-24) |
| 制御 | Raspberry Pi 5、Python(st-spin + gpiozero) |
配線はキット付属のCN1をRPi5のSPI0に接続。~STBYはGPIO25、~BUSYはGPIO23。
前提:st-spinはL6480用ではない
PyPIのst-spinはL6470用。L6480とはレジスタが2つずれている。
| レジスタ | L6470 | L6480 |
|---|---|---|
| CONFIG | 0x18 | 0x1A |
| STATUS | 0x19 | 0x1B |
L6480では0x18/0x19がGATECFG1/2(ゲート駆動設定)なので、パッチなしで使うとCONFIGを書いたつもりでゲート設定を壊す。import直後にこれを入れる。
from stspin.constants import register as _reg
_reg.Register.Config = 0x1A
_reg.Register.Status = 0x1B
_reg.RegisterSize[0x1A] = 2
_reg.RegisterSize[0x1B] = 2
_reg.RegisterSize[0x18] = 2 # GATECFG1
_reg.RegisterSize[0x19] = 1 # GATECFG2
1. VREGが出ない → ~STBY未接続
症状:24Vを入れてもVREGが0.8V、VDDが3.3Vにならない。SPIも無応答。
原因:~STBY(CN1-10)を何にも繋いでいなかった。基板側でプルダウンされているので、未接続=スタンバイ状態。スタンバイ中は内蔵レギュレータもSPIも止まる。
対処:GPIOでHighに駆動する。起動時にLow→Highすればハードリセットも兼ねる。
stby = DigitalOutputDevice(25, initial_value=False)
time.sleep(0.01); stby.on(); time.sleep(0.05)
2. UVLOが消えない → CONFIGのVCCVAL
症状:STATUS=0xE403。SPIもレジスタR/Wも正常、24Vも端子台まで来ているのにUVLOフラグだけ何度クリアしても再点灯。基板2枚で同じ。
原因:L6480のUVLOはモータ電源ではなく**ゲートドライブ電源(VCC / VBOOT-VS)**を監視する。CONFIGデフォルト(0x2C88)はVCC=7.5V設定で、UVLO解除閾値がVCC 6.9V(max 7.3V)、VBOOT-VS 6V。チャージポンプのダイオード降下を引くとVBOOT-VSが閾値ぎりぎりで、この基板では解除されない。
対処:VCCVALビットを立ててVCC=15Vにする。
dev.setRegister(StRegister.Config, 0x2E88) # 0x2C88 | 0x0200
これでSTATUS=0xE603(正常アイドル)になった。
3. 動かす瞬間に遮断 → GATECFGデフォルト
症状:Moveを送るとSTATUS=0x0613。OCD(過電流)とSTALL_A/Bが同時に立ってHiZ、ABS_POSも動かない。
原因:GATECFG1のデフォルトはIGATE=4mA、TCC=125ns。ゲート充電量0.5nCでは基板の大型FETが半端にしか導通せず、VDSが上がったままになる。L6480はVDSで過電流とストールを検出するので、動かした瞬間に誤検出して遮断する。
対処:ゲート電流と充電時間を延ばす。以下は同じ基板で実績のある値。
dev.setRegister(0x18, 0x0057) # GATECFG1: IGATE=8mA, TCC=3000ns
dev.setRegister(0x19, 0x89) # GATECFG2: TBLANK=625ns, TDT=1250ns
CONFIGもGATECFGもHiZ状態でしか書けない。またSTBYリセットや電源断でデフォルトに戻るので、初期化関数に組み込むこと。
4. 高速で脱調 → BEMF補償の過小
症状:60rpmまで滑らかだが120rpmで脱調。
原因:滑らかさ優先でFN_SLP(BEMF補償の傾き)を理論値の半分にしていた。速度が上がるほど逆起電力で実効電圧が削られ、補償が足りないとトルクが落ちる。
対処:FN_SLPをモータ定数からの計算値(0x34)に戻す。KVAL_RUNも0x20→0x28に上げた。結果、10〜350rpmで脱調なし、400rpmで脱調(24V無負荷の限界)。
最終パラメータ
| レジスタ | 値 | 備考 |
|---|---|---|
| CONFIG | 0x2E88 | VCC=15V |
| GATECFG1 | 0x0057 | IGATE=8mA, TCC=3000ns |
| GATECFG2 | 0x89 | TBLANK=625ns, TDT=1250ns |
| KVAL_RUN/ACC/DEC | 0x28 | 24Vで約3.9A相当(連続運転なら要温度確認) |
| KVAL_HOLD | 0x10 | |
| INT_SPEED | 0x0BEC | 4R/(2πL) ≒ 182 step/s |
| ST_SLP / FN_SLP | 0x06 / 0x34 | AN4144の式で計算 |
| MAX_SPEED | 0x41 | 300rpm(無負荷限界の85%) |
| ACC / DEC | 0x45 | 約1000 step/s² |
| FS_SPD | 0x427 | 高速域フルステップ+ブースト |
| STEP_MODE | 0x04 | 1/16 |
切り分けで役に立ったこと
- テスターで電圧を追う。JP1中央(VDD)、JP1のVREG側、CN1-10(~STBY)、端子台の24V。この4点で1は即座に特定できた。
- STATUSレジスタをビット単位で読む。0x0000は「返事なし」、0xE403は「UVLOだけ」、0x0613は「OCD+STALL」。フラグの組み合わせが原因を直接指している。
- GetStatus(0xD0)はフラグをクリアする。2回続けて読んで消えなければ「ラッチの残り」ではなく「今起きている」と確定できる。
- 基板を2枚試して同じ症状なら、故障ではなく設定を疑う。
参考
- L6480データシート(STマイクロ):STATUSビット定義、UVLO閾値、GATECFG
- AN4144(STマイクロ):電圧モードのKVAL・BEMF補償の計算式
- Strawberry Linux L6480V2マニュアル:JP1、配線、回路図