基于FPGA的步进电机的PWM控制细分驱动的实现.docx
《基于FPGA的步进电机的PWM控制细分驱动的实现.docx》由会员分享,可在线阅读,更多相关《基于FPGA的步进电机的PWM控制细分驱动的实现.docx(25页珍藏版)》请在冰豆网上搜索。
![基于FPGA的步进电机的PWM控制细分驱动的实现.docx](https://file1.bdocx.com/fileroot1/2023-2/24/f846261c-377e-4ecb-97c6-42ac5acf852d/f846261c-377e-4ecb-97c6-42ac5acf852d1.gif)
基于FPGA的步进电机的PWM控制细分驱动的实现
山东大学
威海分校
课程设计报告
设计题目:
_基于FPGA的步进电机的PWM控制_
___________——细分驱动的实现_
姓名___秦正运______
学号20059002029
院系__信息工程学院_
专业_电子信息科学与技术
年级___05____________
2009年5月3日
目录
目录2
摘要3
关键词3
Abstract3
Keywords3
一、引言4
二、步进电机细分驱动的基本原理4
三、QuartusII概述5
四、课题设计6
(一)总体设计6
(二)细分电流的实现6
(三)细分驱动性能的改善6
(四)程序设计7
六、仿真与测试结果分析10
七、结论12
参考文献13
注释14
附录15
谢辞21
摘要
在对步进电机细分驱动原理进行分析研究的基础上,提出一种基于FPGA控制的步进电机细分驱动器。
利用FPGA中的嵌入式EAB构成LPM-ROM,存放步进电机各相细分电流所需的PWM控制波形数据表,并通过FPGA设计的数字比较器,同时产生多路PWM电流波形,实现对步进电机转角进行均匀细分控制。
实验证明,所研制的步进电机驱动器不仅体积小,简化了系统的设计,减少了延迟,改善了低频特性,有良好的适应性和自保护能力,提高了驱动器的稳定性和可靠性。
关键词
步进电机;细分驱动;脉宽调制;FPGA
Abstract
Inthispaper,adivideddrivingcircuitforsteppingmotorcontrolledbyFPGAisputforward,basedontheanalysisoftheprincipleofsteppingmotordivideddriving.UsingembeddedEABinFPGAtocomposeLPM-ROM,storePWMcontrolwaveformdatawhichsteppingmotoreachphasesubdivideddrivingcurrentisneeded.ThemagnitudecomparatordesignedwithFPGAgeneratesseveralPWMcurrentwaveformsynchronously,torealizethestepanglesevendivisioncontrolforthree–phasesteppingmotor.Experimmentshaveprovedthatthedevelopedsubdivisiondriverisnotonlysmaller,samplerinsystem,canshortenthedelaytime,improvethestabilityinlowfrequency,buthasgoodself-adaptationandself-protectionability,anditsstabilityandrelibilityarehigher.
Keywords
steppingmotor;divideddriving;PWM;FPGA
一、引言
步进电机是把脉冲信号转换成角位移或直线位移的执行元件,是一种输出与输入数字脉冲相对应的增量驱动元件。
具有定位精度高、惯性小、无积累误差、启动性能好、易于控制、价格低廉及与计算机接口方便等优点,被广泛应用于数控系统中。
但由于脉冲的不连续性又使步进电机的运行存在许多的不足之处,如低频震荡,噪声大,分辨率不高及驱动系统的可靠性差等,严重制约了其应用范围。
步进电机的细分控制有效的解决了这一问题,步进电机细分驱动技术可以减小步进电机的步距角,提高电机运行的平稳性,增加控制的灵活性等。
但是传统的步进电机驱动大多数采用的是用单片机作为控制芯片,外加分立的数字逻辑电路和模拟电路构成。
受单片机工作频率的限制,细分数不是很高,因此控制器的精度较低,控制性能不是很理想。
近年来随着可编程逻辑器件的飞速发展,似的可编程逻辑器件功能越来越强大从而促使高集成化高精度的驱动器的出现。
本系统是以FPGA为核心的控制器件,将驱动逻辑功能模块和控制器成功地集成在FPGA上。
利用FPGA中的嵌入式EAB可以构成存放电机各相电流所需的控制波形表,再利用数字比较器同步产生多路FPGA电流波形,对多相步进电机进行控制。
若改变控制波形表的数据、增加计数器和比较器的位数,提高计数精度,就可以提高PWM波形的细分精度,进而对步进电机的步进转角进行任意级细分,实现转角的精确控制。
二、步进电机细分驱动的基本原理
步进电机的驱动是靠给步进电机的各相励磁绕组轮流通以电流,实现步进电机内部磁场合成方向的变化来使步进电机转动的。
设矢量Ta、Tb、Tc、Td为步进电机A、B、C、D四项励磁绕组分别通电时产生的磁场矢量;Tab、Tbc、Tcd、Tda为步进电机中AB,BC,CD,DA两相同时通电产生的合成磁场矢量。
当步进电机的A、B、C、D四相轮流通电时,步进电机内部磁场从TA→TB→TC→TD,即磁场产生了旋转。
一般的,当步进电机的内部磁场变化一周时,电机的转子转过一个齿距,即改变一次通电状态,转子转过一个步距角。
该步距角的计算公式为:
其中:
α代表接入绕组的线路状态数,m代表电动机的相数,Zx代表转子齿数。
由此可见,步进电机一旦制造出来,其相数与转子齿数将为定值,要想减小步距角,以达到细分的目的,用户能改变的只有α。
在无细分的步进电机驱动系统中,通过各相绕组的电流幅值是不变化的,仅在各相通电状态变化时,α值才相应地变化。
如对于四相步进电机来说,单四拍或双四拍运行时,α=l;当电机以四相八拍运行时,α=2,实现了步距角的二细分。
由于各相绕组的电流是个开关量,即绕组中的电流只有零和某一额定值两种状态,相应的各相绕组产生的磁场也是个开关量,只能通过各相电流的通电组合来改变步距角。
所以要想增大α,必须使绕组中的电流按阶梯上升和下降,即在零与最大相电流之间有多个稳定的中间电流状态,相应的磁场矢量幅值也存在多个中间状态,这样,相邻两相或多相的合成磁场的方向也将有多个稳定的中间状态。
图1所示为四相步进电机八细分时各相电流波形,各相电流均以最大电流值的1/4上升和下降。
与单四拍方式相比,α值从2增加到8,步距角θb为单四拍运行方式时的1/8。
所以步进电机细分驱动的关键在于控制电机各相励磁绕组中的电流大小及其稳定性。
C相
图1三相步进电机八细分各相电流状态图
改变步进电机相电流通常采用电流矢量恒幅均匀旋转的细分方法来实现,即同时改变两相电流iA和iB的大小,使电流合成矢量等幅均匀旋转。
iA和iB的变化曲线可描述为:
iA=Imcosx
iB=Imsinx
三相步进电机八细分时的各相电流是以1/4的步距上升或下降的,在两相稳定的中间状态,原来一步所转过的角度将由八步完成,实现了步距角的八细分。
三、QuartusII概述
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
MaxplusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。
目前Altera已经停止了对MaxplusII的更新支持,QuartusII与之相比不仅仅是支持器件类型的丰富和图形界面的改变。
Altera在QuartusII中包含了许多诸如SignalTapII、ChipEditor和RTLViewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了MaxplusII友好的图形界面及简便的使用方法。
四、课题设计
(一)总体设计
从图1中可以看出,一般情况下总有二相绕组同时通电。
一相电流逐渐增大,另一相逐渐减小。
对应于一个步距角,电流可以变化N个台阶,也就是电机位置可以细分为N个小角度,这就是电机的一个步距角被N细分的工作原理。
也可以说,步距角的细分就是电机绕组电流的细分,从而可驱动步进电机平滑运行。
图2为步进电机细分驱动系统结构图。
步距细分电路是由PWM计数器、ROM地址发生器、PWM波形存储器、比较器、功放电路所组成。
其中,PWM计数器在时钟脉冲作用下递增计数,产生阶梯形上升的周期性锯齿波,同时加载到三相步进电机各相数字比较器的一端;波形ROM输出的数据q[8..6]、q[5..3]、q[2..0]分别加载到比较器的另一端。
当PWM计数器的计数值小于波形ROM输出数值时,比较器输出高电平;而当大于波形ROM输出值时,比较器输出低电平。
由此可输出周期性的PWM波形。
根据图1步进电机八细分电流波形的要求,将各个时刻细分电流波形所对应的数值存放于波形ROM中,波形ROM的地址由地址计数器产生,地址计数器有3个控制端,可用于改变步进电机的旋转方向、转动速度、工作/停止状态。
FPGA以产生的PWM信号控制驱动电路的导通和关断。
PWM信号随ROM数据而变化,改变ROM中的数据就可以改变输出信号的占空比,实现限流及细分控制,最终使电机绕组电流呈现阶梯形变化,从而达到步距细分的目的。
图2步进电机细分驱动系统结构图
(二)细分电流的实现
从LPM_ROM输出的数据加在比较器的A端,PWM计数器的计数值加在比较器的B端,当计数值小于ROM数据时,比较器输出低电平;当计数值大于ROM数据时,比较器输出高电平。
如果改变ROM中的数据,就可以改变一个技术周期中高低电平的比例。
(三)细分驱动性能的改善
在线性电流的驱动下,步进电机的微步进是不均匀的,呈现出明显的周期性波动。
磁场的边界条件按齿槽情况呈周期性重复是导致微步距周期性变化的原因。
同时,不可避免的摩擦负载(摩擦力矩是不恒定的,或者说在一定范围内也是不确定的)以及其他负载力矩的波动导致失调角出现不规则的小变动或小跳跃,也使微步距角曲线在周期性波动上出现不光滑的小锯齿形。
步进电机的电流矩角特性并非线性函数,而是近似于正弦函数。
若电流呈线性上升或者下降,必然会造成每一细分步的步距角不均匀,从而影响步距精度。
为此,要在设计中提高LPM_ROM的数据精度,将数据提高到16位,使输出的步进细分电流近似为正弦电流,这样不仅提高了步距精度,而且可以改善低频震荡。
(四)程序设计
图3为步进电机PWM控制电路。
CNT8是十六进制计数器,构成PWM计数器,将整个PWM周期分成4等份,产生阶梯形上升的周期性锯齿波,同时加载到四相步进电机各相数字比较器的一端;CNT32是三十二进制计数器构成ROM地址发生器,计数器的u_d为方向控制,EN为使能控制,clk_d为速度控制,可以通过u_d、EN和clk_d控制步进电机的旋转方向、工作/停止和旋转速度;s为模式选择控制,可以选择正常运转模式或者是细分驱动模式。
ROM是宽度为16位,深度为32位的存储器,存放了各个时刻细分电流波形所对应的数值;CMP为数字比较器,用于ROM输出的数据和PWM计数器计数值的比较。
输出细分电流信号采用FPGA中ROM查表法,它是通过在不同地址单元内写入不同的PWM数据,用地址选择来实现不同通电方式下的可变步距细分。
从ROM输出的数据加在比较器的“a”端,PWM计数器的计数值加在比较器的“b”端,当计数值小于ROM数据时,比较器输出高电平;当计数值大于ROM数据时,比较器则输出低电平。
如果改变ROM中的数据,就可以改变一个计数周期中高低电平的比例。
图3步进电机PWM控制电路
下面具体来阐述一下各个元件的设计:
图5为十六进制计数器的RTL图,通过不断输出十六进制数与ROM中的数据作比较。
计数器的VHDL语言程序见附录2.
图4十六进制计数器
图6为三十二进制计数器RTL图,可以输出五位二进制的地址,以便可以查询ROM表。
程序见附录3。
图5三十二进制计数器
图六为四个比较器的RTL图,当计数值小于ROM数据时,比较器输出高电平;当计数值大于ROM数据时,比较器则输出低电平。
比较器的输出为步进的四相输入端提供PWM波形,从而达到PWM控制。
程序见附录4
图6比较器
图7为多路选择器,利用s端可以选择控制步进电机的运转方式,s=0时,步进电机为PWM控制,s=1是步进电机的普通运转方式。
程序见附录5.
图7多路选择器
图9的功能是从三十二进制计数器的输出端引入数据并把它转化成步进电机的普通四相驱动方式。
程序见附录6
图8计数转换器
PWM波形ROM表是通过QuartusII中的宏功能模块定制而成,利用FPGA中的嵌入式EAB构成LPM-ROM,存放步进电机各相细分电流所需的PWM控制波形数据表。
ROM数据和程序见附录7和附录8.
六、仿真与测试结果分析
图9是四相步进电机PWM仿真波形图,图中展示了FPGA控制步进电机的情况。
ROM输出的16位数据q[15..0],作为步进电机各相电流的参考值,每4位二进制(l位八进制)数值控制一个相,分别用于控制步进电机A、B、C三相的工作电流。
对于每一相来说,当输出数据为0时,该相电流为0;输出数据为1时,脉宽高电平占一个PWM周期的1/4;当输出数据为2时,脉宽高电平占一个PWM周期的2/4;当输出数据为4时,整个PWM周期均输出高电平。
PWM输出电流的平均值与旋转角度成正比。
图9中也给出了步进电机从A->AB->B->BC->C->CD->D->DA四相八拍工作过程的仿真波形。
首先,步进电机A相导通,B、C、D相截止,q[15..0]输出数据为F000;A相的数据为F,其他相的数据为0。
然后逐渐过度到AB相导通,q[16..0]输出数据为F600->F900->FC00->FF00,B相的数据逐渐增大,从1增大到4。
电机中的磁场经过4拍,从A相转到了AB相。
再经过4拍,从AB相转到B相;q[15..0]输出数据为CF00->9F00->6F00->0F00,A相的数据逐渐减小,从4变为0。
从A到AB到B共经过了8拍,实现了步距角的8级细分。
此外由于步进电机是电感性负载,对输出的PWM电流具有平滑滤波作用,对电机线圈起作用的是PWM的平均电流,因此在效果上将图中的细小毛刺电流滤除。
图9仿真波形1
图10是在clk_d的频率比较高的情况下的仿真图。
和图9比较可以看出,clk_d的频率越大,PWM波形比较密集,步进电机的转速越高,即clk_d是速度控制信号。
图10仿真波形2
图11和图9对比,可以看出,当u_d为高电平时,ROM表中输出的数据和图9顺序相反,输出的PWM波形也和图9相反。
因此,步进电机的内部磁场从D→DC→C→BC→B→AB→A→DA,电机反转。
图11仿真波形3
图12是在s为高电平时的仿真图,当s=1时,步进电机为单四拍常规运转方式,内部磁场从AB→BC→CD→DA。
实测结果表明,要是步进电机细分后获得均匀的步进转角,其PWM驱动电流应近似于正弦电流,而非线性递增的电流,因此ROM文件中的数据进行适当选择,使每一步的电流增加量近似正弦波,并根据实际转角做了适当调整。
由于PWM的输入时钟频率较高,因此可以获得均匀的平均电流,并且每一步的时间间隔相等,转角近似均匀。
七、结论
通过利用FPGA中嵌入式EAB构成的LPM-ROM存放电机转角细分电流所需的数据表,由数字比较器同步产生多路PWM电流波形,对多相步进电机的转角进行均匀细分,有效地控制步进电机。
若提高波形表数据的位数,增加计数器和比较器的位数,就可以提高PWM波形的细分精度,对步进电机的步进转角进行任意细分,实现步进转角的精确控制。
此实现方法比目前单片机加D/A的控制方案更加高效。
试验证明,此系统功能满足设计要求,控制灵活,集成度高。
驱动器在减少体积、降低开发成本的同时,又增加了稳定性和可靠性,具有较好的动态和静态驱动特性,有效地提高步进电机的运行效果。
参考文献
[1]李华德等,交流调速控制系统.北京:
电子工业出版社,2003.3:
22-27
[2]潘松等,EDA技术实用教程[M].北京:
科学出版社2005
[3]雷凯等,步进电机细分驱动中绕组电流的修正[J].苏州大学学报2003.1:
38-40
[4]杨忠宝,林海波,基于80C196MC的步进电机斩波恒流均匀细分电路的实现[J].微计算机信息2003.7:
51-52
[5]袁丽肖,王健等,直接转矩控制系统的自适应模糊控制方法的研究[J].微电机2006.33(9):
26-29
[6]翁良科,伊仕.基于VerilogHDL描述的多用途步进电机控制芯片的设计[J].电子技术应用,2002
[7]程浩.三相混合步进电机细分驱动的研制[D].浙江:
浙江大学.2001
[8]李恩光.机电伺服控制技术.东华大学出版社,2003
注释
PWM技术:
脉宽调制(PWM:
(PulseWidthModulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
简而言之,PWM是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。
通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。
只要带宽足够,任何模拟值都可以使用PWM进行编码。
PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。
让信号保持为数字形式可将噪声影响降到最小。
噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。
对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。
从模拟信号转向PWM可以极大地延长通信距离。
在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。
附录
附录1:
顶层程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydjxfis
port(clk,clk_d,u_d,s,en:
instd_logic;
y:
outstd_logic_vector(3downto0));
endentitydjxf;
architecturebehavofdjxfis
componentcnt8
port(clk:
instd_logic;
cq:
outstd_logic_vector(3downto0));
endcomponent;
componentdec2
port(clk:
instd_logic;
a:
instd_logic_vector(1downto0);
d:
outstd_logic_vector(3downto0));
endcomponent;
componentcnt32
port(clk,en,u_d:
instd_logic;
cq:
outstd_logic_vector(4downto0));
endcomponent;
componentpwm_rom
PORT
(
address:
INSTD_LOGIC_VECTOR(4DOWNTO0);
inclock:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(15DOWNTO0)
);
endcomponent;
componentcmp
port(a,b:
instd_logic_vector(3downto0);
agb:
outstd_logic);
endcomponent;
componentmux
port(a,b:
instd_logic_vector(3downto0);
s:
instd_logic;
y:
outstd_logic_vector(3downto0));
endcomponent;
signalsgn1:
std_logic_vector(3downto0);
signalsgn2:
std_logic_vector(4downto0);
signalsgn3:
std_logic_vector(15downto0);
signalsgn4,f:
std_logic_vector(3downto0);
begin
u1:
cnt8portmap(clk=>clk,cq=>sgn1);
u2:
cnt32portmap(clk=>clk_d,en=>en,u_d=>u_d,cq=>sgn2);
u3:
pwm_romportmap(inclock=>clk_d,address=>sgn2,q=>sgn3);
cmp1:
cmpportmap(a=>sgn3(15downto12),b=>sgn1,agb=>f(3));
cmp2:
cmpportmap(a=>sgn3(11downto8),b=>sgn1,agb=>f
(2));
cmp3:
cmpportmap(a=>sgn3(7downto4),b=>sgn1,agb=>f
(1));
cmp4:
cmpportmap(a=>sgn3(3downto0),b=>sgn1,agb=>f(0));
u4:
dec2portmap(clk=>clk,a=>sgn2(1downto0),d=>sgn4);
m:
muxportmap(a=>f,b=>sgn4,s=>s,y=>y);
endarchitecturebehav;
附录2:
十六进制计数器
libra