实验十 步进电机驱动设计
一、实验目的:
1、了解步进电机的工作原理和控制实现的方法。
2、实现步进电机转动控制。
3、学会用于Verilog语言进行程序设计。
二、实验仪器设备
1、PC机一台
2、FPGA实验开发系统一套。
三、实验原理
本实验采用的步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图1是该四相反应式步进电机工作原理示意图。
图1 步进电机工作示意图
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相 绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
实验箱的电路原理图如下所示
图2 步进电机驱动器
图3锁存器
四、实验内容及步骤
设计一段程序,通过两个独立按键实现电机的正转、反转、转动模式。
(1)启动 Quartus II 建立一个空白工程,选择的器件为 Altera 公司的 Cyclone 系列的 EP2C8Q240C8芯片,命名为 step_moto.qpf;
(2)新建一个 Schematic File 文件,命名为 step_moto.bdf;
(3)新建一个 Verilog HDL File 文件,分别命名为 stepmoto.v,输入程序代码并保存(对应源程序12),然后进行综合编译。若在编译过程中发现错误,则找出错误并更正错误,直至编译成功为止。
(4)从设计文件创建模块(FileCreat UpdateCreat Symbol Files for Current File), stepmoto.v 生成名为 stepmoto.bsf;
(5)在 step_moto.bdf 文件中,在空白处双击鼠标左键,在 Symbol 对话框左上角的 libraries 中, 分别将 Project 下的 stepmoto 模块放在图形文件 step_moto.bdf 中,加入输入、输出引脚,双击每个引脚,进行引脚命名,并锁定管脚,将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片);
完整的顶层模块原理图如图所示
其中 K1 控制电机的正转与反转;K2 控制电机的模式;
(6)将 step_moto.bdf 设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中出现错误,则找出错误并更正,直至编译通过为止;
(7)将 USB-Blaster 下载电缆的两端分别连接到 PC 机的 USB 接口和 EDA 实验箱上的 JTAG 下载口上,打开电源,执行下载命令,把程序下载到 FPGA 器件中,此时,即可在 EDA 实验箱上控制步进电机工作。
五、实验报告
1.总结Verilog设计步进电机控制的基本思路。
//时钟分频部分
always @(posedge clock)
begin
count <= count + 1'b1;
end
assign pwm_clk = (count[6:0] == 7'h7f);
assign div_clk = (count[15:0] == 16'hffff);
assign speed_clk = (count == 24'hffffff);
//按键消抖部分
always @(posedge clock)
begin
if(div_clk)
begin
dout1 <= {k1,k2};
dout2 <= dout1;
dout3 <= dout2;
end
end
//按键边沿检测部分
always @(posedge clock)
begin
buff <= dout1 | dout2 | dout3;
end
assign key_edge = ~(dout1 | dout2 | dout3) & buff;
//按键操作部分
always @(posedge clock) begin
if(key_edge[0])
dir <= ~dir;
end
always @(posedge clock) begin
if(key_edge[1])
mode <= ~mode;
//按键1
//按键2
end
assign led = ~{mode,dir}; //输出LED指示
assign pwm_out = mode ? ~pwm_out_r : p_out_r; //输出模块选择(细分/正常)
always @(posedge clock) begin
if(speed_clk)
begin
if(dir == 1'b1)
cnt4 <= cnt4 + 1'b1;
else
cnt4 <= cnt4 - 1'b1;
end
end
//电机正/反转控制
always @(posedge clock) begin
if(pwm_clk)
pwm_count <= pwm_count + 1'b1;
end
always @(posedge clock) begin
if (pwm_count[3:0] < duty_cycle[15:12])
pwm_out_r[3] <= 1'b1;
else
pwm_out_r[3] <= 1'b0;
end
always @(posedge clock) //PWM波计数器
//PWM A通道
//PWM B通道
begin
if (pwm_count[3:0] < duty_cycle[11:8])
pwm_out_r[2] <= 1'b1;
else
pwm_out_r[2] <= 1'b0;
end
always @(posedge clock) begin
if (pwm_count[3:0] < duty_cycle[7:4])
pwm_out_r[1] <= 1'b1;
else
pwm_out_r[1] <= 1'b0;
end
//PWM C通道
always @(posedge clock) begin
if (pwm_count[3:0] < duty_cycle[3:0])
pwm_out_r[0] <= 1'b1;
else
pwm_out_r[0] <= 1'b0;
end
always @(posedge clock) begin
if(speed_clk)
begin
case(cnt4[1:0])
2'b00:p_out_r = 4'b1100;
//PWM D通道
//步进电机控制时序
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) 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细分控制PWM波参数表
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
2.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。
本实验为步进电机的驱动,通过按键控制电机的转动,根据步进电机的转动原理,写出相应的时序控制电机旋转方向,再通过时序快慢控制电机的旋转速度。还可以改变单拍和双拍的控制方式改变电机力矩。结合分频器和键盘控制模块,达到实验的设计。
因篇幅问题不能全部显示,请点此查看更多更全内容