搜索
您的当前位置:首页正文

EDA实验十 步进电机驱动设计

来源:好土汽车网


实验十 步进电机驱动设计

一、实验目的:

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.讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。

本实验为步进电机的驱动,通过按键控制电机的转动,根据步进电机的转动原理,写出相应的时序控制电机旋转方向,再通过时序快慢控制电机的旋转速度。还可以改变单拍和双拍的控制方式改变电机力矩。结合分频器和键盘控制模块,达到实验的设计。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top