第二章 总体设计
§2.1 步进电机驱动电路:
步进电机的驱动电路如图所示,其驱动电路原理很简单。从FPGA出来的脉冲信
图2.1 步进电机驱动电路
号从J1接入按一定的顺序分别接到晶体管Q7~Q10的基极,输出端则有四个相应的信号输出,并接到电机的1、4、3、6脚(注意:电机引出了六根线,只有1、4、3、6才是真正接电机的四相输入,且分别接电机的A、B、C、D相)。设脉冲信号Step1的输入信号是低电平,则输出就为高电平,相应的电机A相导通;反之,则A相不导通。以此类推,其余各相亦是如此。则电机在脉冲序列信号的作用下按预定方向转动,通过改变脉冲序列信号的快慢即频率来控制步进电机转速。
§2.2 控制模块的设计:
总控制模块用VHDL语言对FPGA编程实现。总控制模块其实质是一个按键控制程序,共有reset复位键、add累加键、sub递减键、start/stop启动/停止键、shift电机正反转控制键五个按键。系统启动时,首先运行系统初始化程序,程序先转到步进电机控制模块,送复位信号使步进电机处于初始状态。其间主控程序不断检测按键,只要有键被按下则启动相应的子模块实现实时控制。具体程序代码见附录程序清单。
§2.3 程序流程图:
控制模块的程序流程图如图所示。
6 / 18
开始系统初始化检测按键NY是否按键?YN判断按键步进电机转换按键步进电机调整按键步进进程?Y步进电机控制进程显示模块步进电机转速步进电机驱动电路步进电机 图2.3 控制模块程序流程图
§2.4 步进电机控制模块的设计:
步进电机控制模块其程序设计共分按键去抖、变频、测频、步进、换向五个部分。模块一接收到按键信号,则按键去抖部分先对按键信号进行处理,得到稳定的控制信号;如果是变频信号则变频部分动作,通过相位累加模型,改变步进电机脉冲频率,并送给步进部分;如果是换向信号,则换向部分动作,为了使电机降速停止或降到突跳频率范围之内再换向,先停送驱动脉冲一秒,再送反向脉冲给步进部分,驱动电机换向;步进部分则是按照送来的脉冲频率和步进顺序信号驱动电机按预定的转速和转向转动;测频部分通过测定所送脉冲频率,再利用四
7 / 18
相电机八拍运行时步距角为θ=360度/(50*8)=0.9度的尺度则可以计算出步进电机的每分钟转速数据,再送给显示模块显示。
8 / 18
第三章 系统程序及仿真
§3.1 总体设计电路
图3.1 总体设计电路接线图
§3.2 程序、程序块及仿真波形
--/*ZTSD.VHD*/--换向模块 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ztsd IS
PORT (clk,key,rst:in STD_LOGIC; --系统时钟/换向按键/复位信号 y:out STD_LOGIC ; --输出 sel:out STD_LOGIC); END ztsd;
ARCHITECTURE Behavioral OF ztsd IS SIGNAL sel1:STD_LOGIC; BEGIN
PROCESS(key,clk,rst) --产生换向延时秒脉冲 VARIABLE cnt:integer range 0 to 32000000; BEGIN
IF rst='0' THEN cnt:=0; ELSIF key='1' THEN cnt:=0; ELSE IF rising_edge(clk) THEN
IF cnt<32000000 THEN cnt:=cnt+1;y<='0'; ELSE cnt:=32000000;y<='1'; END IF; END IF; END IF; END PROCESS;
PROCESS(key,sel1,rst) BEGIN
IF rst='0' THEN sel1<='1'; ELSIF rising_edge(key) THEN
9 / 18
END Behavioral;
sel1<=not sel1; END IF; sel<=sel1; END PROCESS;
图3.2.1
图3.2.2
--/*STEP_MOTOR.VHD*/--步进电机控制脉冲产生模块 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY step_motor IS
PORT ( clk,rst : in STD_LOGIC; --系统时钟/复位信号 sel : in STD_LOGIC; --正反转切换键 clkkk:out STD_LOGIC; --步进电机步进脉冲
control:out STD_LOGIC_VECTOR(3 DOWNTO 0)); --步机电机四相输出 END step_motor;
ARCHITECTURE Behavioral OF step_motor IS SIGNAL clkk:STD_LOGIC;
TYPE step IS array (0 to 7) OF STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN
PROCESS(clk,rst) --电机运转脉冲分频模块 VARIABLE cnt:integer range 0 to 1499999; BEGIN
IF rst='0' THEN cnt:=0;
ELSIF clk'EVENT AND clk='1' THEN
IF cnt>=7 THEN clkk<=not clkk;cnt:=0; ELSE cnt:=cnt+1; END IF; END IF; END PROCESS; clkkk<=clkk;
10 / 18