电机驱动开发笔记(LV8731V)
本次只是LV8731V的应用开发,实际如果完全自己写驱动算法替代LV8731V,那么要学的东西还要多很多。但是这毕竟是做电机的第一步。很有必要进行深刻学习并总结下来。
关于步进电机和直流电机的工作原理在电机理论基础章节有简单的总结与整理。
电机控制中离不开电机驱动芯片,MCU虽然能发出控制信号,但其GPIO口输出电流通常不足50mA,无法直接带动一个需要几安培电流的电机工作。这时候通常借助电机驱动芯片实现对电机的控制。常见的电机驱动像L298N、LV873V等等,不同场景下对驱动芯片的要求也有明显差异。
1. 关键信息
首先根据LV8731V芯片手册1,我们可以提取到一些关键信息:
- 双H桥驱动,可以驱动一个步进电机或两个直流电机
- STM模式时,用作步进电机,两个H桥分别控制步进电机的两个组独立线圈旋转(常见的是两相混合式步进电机),配合驱动一个电机。
- DCM模式时,用作直流电机或单向步进电机,两个H桥分别控制两个独立的直流电机(直流电机),分别驱动两个电机。独立正反转、刹车、待机。
- VM(供电电压) 9~32V,最大36V
- 内置过流检测、过热检测(通过EMO引脚故障输出),短路保护(可选择闭锁或自动恢复)
- 步进电机,支持最高1/16微步驱动
2. 引脚定义
| 引脚名称 | 引脚功能 | 输出方向 |
|---|---|---|
| VM | 电机供电电压输入 | Input |
| OUT1A, OUT1B | 电机1 H桥输出 | Output |
| OUT2A, OUT2B | 电机2 H桥输出 | Output |
| RF1 | 通道1电流检测电阻连接端 | Input |
| RF2 | 通道2电流检测电阻连接端 | Input |
| MONI | 励磁初始位置检出监视器(用作步进电机时) 通道2电流检测监视(用作直流电机时) |
Output |
| EMO | 故障指示输出,过流/过热异常时输出OFF状态(用作步进电机时) 通道1电流检测监视(用作直流电机时) 注意这里EMO内部是开漏输出的,本来需要外接上拉,因为芯片自身的VREG5可以输出5V,所以直接接一个电阻(4.7kΩ ~ 10kΩ)到EMO即可。 |
Open-drain Output |
| DC11, DC12 | 通道1方向/控制信号 | Input |
| DC21, DC22 | 通道2方向/控制信号 | Input |
| ST | 使能控制,设置芯片待机(L)/工作状态(H) | Input |
| DM | IC驱动模式,STM模式(控制1-2相步进电机)/DCM模式(2ch直流电机) | Input |
| STEP | 步进励磁 | Input |
| FR | 正反转 | Input |
| EO | 芯片使能 | Input |
| MD1, MD2 | 励磁模式控制 | Input |
| VREF | 定电流控制的基准电压值 | Input |
| ATT1, ATT2 | 根据ATT1, ATT2输入状态可设定VREF端子电压四档衰减切换 | Input |
| VREG5 | 一个5V稳压输出,为内部逻辑和外部上拉提供电源。需在此引脚与GND之间连接一个陶瓷电容进行滤波,以稳定5V输出 注意VREG5的5V输出受ST(芯片使能,工作状态下)引脚控制 |
Input |
注意
- Rs(电流检测电阻),每个桥臂下端(RF1, RF2) → 接地前串Rs,参考0.3Ω,决定限流电阻阈值
- 过流保护原理:电流流过Rs → 产生压降 → 芯片内部比较器检测 → 超过阈值? → 触发保护 → EMO/MONI拉低
3. LV8731V直流电机驱动
直流电机控制:
- 重要引脚:
- DC11、DC12、DC21、DC22,输出
- EMO、MONI,过流过热故障保护
- 注意针对控制两个直流电机时,这里只有一个VREF,所以设计上同一时间只能启动一个电机,在每次启动电机时注意需要调整VREF,设置为对应电机的参考电压。
- 关于直流电机的速度控制:
- 设计时候受芯片引脚资源限制,给ATT1、ATT2直接砍掉了(直接接地了),导致现在调速只能依靠改VREF。
- LV8731V通过VREF设定电机的目标相电流。芯片手册可以看到设定输出电流与基准电压的关系:
IOUT=(VREF/5)/RF,通过这个公式我们可以得出VREF电压越高,芯片可以输出电流就越大。这个电流决定了电机能产生的扭矩,但并不能像电压控制那样线性地改变空载转速。本质上,LV8731V的恒流控制更多是作为限流保护,而非精确的调速手段。 - 恒流控制可以保证稳态时的平均电流,但是无法保证瞬态峰值电流不超标,所以电机堵转时,依旧过流故障。
- 用堵转电流来做VREF的计算,可以把电机最危险的工况(堵转)作为设计的基准点,通过恒流控制,将这个危险转化为一个可控的、安全的“最大输出能力”,实现性能和安全极限状态。
- 使用VREF调速效果也很有限,虽然控制连续,单当VREF较小时,设置的目标电流较小,经常无法克服电机的启动阻力。所以恒流控制对于直流电机来说属于保护机制,而非调速手段,LV8731V本质上是一款步进电机驱动,所以必须恒流控制,直流电机只是顺带支持。
- 通过软件模拟脉冲信实现速度控制效果,控制通断,不能控制电压或电流,本质是开关控制,影响电机绕组两端的平均电压。调速效果同VREF,控制不连续,频率太低导致控制精度下降,速度控制效果有限。
- LV8731V定电流控制,意味着直流电机速度不是由电压决定,而是通过PWM占空比控制平均电压及电流。所以如果限制最大电流来调节转速,当负载增加时,电流达到限值,转速下降。
- PWM恒流控制模式:
恒流控制:LV8731V-PWM定电流控制步进电机驱动
芯片根据VREF和RF电阻设定目标电流
芯片给电机绕组通电,电流上升
通过RF电阻检测实时电流
监测到电流达到目标时,会暂时关闭输出让电流下降
当电流下降到一定程度再次打开输出,电流上升,如此循环往复实现电机恒流 - 注意“恒流驱动”控制的是“上限”,而不是“输出”。空载运行时,电机只吸收维持自身转动所需的小电流。只有当电机需要出力(带负载、加速或堵转)时,电流才会达到设定目标值。
- 电流大小本质上还是负载决定,负载增加,电流增大(负载增加 → 电机被拖慢 → 转速下降 → 反向电动势减小 → 绕组上的电压变大 → 绕组上的电流增加,最终到达一个新的平衡点)。
- 我们知道
V=IR+E, E=Ke⋅ωE:反向电动势,Ke:电机常数,ω:转速。当负载不变,可推导出电压唯一影响电机转速。 - 电流决定扭矩(洛伦兹力)大小。
3.1. LV8731V驱动直流电机的待机与刹车
DCM模式下,驱动直流电机时,支持待机与刹车。
- 待机:DC11=L, DC12=L; OUT1=OFF, OUT2=OFF;
- 刹车:DC11=H, DC12=H; OUT1=L, OUT2=L;
这里很好理解,当在设置LV8731进入刹车模式时,此时电机线圈短接,实现快速制动。原理是,电机在旋转时,转子旋转,切割磁感线,产生感应电流,形成感应电压(发电机原理)。注意这里的感应电压与电源方向相反(楞次定律,来拒去留),所以是反向电动势。这时我们给电机短接起来了,形成回路,在定子磁场中,转子有感应电流通过,转子受洛伦磁力影响,产生了反向转矩,从而减速。
总结:
- 旋转 → 产生反电动势(发电机原理)
- 短接 → 形成电流回路
- 电流 × 磁场 → 产生反向转矩
如下图是电机H桥电路简图:
VCC
|-----------
SW1 SW3
|-----M-----|
SW2 SW4
-----------|
GND
说明
- M 直流电机
- SW1 SW2 SW3 SW4 为四个开关(MOSFET)
- 当1,4闭合,2,3断开时,电机正转;
- 当2,3闭合,1,4断开时,电机反转;
- 当1,3闭合,2,4断开时/2,4闭合,1,3断开时(高测刹车,回灌风险,给电源充电),电机刹车
- 当1,2,3,4全部断开时,电机惰行(滑行、待机)
- 当1,2闭合时/3,4闭合时,电源短路
4. LV8731V步进电机驱动
步进电机控制:
- 重要引脚:
- STEP,脉冲控制步进
- FR,方向控制
- EMO,过流过热保护
- MONI,引脚输出初始位置信号检测
- MD1、MD2,励磁模式选择(2相励磁、1-2相励磁、W1-2相励磁、4W1-2相励磁,即2、4、8、16细分,W指Wire(相),每相有1/2电流台阶)
- ST,工作模式
- OE,使能或禁止
- LV8731内置了电流控制逻辑,只需要给STEP脉冲即可。不需要自己写PWM输出控制相电流,资源也不够。
- 每个完整的脉冲周期(上升沿+下降沿)才能产生有效驱动,STEP上升沿时,励磁移动;STEP下降沿时,励磁保持;
- 通常用定时器+GPIO手动反转来实现脉冲控制,之所以不用PWM,根本原因在于我们需要“精确可控”的脉冲数量来实现定位,以及“灵活可变”的脉冲频率来实现加减速,从而保证电机平稳运行。普通的PWM是连续的、频率固定难以精细动态调整。
步进电机系统框图:
graph LR
A[MCU] --> B[STEP/FR/MDx]
A --> C[VREF]
A --> D[ATT1/ATT2]
B --> E[LV8731V]
C --> E
D --> E
E --> F[步进电机]
E --> G[电流采样电阻 RF]
E --> H[CHOP 电容]
E --> I[CEM 电容]
E --> J[MONI/EMO 状态反馈]
4.1 步进电机系统控制流程
graph TD
%% 样式定义
classDef init fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef interrupt fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef cycle fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px
classDef task fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef output fill:#fff0f0,stroke:#b71c1c,stroke-width:2px
%% 主初始化流程
Start([系统上电]) --> PowerOn[上电初始化<br>配置电机模式、工作模式(DM=L,ST=H,...)]:::init
PowerOn --> LineCheck[线序检测]:::init
LineCheck --> ParamLoad[E2参数加载]:::init
ParamLoad --> MainLoop[进入主循环]:::cycle
%% 中断系统
MainLoop --> Timer1ms[1ms定时中断<br/>时基产生]:::interrupt
Timer1ms --> TimerStep[STEP定时中断<br/>脉冲输出]:::interrupt
%% 主循环任务调度
MainLoop --> Scheduler[主循环任务调度<br/>10ms周期]:::cycle
%% 10ms任务详细流程
Scheduler --> ValveCheck[阀状态检测]:::task
ValveCheck --> PosCalc[位置计算]:::task
PosCalc --> MotorCtrl[电机控制]:::task
%% 并行保护检测
MotorCtrl --> ProtectCheck[保护检测]:::task
ProtectCheck --> FaultCheck{故障判断}
FaultCheck -->|有故障| FaultProc[故障处理]:::task
FaultCheck -->|无故障| StatusOut[状态输出 485/数码管]:::output
FaultProc --> StatusOut
%% 显示更新
StatusOut --> Display[显示更新]:::output
Display --> Scheduler
%% 故障处理后的恢复路径
FaultProc -->|故障清除| MainLoop
%% 特殊标注MEMIND输出区域
subgraph MEMIND[监控输出]
StatusOut -->|实时数据| MemOut1[阀状态反馈]
StatusOut -->|实时数据| MemOut2[当前位置值]
StatusOut -->|实时数据| MemOut3[电机运行状态]
StatusOut -->|实时数据| MemOut4[故障代码显示]
Display -->|界面更新| MemOut5[数码管显示]
MemOut5[数码管显示] -->|参数设置| Display
end
%% 添加时间标注
TimeNote1[时基: 1ms] -.-> Timer1ms
TimeNote2[脉冲: STEP周期] -.-> TimerStep
TimeNote3[任务周期: 10ms] -.-> Scheduler
4.2. LV8731步进电机软起动设计
背景问题:因为项目是阀件,电机转子带动的负载有一定重量,需要一定的启动力矩。如果指令频率较高,转子跟不上磁场转速,会导致启动时堵转或失步,因此客户要求做软起动设计。如果驱动频率从50pps(每秒脉冲数,即50Hz) 瞬间跳到500pps,这样升速曲线太陡,同样电机的转子会因为惯性跟不上磁场的变化而失步。也就算不上软启动了。
通常的解决思路是在算法上做手脚,可以采用S形曲线或梯形曲线来升频。在启动初期(低速区),加速度可以稍快;在接近目标转速时,加速度需要放缓,确保转子能平滑地“拖入”同步。
这里我使用的是梯形曲线升频,也就是简单的线性加减速,简单直接!启动频率和目标频率可以通过485进行配置,并将配置存储在E2中,客户要求1s完成升频(启动50pps是一个非常低的频率,步进电机在这个频率附近会有比较明显的振动。所以我们限定了升频时间),根据目标频率自动计算加减速时间,通过调整定时间重装载值,来调整STEP脉冲信号的周期,直到目标频率与实际频率相等后,进入稳态运行。
频率每pps的调整间隔ms = 1000ms / (目标频率pps - 起始频率pps)每个STEP时间间隔us = 1000 000us / (当前频率pps * 细分数)定时重装载值 = STEP时间间隔us * 系统时钟hz - 1
4.3. LV8731线序检测保护设计
因客户需要,当接线步进电机线序接错时,软件提供保护并告警。由于我这里没有反馈,这里我利用了LV8731V的MONI(位置检测输出)和电流采样检测来判断接线是否正确。
首先计划让电机缓慢转动,硬件有设计A+A-,B+B-的2相电流检测点,即通过ADC检测RF电阻两端的电压来换算出相电流,IOUT(A) = (VREF(V) / 5) / RF(Ω)。然后检查电流的变化模式是否符合预期(励磁顺序)来确保是否接线正确。
但是实际这里有个关键的破绽,我只能检测电流大小。因为这里RF对地的,所以只能检测到正电压,至于相电流的方向我就不知道了,因此这个线序保护只能判断是AB相之间是否接错,如果是A+A-或者B+B-接反了就没办法了,因为这样电机还是可以转的,不过方向错误了,原本正转变反转。
最终实际测试下来确实如此,只能检测到电压有无,对象电流的大小区分也不明显,因为电流波动受负载影响,即使我知道这个相位的电流是最高电流的70%,但是最高电流的大小是波动的,启动电流可能瞬时过高。此外当细分过多时,电流差距较小,而且分了正负方向,无法通过算法简单判断相序。
思考后发现了一个相对可靠的方法,我可以检测到是否有相电流,这意味着所有负向电流是折叠上去变成正电流。这样两项励磁被排除,因为无论是第几个脉冲翻折上去全是高电平。不过1-2相励磁可以,2细分,翻转上去依旧可以辨认。A相:11011101,B相:011101110。这样匹配励磁顺序是否正确即可。
4.4. 状态机设计
- 顶层:系统级状态(上电、初始化、主循环)
- 中层:业务逻辑状态(阀控制、驱动进程、速度控制、方向控制)
- 阀控制: Close → First → Delay → Second → Complete
- 驱动进程: Stop → Start → Steady → Complete
- 速度控制: Keep ↔ Add ↔ Sub
- 方向控制: CW ↔ CCW
- 底层:硬件控制状态
4.5. 保护设计
- 线序检测保护
- 过流保护,实时检测相电流(AD采集,RF两端电压)
- 电源电压保护,检测输入电压
- EMO保护,LV8731V芯片自带保护(过流、过热)
- 位置保护,阀体机械限位
- E2、通信、…
常见问题
LV8731V双路驱动直流电机报过流问题
背景:项目采用LV8731V作为双路电机驱动芯片,用于驱动两个24V三通阀。
系统结构:使用LV8731V驱动双路直流电机(额定电压均为24V)、双H桥结构、采样电阻0.3Ω、通过MONI、EMO引脚判断故障状态、驱动对象为客户采购的三通阀(内部直流电机)
使用阀A电机启动即报过流,因为驱动芯片相同、电源相同、软件逻辑相同、接阀B正常、因此第一直觉判断:可能是阀A电机存在问题。而且EMO可能检测的是H桥MOSFET的电流或温度,阈值为芯片内部固定值,无法通过外部采样电阻调节。所以还是考虑电机负载特性差异导致。
电机堵转了?尝试直接将24V怼到正负级上,电机可正常运行。
于是跟硬件沟通,经过硬件测试,可能由于电机电感较小、或者电机电阻较小,di/dt = V / L电流上升速度于电机电感有关,阀A电机电感较小,电流上升速度快,容易产生电流尖峰,触发保护。
尝试为阀A串联电阻,限制最大电流。问题解决。
软件方面增加了软起动功能的设计,限制启动电流过大问题。降低设定目标电流,设定目标电流不超过2A。
4.3. 系统断电了,电机位置无法获取
因为没有反馈,所以不知道电机当前位置。只能依靠初始化来重新归零。
设计归零逻辑,工业阀体,直接全关阀归零。并增加备用电源,当检测到断电时,利用备用电源,完成一次关机动作,防止断电后系统异常。
参考资料
-
三洋半导体. (2010). LV8731V-PWM定电流控制步进电机驱动https://d1.amobbs.com/bbs_upload782111/files_35/ourdev_605820GJFEZG.pdf ↩