步进电机控制(使用VHDL)

逻辑主页

代码下载

AccelerationLimitedMotorController.vhd (3.9 KB)
AccelerationLimitedPositionControl.vhd (6.2 KB)
cosine.vhd (3.4 KB)
PWMcomparator.vhd (3.3 KB)
UPDOWNcounterANDswitch.vhd (4.6 KB)

引言

步进电机作为离散状态设备,在需要精确定位或速度控制时极具价值。这种离散特性使其特别适合数字系统控制。虽然微控制器适用于此场景,但可编程逻辑器件(PLD)具有多项优势。PLD作为更节能灵活的系统,能轻松实现通信标准的片上集成、并行处理能力,以及多电机控制所需的高引脚数量。本文将探讨使用超高速集成电路硬件描述语言(VHDL)编程PLD实现步进电机控制器的基本要点。

背景知识

步进电机属于离散状态设备。由于双绕组电机最为典型,本文仅讨论此类电机(但所述原理同样适用于更多绕组的电机控制)。

1. 简化45º双极永磁步进电机控制系统。注意两个相对绕组间距为磁极重复距离的1/4,这对应着各绕组作用力间90º的相位差。中间驱动电路(晶体管)用于承载电机电流,二极管则保护开关免受感应反冲。

当恒定电流通过电机绕组时,会产生具有固定节点的近似正弦转矩曲线(图2中蓝色曲线)。电机半数步位处于曲线节点,但只有其中半数是电机趋向的最低能量状态。电流反转(图2青色曲线)会使正弦曲线沿零转矩轴翻转,最高与最低能量状态互换,导致电机始终位于两个最近低能态的中间位置,因此单绕组几乎无法控制电机。引入第二个绕组后,可控制其正弦曲线的节点位于第一组曲线节点的中间位置(图2红橙曲线)。由于两组绕组曲线可直接叠加,最终转矩-转角曲线的相位变得可控。

2. 双绕组电机中驱动电流I与-I通过任一绕组产生的独立转矩。需注意任一时刻每个绕组仅产生一条转矩正弦曲线。

在步进循环控制中,我们考虑两个三态变量(每个绕组对应一个)的可能性。每个绕组电流有I、0或-I三种状态,因此共有九种组合。按照特定顺序和速率循环切换相关状态,就构成了步进电机的基础控制方式。若认识到绕组电流可获取模拟值,则可使两相电流幅值呈90°相位差的正弦变化,从而生成更精确的扭矩波形供电机运行。这种称为正弦微步进的控制方法,与驱动同步电机原理相似。

与绝大多数情况相同,电机工作电流远超PLD直接驱动能力。因此需要通过外部驱动晶体管来切换电机绕组的电流。所需外部硬件已超出本应用笔记范围,故不作讨论。

现有大量文献涉及步进电机控制的配套硬件。《Jones步进电机指南》(Jones on Stepping Motors)全面介绍了步进电机基础知识,是易于获取的权威参考资料。

应用

使用PLD控制步进电机时,需考虑多个代码组件。具体实现取决于电机驱动方式(步进循环或微步进)。

无论选择哪种驱动方式,基础步进电机控制系统都需特定输入输出。控制输入通常为速度或位置(或两者兼具)。另一重要输入是基准时钟信号,用于确定其他关键控制频率。输出端对应单极电机每绕组需2个开关位,双极电机每绕组需4个开关位,实际配置可能因所选驱动硬件而异。

步进循环控制

半步进或全步进控制是步进电机最简单的控制方式。双绕组电机对应四状态或八状态机,每电机分别输出4或8个控制信号。

3. 简易双极步进电机速度控制单元UPDOWN计数器在forward为’1’时递增状态,为’0’时递减。状态切换速率取决于速度值及系统基准时钟频率。MotorOutput模块将可变状态转换为直接连接图1晶体管的控制位。

速度控制需要可调频的升降计数器。锁相环(PLL)无法满足频率控制要求,通常需定制时钟或计数器控制单元。生成新时钟的简易方法是采用复位计数器,其周期与目标速度成反比。以下代码段展示了一个基于速度和方向输入推进状态变量的简单流程。

PROCESS (clk)

  VARIABLE t :INTEGER RANGE 0 TO 2097151:= 0;

  CONSTANT dividend :INTEGER RANGE 0 TO 1048575:= 498047;

BEGIN

  IF (clk'EVENT AND clk='1') THEN

    IF (speed > 0) THEN

--t increments at the same frequency of clk and corresponds with

--how much time (in periods of clk) is taken before state is

--incremented. Speed, in short, increases how fast speed*t

--increments and changes how quickly states are stepped through.

      t := t + 1;

      IF (CONV_INTEGER(speed)*t >= dividend) THEN

        t := 0;

--The following 5 code lines either increment or decrement the state.

--With only 4 or 8 states needed, a nice round 2 or 3 bit number

--will suffice for state and automatically roll over from 0

--to the highest value or visa versa. Also, if state is expanded

--beyond the two or three bits its entire value is representative of

--the motor’s position where the 2 or 3 least significant bits are

--all that are needed to control the current through the windings.

--The bit forward represents which direction the motor should turn.

        IF (forward = '1') THEN

          state <= (state + 1);

        ELSE

          state <= (state - 1);

        END IF;

      END IF;

    END IF;

  END IF;

END PROCESS;

常数除数由以下等式确定:

其中(速度分辨率 - 1)等于速度允许的最大数值。

对于位置控制,状态变量可以方便地扩展到超过必要四步或八步(这恰好对应任何二进制数的前两到三位),以更全面地反映电机当前位置。除了增加位置数据范围外,还需要一个独立的控制单元来步进电机至目标位置。以下示例是实现此功能的简单方法:

PROCESS(clk)

  VARIABLE t :INTEGER RANGE 0 TO 2097151:= 0;

  CONSTANT dividend :INTEGER RANGE 0 TO 1048575:= 498047;

BEGIN

  IF (clk'EVENT AND clk='1') THEN

    IF (speed > 0) THEN

      t := t + 1;

      IF (CONV_INTEGER(speed)*t >= dividend) THEN

        t := 0;

--the following SIGNAL position has replaced SIGNAL state and is

--meant to be far more than 2 or 3 bits

        IF (forward = '1') THEN

          position <= (position + 1);

        ELSE

          position <= (position - 1);

        END IF;

      END IF;

    END IF;

  END IF;

END PROCESS;

state <= position(2 DOWNTO 0);

---For half-stepping, 3 bits are used; for full-stepping, 2

speed <= '1' WHEN (position /= positionintended) ELSE '0';

forward <= '0' WHEN (position > positionintended) ELSE '1';

若驱动负载具有较大惯性,限制加速度可能成为极其重要的问题。这种情况下,若加速度过大电机会打滑,导致开环位置或速度控制出现误差。解决此问题的简单方法是使用另一个加减计数器,随时间线性递增实际旋转速度;当目标速度较大时实际速度递增,目标速度较小时实际速度递减:

4 .实际速度会根据目标速度安全地增减。注意增速和减速的斜率不同,这对应电机所能实现的加速与减速差异。

PROCESS (clk)

  VARIABLE t     :INTEGER RANGE 0 TO 2097151:= 0;

  CONSTANT accel :INTEGER RANGE 0 TO 2097151:= 390625;

  CONSTANT decel :INTEGER RANGE 0 TO 2097151:= 195312;

BEGIN

  IF (clk'EVENT AND clk = '1') THEN

    t := t + 1;

    IF (t > accel) THEN

      IF (vactual < vintended AND vactual > 0) THEN

        vactual <= vactual + 1;

        t:=0;

      ELSIF (vactual > vintended AND vactual < 0) THEN

        vactual <= vactual - 1;

        t:=0;

      END IF;

    END IF;

    IF (t > decel) THEN

      IF (vactual < vintended AND vactual < 0) THEN

        vactual <= vactual + 1;

        t:=0;

      ELSIF (vactual > vintended AND vactual > 0) THEN

        vactual <= vactual - 1;

        t:=0;

      END IF;

    END IF;

  END IF;

END PROCESS;

通常可假设电机加减速率相同来简化此代码段。无论如何,常数accel和decel可通过以下等式确定:

(2)

这是忽略位置的速度控制的优秀解决方案,但往往不符合需求。对于加速度补偿的位置控制,当加速度非零时位置与速度不再呈线性关系,因此可能需要通过计算实现加速、恒速滑行和减速至目标最终位置的平稳停止。

利用前述元件实现自适应加速度位置控制的一种方法,是创建基于目标减速的实际速度拟接近的目标速度-位置曲线。忽略积分常数并使用加速度、速度及位置的基本时间方程,可得出:

(3)

(4)

通过常识可得出目标速度与∆p的关系(∆p=目标位置-当前位置):

(5)

5. 采用速度逼近算法安全移动到最终目标位置时,速度与位置的参数化表示。

此解决方案的固有问题是:为保证时间连续函数,实际速度必然滞后于目标速度。另一个问题是需要将目标速度曲线与限制速度的减速过程相匹配,因为不匹配会导致系统看似过阻尼或欠阻尼。一种解决方案是在目标速度与实际速度相交时直接遵循方程,但这需要考虑额外可能复杂的编码。

这种加速度补偿位置控制方案的一个优势是其故障安全性。利用它,可以在到达最终位置之前的任何时间安全地即时更改目标最终位置,而无需重新计算位置与时间的关系或完成移动到先前目标位置。

从一个位置移动到另一个位置的更常见方法是使用电机位置数据和电机的目标最终位置来计算步间停顿时间。当涉及位置控制时,这个系统不太适合在运行中改变决策,但在需要精确控制且决策改变不是问题时(遵循预定义指令)非常出色。在这种情况下,用于逐步增加和减少速度以确保恒定加速度的计数器并不理想,因为基于时间以不同方式递增的两个变量可能导致系统位置的不准确性。

如果需要一个简单的点到点控制系统,并且假设电机将保持忙碌并在遵循新指令之前停止,则可以使用以下简单近似方程:

(6)

Δt是步间需要等待的时间,Δx是电机每次状态变化移动量的常数,s(速度)可以如下计算,其中Δp是目标位置减去当前位置,Δn是初始位置减去当前位置:

(7)

6 .速度与点到点运动的位置曲线。
可以构建一个计数器,等待必要的时间量,并朝目标方向相应地步进。此外,应注意使Δn略微偏移,使其永远不为零。

微步进

通过微步进驱动步进电机有几个原因,更好的精度和减少共振影响(步进频率与机械负载振动频率匹配的抑制效应)只是其中两个。通过一些添加和修改,先前的设计元素可以非常简单用于微步进。

对于纯开环电机控制,脉宽调制(PWM)是改变电机绕组时间平均电流的绝佳手段。因此,讨论了一个PWM生成电路。

7 PWM单极步进电机控制器的组件示意图和简单时序图。

第一个需求是一个固定频率的脉宽调制(PWM)基础计数器,类似于模拟PWM生成的锯齿波函数。计数器重置的频率是主PWM频率,而递增的频率是基础频率。主频率应限制在10KHz至30KHz之间。较低频率是产生可听噪声的来源。频率越高,外部驱动器的功率效率会逐渐降低,并可能产生大量相关电磁干扰。基准频率应等于主PWM频率乘以脉宽分辨率。该频率可能不足以匹配正弦波状态步进,但在如此高频下应考虑切换至全步进电机的优势。

计数器输出作为第二附加元件的输入:一个比较器组。这根据PWM值是大于还是小于另一个输入值来控制开关。

另一个逻辑元件是正弦函数或查找表。对于此应用,查找表可节省时间、处理能力以及可能的芯片空间,其低分辨率完全能满足微步进电机控制需求。输入分辨率决定每个正弦波的状态数,输出分辨率与脉宽分辨率相同。该元件输出的是比较器元件的正弦值。

由于每个绕组的扭矩-旋转位置曲线并非完美正弦,使用理想正弦查找表未必总是最佳方案。此外,绕组施加不同电压时,曲线形状也不总相同。为提高电机微步进精度,可调整此正弦表以补偿电机扭矩-旋转位置曲线的缺陷。在下述方程中,n为0至StatesPerSinusoid -1的整数,K 为通常小于1的实数,可通过调整使曲线达到控制器所需精度。此技术是快速修复方案,虽不能保证始终有效,但通常能在低步进频率下实现肉眼可见的改进。

(8)

仍可使用先前的增减计数器,但因状态循环数超过四个或八个,必须重新计算恒定被除数。方程(1)仍适用。

需注意PWM控制的微步进在较高电机转速下会逐渐失去准确性和相关性。当电机电感特性开始主导时,正弦PWM不会在绕组中产生完全正弦的电流,且转子实际位置将滞后约整个步距,直至接近失步点。此外,由于步进循环会使绕组平均电流更高,其驱动电机的速度可能略快于微步进固有能力。

闭环电流控制器

步进电机通常连接过高电压电源,以补偿电机电感特性,从而实现更快响应。这意味着需要某种电流限制,通常选择外部斩波电路作为工具。

8. 一种可行的电流限制硬件配置。锁存器的Q位与开关数据总线的一线进行与操作,从而在与门处输出等效宽度的总线信号。

基于硬件电流斩波器控制步进电机的唯一区别在于放弃了用于微步进的PWM生成。简单循环步进电路在有无电流斩波硬件驱动器时表现同样出色,但微步进控制需要将电机实际电流与预设正弦波查找表数据进行比对。实现方式有多种,最常见且简单的是使用数模转换器(DAC)输出正弦数据至外部比较器(替代图8中的恒定偏置电压源)。采样速率至关重要,因为过慢的系统可能无法按预期周期运行。为匹配正弦数据输出,DAC必须以等于状态推进频率的速率转换数据(通常不超过30KHz)。

遵循指令集

在多电机协同控制等场景中,当需要极高精度的速度位置协调时,最佳方案可能是为电机每个步进动作提供基于时间的指令。无需硬编码最大速度和加速度的安全参数,生成指令时直接纳入这些限制条件即可。该系统计算复杂度可能更高,但能确保电机位置更精准地按预期时空轨迹运动。这种方案很可能需要更大存储容量。

示例

本应用笔记附有两个完全相同的VHDL示例代码,用于加速度补偿动态位置单极电机控制系统。第一个文件夹包含为ALTERA DE2(开发与教育)板构建的完整Quartus工程。第二个文件夹仅包含组件和包VHDL代码的独立文本文件。

该代码设计用于通过每步64状态的微步进控制100步/转的双绕组双极电机(Portescap 42M100B1B)。控制系统限制电机正反方向最大转速为每秒四转。电机加速度限制为每秒²两转,减速度限制为每秒²四转。正弦表已基于对称性假设简化,并通过公式(8)中K=0.7的系数调整以匹配电机特性。

9. 示例代码的示意图表示。在ALTERA DE2板上,引脚分配对应:开关阵列连接pi(目标位置),50MHz时钟连接clk,第一个通用IO接口左侧前四个引脚连接电机开关。

可使用任何PLD,但系统设计基于ALTERA DE2板搭载的Cyclone II EP2C35F672C6N PLD,其采用50MHz时钟。若使用不同基频信号,必须修改特定常数,因此本应用笔记中的公式在代码注释中重复给出。18位位置输入数据由DE2板上18位开关阵列的简单按位表示提供,若不使用DE2板,需另寻方式向PLD传输18位二进制数。

10. 示例中电机驱动电路的示意图。

结论

本文介绍了几种基于VHDL的简单PLD步进电机控制器的基本设计要点。