FPGA步进电机细分控制电路设计方案.docx
《FPGA步进电机细分控制电路设计方案.docx》由会员分享,可在线阅读,更多相关《FPGA步进电机细分控制电路设计方案.docx(20页珍藏版)》请在冰点文库上搜索。
FPGA步进电机细分控制电路设计方案
封面
作者:
PanHongliang
仅供个人学习
目录
1引言1
2步进电机简介2
2.1步进电机工作原理2
2.2步进电机的励磁方式2
2.2.1一相励磁2
2.2.2二相励磁3
2.2.3一-二相励磁3
2.3细分驱动原理4
3设计方案5
3.1各个模块简要介绍6
3.2各个部分仿真图介绍8
4结论11
谢辞12
参考文献13
附录14
1引言
步进电机是将电脉冲信号转变成角度位移或者线性位移的开环控制元件。
在非超载的情况下电机的转速、停止位置只是取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只是周期性的误差而无累计误差的特点,使得步进电机在速度、位置等控制领域操作非常简单。
基于步进电机具有转矩大、惯性小、响应频率高、可开环应用等优点,它被广泛应用在工业自动控制、仪器仪表等领域。
然而步进电机在低频运行时存在振荡现象并且产生很大的电磁噪声,另外步进电机的固有步进角多在0.45~1.8_之间,在精密、稳定控制场合,用普通的方法驱动步进电机不能获得理想的步进控制精度和运行平稳度。
因此需要通过步进电机细分技术来改善。
步进电机的细分技术实质上是一种电子阻尼技术,细分驱动技术能够大大提高步进电机的步距分辨率,减小转矩的波动,避免低频振荡,降低运行时的噪声,提高电机的运转精度只是细分技术的一个附带功能。
比如对于步进角为1.8°的两相混合式步进电机,如果细分驱动器的细分数设置为4,那么电机的运转分辨率为每个脉冲0.45°,电机的精度能否达到或接近0.45°,还取决于细分驱动器的细分电流控制精度等其它因素。
不同厂家的细分驱动器精度可能差别很大;细分数越大精度越难控制。
现场可编程门阵列(FieldProgrammableGateArray,FPGA)集成度高、通用性好、设计灵活且性能稳定,能够极大地缩小电路板的面积,提高电路的稳定性。
因此本次设计的步进电机细分驱动器以FPGA为核心,采用脉宽调制(PulseWidthModulation,PWM)斩波恒流驱动技术,细分数为8。
本驱动器可使步进电机带动负载连续平稳地运行,控制精度高,灵活性好。
2步进电机简介
2.1步进电机工作原理
步进电机有三线制、五线制和六线制,但其控制方式均是相同的,都要以脉冲信号电流来驱动。
假设没旋转一圈需要200个脉冲信号来励磁,可以计算出每个励磁信号能使步进电机前进1.8°,其旋转角度与脉冲的个数成正比。
步进电机的正反转均是有励磁脉冲产生的顺序来控制。
六线制四相步进电机是比较常见的,它的控制等效电路如图1所示,它有四条励磁信号引线A,B,C,D,通过四条引线上励磁脉冲产生的时刻,即可以控制步进电机的转动,每出现一个脉冲信号,步进电机只走一步。
因此,只要依照固定的顺序不断送出脉冲信号,步进电机就能够一直连续转动。
图1步进电机的等效电路图
2.2步进电机的励磁方式
步进电机的励磁方式分为全步励磁和半步励磁两种。
其中全步励磁又有一相励磁和二相励磁之分;半步励磁称为一-二相励磁。
假设没旋转一圈需要200个脉冲信号来励磁,可以计算出每个励磁信号呢个使步进电机前进1.8°,简要介绍如下。
励磁方式有三种分别为一相励磁、二相励磁和一-二相励磁。
2.2.1一相励磁
在每一个瞬间,步进电机只有一个线圈导通。
每送一个励磁信号,步进电机旋转1.8度,这是三种励磁方式中最简单的一种。
其特点是:
精确度好、消耗电力小,但是输出的转矩最小,产生的振动很大。
如果以该方式控制步进电机正转,对应的励磁表的顺序如表1所示。
如果励磁信号反向传动,则步进电机反转。
表中的1和0表示给电机的高电平和低电平。
表1一相励磁顺序表
STEP
A
B
C
D
1
1
0
0
0
2
0
1
0
0
3
0
0
1
0
4
0
0
0
1
励磁的顺序说明为:
1->2->3->4->1如此循环。
2.2.2二相励磁
在每一个瞬间,步进电机有两个线圈同时导通。
每送一个励磁信号,步进电机旋转1.8度。
其特点是:
输出转矩较大,振动比较小。
因而成为目前使用最多的励磁方式。
如果以该方式控制步进电机的正转,对应的历次方式见表2.若励磁信号反向传送,则步进电机反转。
表2二相励磁顺序表
STEP
A
B
C
D
1
1
1
0
0
2
0
1
1
0
3
0
0
1
1
4
1
0
0
1
励磁的顺序说明为:
1->2->3->4->1如此循环。
2.2.3一-二相励磁
为一相励磁和二相励磁交替导通的方式。
每送一个励磁信号,步进电机旋转0.9度。
其特点是:
分辨率高,运转较平滑,故应用也很广泛。
如果以该方式控制步进电机正转,对应的历次顺序见表3.若励磁信号反向传动,则步进电机反转。
表3一-二相励磁顺序表
STEP
A
B
C
D
1
1
0
0
0
2
1
1
0
0
3
0
1
0
0
4
0
1
1
0
5
0
0
1
0
6
0
0
1
1
7
0
0
0
1
8
1
0
0
1
励磁的顺序说明为:
1->2->3->4->5->6->7->8->1如此循环。
本次设计采用是一-二相励磁的方式,顺序为正转。
2.3细分驱动原理
步进电机细分控制的关键在于按照什么样的细分电流波形来控制步进电机各自绕组中的电流。
一般有两种实现原理。
(1)使电流按线性规律变化,即把步进电机各相的最大电流进行了M等分。
这种方法示意见图2,其转矩角特性曲线见图3。
可以看出,各相通电状态转矩角的幅值不相等,步距角也不均匀等分,当通电状态发生变化的时候,各细分微步的步距是不保持均匀的。
因此这种驱动方式只是为了提高其运行性能而不是主要用来提高距角的分辨率。
图2步进电机电流等分细分波形
图3电流线性等分细分矩角特性
(2)按等步距角细分。
由上述电机各自相互通电的状态下的矩角特性曲线可知,按等步距角细分必须满足各自相矩角特性曲线幅值,位差和形状都相同,如图4所示。
图4理想的细分矩角特性
由于等距细分实现起来较为复杂,基于实际需要故本次设计采用按线性电流规律变化进行设计。
通过设置导通电流的占空比达到控制电流的目的。
3设计方案
本次设计的硬件平台是Altera公司的CycloneⅡ系列中的EP2C8Q208C8。
步进电机为5V驱动的4相5线的步进电机,而且是减速步进电机,减速比为1:
64,步进角为5.625/64度。
如果需要转动1圈,那么需要360/5.625*64=4096个脉冲信号。
为了对比明显,将没有通过细分的状态和细分状态放在一起进行切换对比,并通过数码管显示细分的状态。
图5为本次设计的顶层文件图。
图5本次设计的顶层文件图
3.1各个模块简要介绍
图6为按键电路通过input锁定的按键输入,然后xd模块为消除抖动模块,然后通过通过xf_cont模块来实现电平的反转,首次按下按键的时候xf端口输出为高电平,代表的状态为步进电机细分模式。
再次按下时xf为低电平,代表的是步进电机非细分的模式。
图6细分状态切换顶层原件图
图7为电压上升和下降模块,两者通过共同的时钟输入,输出信号到步进电机控制模块。
其中pwmc为电压上升模块,pwmd为电压下降模块。
图7步进电机细分模块和非细分模块
图8为步进电机控制模块,本模块通过接受按键的输入信号来决定步进电机的输出是细分状态还是非细分状态。
输出的四个引脚与步进电机ABCD四个脚绑定。
图8步进电机控制模块
图9为步进电机细分状态的显示模块,它通过接收步进电机控制模块发出的二进制控制信号,通过解码现显示出当先步进电机细分的状态。
本次设计只有两种模式分别为0细分和8细分模式。
图9步进电机细分状态显示模块
3.2各个部分仿真图介绍
本次设计的方针波形主要通过modemsim软件进行仿真,用其编译的脚本文件可以方便对每个模块进行波形仿真,并验证本次设计的正确性。
首先验证的是电压上升和下降的细分模式图。
本次设计在内部设置了8位寄存器进行了256的细分,程序里设置为每增加或者减小64为一个步进状态。
图10为步进电机的电压上升图,由图可以知道输出的占空比为4个状态变化依次从窄到宽,再回到初值状态。
图10步进电机细分电压上升图
图11为步进电压下降图,由图可以知道步进电机输出和上升的波形相反。
图11步进电机细分电压下降图
图12为步进电机的细分状态模块的方针图,此模块通过接受步进电机控制电路输出的二进制信号,转化成十进制的数字在数码管上显示,如图12可以知道,输出模块很好地实现了二进制转化为十进制的转化。
输出波形为数码管的十进制编码。
图12步进电机状态显示模块
图13为本次设计的综合模块也就是步进电机的细分控制模块,为了分辨电压上升的状态和电压下降的状态,在此分别输入了不同频率的信号。
最下边的数值为步进电机的细分状态值。
由图13可知在未细分状态的时候a,b,c,d电压的上升都是直接从0到1完全没有过度过程。
而在细分状态的时候,如图14电压上升和下降的时候都会有细分的过度过程,而且上升的的频率和下降的频率分别都和各自输入的clk信号一致。
图13未细分状态时的仿真输出图
图14细分状态下的输出仿真图
4结论
本文介绍了基于FPGA的步进电机细分控制电路的设计,本次设计进行了模块分析和仿真分析,利用FPGA的开发板实现了步进电机细分控制的功能。
通过固化程序到开发板上,很明显的感觉到未细分时候,步进电机的振动很厉害,细分之后步进电机能较为平稳地转动。
本次设计完整地达到了预期的目的。
本文设计方案在自动控制领域中有广泛的应用前景。
谢辞
本学期我认真学习了FPGA与CPLD技术这一门课程,这一次设计也是作为研究生的第一个课程设计。
首先要感谢老师对我们的辛勤教导,其次要感谢实验室的同学为我提供了FPGA的开发板和技术指导。
这次设计,不仅使我更加熟悉VerilogHDL语言和QuartusⅡ9.0软件,而且真正体会到了实践出真知的真谛。
最后,本次设计虽然是个人探索取得进步的过程,但依然离不开同学之间的相互探讨和帮助,集体的思维是开阔的,集体的智慧是无限的。
因此我还要向那些给我帮助的同学们表示感谢。
参考文献
[1]潘松黄继业.EDA技术实用教程(第三版)[M].北京:
科学教育出版社.2007
[2]王金明,杨吉斌,数字系统设计与VerilogHDL[M].北京:
电子工业出版社,2002
[3]潘松,黄继业.EDA技术与VHDL(第三版)[M].北京:
清华大学出版社,2009
[4]云创工作室.VerilogHDL程序设计与实践[M].北京:
人民邮电出版社,2009
[5]MichaelD.Ciletti.VerilogHDL高级数字设计[M].
[6]MaríaDoloresValdés,IriaVillares,JoséFariña,MaríaJosé.FPGA-basedFrequencyMeasurementSystemforHigh-AccuracyQCMSensors.MoureDepartmentofElectronicTechnologyUniversityofVigo,Spain.2002:
114-117
[7]Valdes,M.D.Moure,M.J,Rodriguez,Farina.ImplementationofaFrequencyMeasurementCircuitforHigh-AccuracyQCMSensors.Electron.Technol.,Univ.ofVigo,Vigo.2004:
29-38
[8]Lee,Y.-H.G.Helton,J.Chen.Real-timeFPGA-basedimplementationofdigitalinstantaneousfrequencymeasurementreceiver.WrightStateUniv,Dayton.2006:
35-38
[9]Santos,EdvalJ.P.Silva,LeonardoB.M.FPGA-basedsmartsensorimplementationwithprecisefrequencytodigitalconverterforflowmeasurement.LaboratoryforDevicesandNanostructures,ElectronicsandSystemsDepartment,UniversidadeFederaldePernambuco.2008:
16-30
附录
1消抖模块程序
modulexd(
clk,key_in,
key_out
)。
inputclk。
inputkey_in。
outputkey_out。
regdout1。
regdout2。
regdout3。
reg[17:
0]count。
wirekey_done。
assignkey_done=(dout1|dout2|dout3)。
assignkey_out=key_done。
always@(posedgeclk)
begin
count=count+1'b1。
end
always@(posedgecount[17])
begin
dout1<=key_in。
dout2<=dout1。
dout3<=dout2。
end
endmodule
2输入模块程序
modulexf_cont(in,clk,xf)。
inputclk,in。
outputxf。
regxf_r=0。
assignxf=xf_r。
always@(negedgein)
begin
xf_r<=~xf_r。
end
endmodule
3电压上升模块程序
modulepwmc(clk,out)。
inputclk。
outputout。
wireout。
regb=0。
reg[7:
0]cnt=0。
reg[7:
0]data=0。
reg[23:
0]cnt1=0。
initial
begin
data=64。
end
always@(negedgeclk)
begin
cnt<=cnt+1'b1。
cnt1<=cnt1+1'b1。
if(cnt1==249999)
begin
data<=data+8'd64。
cnt1<=0。
end
end
always@(negedgeclk)
begin
if(cnt==0)b<=1。
elseif(cnt==data)b<=0。
end
assignout=b。
Endmodule
4电压下降模块程序
modulepwmd(clk,out)。
inputclk。
outputout。
wireout。
regb=0。
reg[7:
0]cnt=0。
reg[7:
0]data=0。
reg[23:
0]cnt1=0。
initial
begin
data=64。
end
always@(negedgeclk)
begin
cnt<=cnt+1'b1。
cnt1<=cnt1+1'b1。
if(cnt1==249999)
begin
data<=data+8'd64。
cnt1<=0。
end
end
always@(negedgeclk)
begin
if(cnt==0)b<=0。
elseif(cnt==data)b<=1。
end
assignout=b。
endmodule
5步进电机控制模块输出模块
moduleabcd(a,b,c,d,pwmc,pwmd,clk,xf,data)。
inputpwmc,pwmd,xf。
inputclk。
outputa,b,c,d。
output[3:
0]data。
parameterstate0=3'b000,
state1=3'b001,
state2=3'b010,
state3=3'b011,
state4=3'b100,
state5=3'b101,
state6=3'b110,
state7=3'b111。
rega,b,c,d。
reg[23:
0]cnt=0。
reg[2:
0]state。
reg[3:
0]data=0。
initial
begin
state<=state0。
end
always@(negedgeclk)
begin
cnt<=cnt+1。
if(cnt==999999)begin
cnt<=0。
case(state)
state0:
state<=state1。
state1:
state<=state2。
state2:
state<=state3。
state3:
state<=state4。
state4:
state<=state5。
state5:
state<=state6。
state6:
state<=state7。
state7:
state<=state0。
endcase
end
end
always@(negedgeclk)
begin
//ULN2003是反向驱动器。
当输入是0时,输出时1
if(xf==1)begin
case(state)
state0:
begin
a=1。
b=pwmc。
c=0。
d=0。
end
state1:
begin
a=pwmd。
b=1。
c=0。
d=0。
end
state2:
begin
a=0。
b=1。
c=pwmc。
d=0。
end
state3:
begin
a=0。
b=pwmd。
c=1。
d=0。
end
state4:
begin
a=0。
b=0。
c=1。
d=pwmc。
end
state5:
begin
a=0。
b=0。
c=pwmd。
d=1。
end
state6:
begin
a=pwmc。
b=0。
c=0。
d=1。
end
state7:
begin
a=1。
b=0。
c=0。
d=pwmd。
end
endcase
data<=4'd8。
end
elseif(xf==0)begin
case(state)
state0:
{d,c,b,a}=4'b0001。
state1:
{d,c,b,a}=4'b0011。
state2:
{d,c,b,a}=4'b0010。
state3:
{d,c,b,a}=4'b0110。
state4:
{d,c,b,a}=4'b0100。
state5:
{d,c,b,a}=4'b1100。
state6:
{d,c,b,a}=4'b1000。
state7:
{d,c,b,a}=4'b1001。
endcase
data<=0。
end
end
endmodule
6步进电机细分状态显示模块程序
moduledisplay(
clk,data_in,
sm_bit,sm_seg
)。
inputclk。
input[3:
0]data_in。
outputsm_bit。
output[7:
0]sm_seg。
reg[23:
0]data。
reg[7:
0]sm_seg_r。
assignsm_bit=0。
assignsm_seg=sm_seg_r。
always@(posedgeclk)
begin
case(data_in)
4'h0:
sm_seg_r=8'hc0。
4'h1:
sm_seg_r=8'hf9。
4'h2:
sm_seg_r=8'ha4。
4'h3:
sm_seg_r=8'hb0。
4'h4:
sm_seg_r=8'h99。
4'h5:
sm_seg_r=8'h92。
4'h6:
sm_seg_r=8'h82。
4'h7:
sm_seg_r=8'hf8。
4'h8:
sm_seg_r=8'h80。
4'h9:
sm_seg_r=8'h90。
4'ha:
sm_seg_r=8'hbf。
default:
sm_seg_r=8'hff。
endcase
end
endmodule
7本次设计的实物图
图15本次设计的硬件实物
版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理。
版权为潘宏亮个人所有
Thisarticleincludessomeparts,includingtext,pictures,anddesign.CopyrightisPanHongliang'spersonalownership.
用户可将本文的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人的书面许可,并支付报酬。
Usersmayusethecontentsorservicesofthisarticleforpersonalstudy,researchorappreciation,andothernon-commercialornon-profitpurposes,butatthesametime,theyshallabidebytheprovisionsofc