基于FPGA的步进电机细分控制.docx
《基于FPGA的步进电机细分控制.docx》由会员分享,可在线阅读,更多相关《基于FPGA的步进电机细分控制.docx(13页珍藏版)》请在冰点文库上搜索。
基于FPGA的步进电机细分控制
实习目的(内容):
步进电机细分控制
实习时间:
自月日至月日
共天。
实习地点:
实习单位:
指导老师:
系主任:
一.实验目的
学习使用FPGA实现步进电机和细分控制,了解步进电机细分控制的原理。
二.实验内容
MagicSOPC实验箱上有1个四相步进电机。
本实验的内容是使用PMW方法来控制步进电机细分旋转,实验1/4细分(4.5度/步)控制和不细分控制(18度/步)。
用KEYI控制步进电机正/反(由LED1指示状态);KEY2控制电机正常运转/细分运行(LED2指示状态)。
利用Quartus2完成设计、仿真等工作,最后在MagicsSOPC实验箱上运行硬件测试。
三.实验原理
步进电动机是纯粹的数字控制电动机,它将电脉冲信号转变为角位移,即给一个脉冲,步进电机就转一个角度,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。
步进电动机有如下特点:
1)步进电动机的角位移与输入脉冲数严格成正比。
因此,当它转一圈后,没有累计误差,具有良好的跟随性。
2步进电动机与驱动电路组成的开环数控系统,既简单、廉价,又非常可靠,同时,它也可以与角度反馈环节组成高性能的闭环数控系统。
3)步进电动机的动态响应快,易于启停、正反转及变速。
4)速度可在相当宽的范围内平稳调整,低速下仍能获得较大转距,因此一般可以不用减速器而直接驱动负载。
5)步进电机只能通过脉冲电源供电才能运行,不能直接使用交流电源和直流电源。
6)步进电机存在振荡和失步现象,必须对控制系统和机械负载采取相应措施。
步进电机具有和机械结构简单的优点,图1是四相六线制步进电机原理图,这类步进电机既可作为四相电机使用,也可以做为两相电机使用,使用灵活,因此应用广泛。
步进电机有两种工作方式:
整步方式和半步方式。
以步进角1.8度四相混合式步进电机为例,在整步方式下,步进电机每接收一个脉冲,旋转1.8度,旋转一周,则需要200个脉冲,在半步方式下,步进电机每接收一个脉冲,旋转0.9度,旋转一周,则需要400个脉冲。
控制步进电机旋转必须按一定时序对步进电机引线输入脉冲,以上述四相六线制步进电机为例,其半步工作方式和整步工作方式的控制时序如表1和表2所列。
步进电机在低频工作时,会有振动大、噪声大的缺点。
如果使用细分方式,就能很好的解决这个问题,步进电机的细分控制,从本质上讲是通过对步进电机励磁绕组中电流的控制,使步进电机内部的合成磁场为均匀的圆形旋转磁场,从而实现步进电机步距角的细分,一般情况下,合成磁场矢量的幅值决定了步进电机旋转力矩的大小,相邻两合成磁场矢量之间的夹角大小决定了步距角的大小,步进电机半步工作方式就蕴涵了细分的工作原理。
(1)四相反应式步进电机的工作方式
1)单四拍工作方式
四相反应式步进电机各相位A、B、C、D。
如果换相方式为A→B→C→D→A,测试电流切换四次,即将相四次时,磁场就会旋转一周,同时转子转动一个锯齿。
所谓“单”是指每次对单相通电;“四拍”是指切换相四次磁场旋转一周,转子转动一个锯齿。
2)双四拍工作方式
在步进电机的不仅控制中,如果每次都是两相通电,控制电流切换四次,磁场旋转一周,转子移动一个锯齿位置,则称为双四拍工作方式,在双四拍工作方式中,每拍通电的相磁极和转换情况如为:
AB→BC→CD→AB
3)八拍工作方式
对四相反应步进电机进行控制时,控制电流切换四次,磁场旋转一周,在步进电机的步进控制中,如果每次都是两相通电,控制电流切换四次,磁场旋转一周,转子移动一个锯齿位置,则称为双四拍工作方式。
在双四拍工作方式中,每拍通电的相磁极和转换情况为:
A→AB→B→BC→C→CD→D→DA→A
(2)步进电机细分驱动的工作原理
步进电机细分驱动的工作原理是通过对电机励磁绕组电流进行控制(这里绕组电流是呈阶梯波,电流分成多少个台阶)。
使步进电机定子的合成磁场成为按细分步距旋转的磁场,从而带动转子转动实现的。
当两相邻绕组同时通过不同大小的电流时,各相产生的转距之和为零的位置为新的平衡位置,所以通过控制各相的电流可以实现细分控制,要使电机按等步距转动,电流合成必须符合两个条件:
1)电流合成矢量旋转时每次变化的角度要均匀
2)电流合成矢量的大小或幅值要保持不变。
如图4.26所示的是四相步进电机4细分驱动的原理,设A相通是磁场方向为零度,如果以A相或B相单独通电时产生的磁场大小为半径(设半径为R)画圆,即可算出位置1时的两分量,A1=Rsina1,B1=Rcosa1,同理可以算出A2=Rsina2,B2=Rcosa;A3=singa3,B3=Rcosa3,一次可以算出各相在某一时刻的电流值,把各细分的电流参数记录下来,电机运行时以查表方式取出数据,即可做到细分控制。
如图4.27所示为四相双四拍4细分各绕组电流波形图,由图中也可以看出一般总有两相绕组通电,一相逐渐增大,一相逐渐减小。
对应一个步距角,电流可以分为N个台阶,也就是电机位置可以细分为N个小角度,实现N细分,从而可以驱动步进电机平滑运行。
本实验是用PWM信号来控制电机的,电机各相电流的大小取决于PMW信号的占空比,所以可通过调节PWM信号的占空比来控制电机的电流。
图4.26步进电机细分驱动原理
图4.27四相双四拍4细分各绕组电流波形图
四.实验步骤
1)启动Quartus2建立一个空白工程,然后命名为step_moto.qpf。
2)新建VarilogHDL源程序文件step_moto.v,写出程序代码并保存
3)选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司
Cyclone2系列的EP2C35F672C8芯片,引脚锁定方法如表4.9所列。
将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片)。
设置方法见3.1节。
表4.9引脚锁定方法
4)对该工程文件进行编译处理,若在编译过程中发现错误,则找出并更正,直至编译成功为止。
5)确保跳线短接帽跳接到JP5(步进电机源)的ON端口,把程序下载到FPGA器件中。
按KEY1-KEY2,观察步进电机的运行状态
五.实验参考程序
程序清单4.9步进电机控制模块
modulestep_moto(clock,key,led,pwm_out);
inputclock;//系统输入时钟
input[1:
0]key;//按键输入
output[1:
0]led;//LED指示输出
output[3:
0]pwm_out;//PWM输出
reg[3:
0]pwm_out_r;
reg[3:
0]p_out_r;
reg[23:
0]count;//时钟分频计数器
reg[3:
0]pwm_count;//PWM内部计数器
reg[3:
0]cnt4;//电机步进时序计数器
reg[15:
0]duty_cycle;//PWM占空比控制
regdir;//电机旋转方向控制
regmode;//电机控制模式
reg[1:
0]dout1,dout2,dout3,buff;//消抖寄存器
wire[1:
0]key_edge;//按键消抖输出
wirepwm_clk;//PWM计数时钟
wirespeed_clk;//电机转动速度控制
wirediv_clk;//消抖动时钟
//时钟分频部分
always@(posedgeclock)
begin
count<=count+1'b1;//时钟分频计数器加一
end
assignpwm_clk=(count[6:
0]==7'h7f);//PWM进行7分频(2.5us)
assigndiv_clk=(count[15:
0]==16'hffff);//消抖动时钟16分频(1.3ms)
assignspeed_clk=(count==24'hffffff);//转速控制24分频(335ms)
//按键消抖部分
always@(posedgeclock)
begin
if(div_clk)
begin
dout1<=key;//非阻塞,并行执行
dout2<=dout1;
dout3<=dout2;
end
end
//按键边沿检测部分
always@(posedgeclock)
begin
buff<=dout1|dout2|dout3;
end
assignkey_edge=~(dout1|dout2|dout3)&buff;
//按键操作部分
always@(posedgeclock)//按键1,控制电机正反转
begin
if(key_edge[0])
dir<=~dir;
end
always@(posedgeclock)//按键2,控制电机正常运转/细分运行
begin
if(key_edge[1])
mode<=~mode;
end
assignled=~{mode,dir};//输出LED指示
assignpwm_out=mode?
~pwm_out_r:
p_out_r;//输出模块选择(细分/正常)
always@(posedgeclock)//电机正/反转控制
begin
if(speed_clk)
begin
if(dir==1'b1)//按键1未按下,计数器加1,电机正转
cnt4<=cnt4+1'b1;
else//按键1按下,计数器减1,电机反转
cnt4<=cnt4-1'b1;
end
end
always@(posedgeclock)//PWM波计数器
begin
if(pwm_clk)
pwm_count<=pwm_count+1'b1;//PWM内部计数器加1
end
always@(posedgeclock)//PWMA通道
begin
if(pwm_count[3:
0]12])//PWM内部计数器小于占空比的高4位的值
pwm_out_r[3]<=1'b1;
else
pwm_out_r[3]<=1'b0;
end
always@(posedgeclock)//PWMB通道
begin
if(pwm_count[3:
0]8])//PWM内部计数器小于占空比的8~11位的值
pwm_out_r[2]<=1'b1;
else
pwm_out_r[2]<=1'b0;
end
always@(posedgeclock)//PWMC通道
begin
if(pwm_count[3:
0]4])//PWM内部计数器小于占空比的4~7位的值
pwm_out_r[1]<=1'b1;
else
pwm_out_r[1]<=1'b0;
end
always@(posedgeclock)//PWMD通道
begin
if(pwm_count[3:
0]0])//PWM内部计数器小于占空比的低4位的值
pwm_out_r[0]<=1'b1;
else
pwm_out_r[0]<=1'b0;
end
always@(posedgeclock)//步进电机控制时序
begin
if(speed_clk)
begin
case(cnt4[1:
0])
2'b00:
p_out_r=4'b1100;
2'b01:
p_out_r=4'b0110;
2'b10:
p_out_r=4'b0011;
2'b11:
p_out_r=4'b1001;
endcase
end
end
always@(cnt4)//步进电机4细分控制PWM波参数表
begin
case(cnt4)
4'h0:
duty_cycle=16'hf000;
4'h1:
duty_cycle=16'he600;
4'h2:
duty_cycle=16'hbb00;
4'h3:
duty_cycle=16'h6e00;
4'h4:
duty_cycle=16'h0f00;
4'h5:
duty_cycle=16'h0e60;
4'h6:
duty_cycle=16'h0bb0;
4'h7:
duty_cycle=16'h06e0;
4'h8:
duty_cycle=16'h00f0;
4'h9:
duty_cycle=16'h00e6;
4'ha:
duty_cycle=16'h00bb;
4'hb:
duty_cycle=16'h006e;
4'hc:
duty_cycle=16'h000f;
4'hd:
duty_cycle=16'h600e;
4'he:
duty_cycle=16'hb00b;
4'hf:
duty_cycle=16'he006;
endcase
end
endmodule
六.程序流程图
六.实验结果
1).下载测试仿真
KEYI按下时控制步进电机正/反同时LED1变亮;KEY2按下时电机进行正常运转/细分运行同时由LED2指示状态
实验结果和实验预期一致,试验成功