直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus

名称:直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus

软件:Quartus

语言:VHDL

功能介绍

本设计实现直流电机测速与 PWM 调速控制功能,顶层模块为 motor_ctrl_top,工程采用 VHDL 编写并在 Quartus 环境下组织。系统围绕电机控制实验常见需求展开,包含时钟分频、PWM 波形产生、速度测量以及七段数码管显示等功能模块,可用于学习 FPGA 对电机速度采集、控制信号生成和数据显示的完整实现流程。 设计中通过 tick_div 产生稳定的周期性 tick 脉冲,为后续速度统计、显示刷新或控制节拍提供基础时序;pwm_gen 负责输出 PWM 控制信号,通过占空比调节方式实现电机驱动控制;speed_measure 用于对电机反馈脉冲进行计数和速度换算;seg7_display 则用于将速度或相关数值以七段数码管形式显示出来。各模块分工清晰,便于单独阅读、修改和复用。 该工程适合用于 FPGA/VHDL 电机控制课程设计、EDA 实验拓展以及直流电机测速控制类项目参考。代码结构相比单一实验例程更完整,既包含底层时序节拍模块,也包含面向外设显示和电机控制的功能模块,便于理解从硬件输入、内部计数处理到输出控制显示的设计链路。

运行环境

开发语言:VHDL 开发软件:Quartus 顶层模块:motor_ctrl_top 主要工程文件包含 Quartus 工程配置文件、VHDL 源码文件以及编译输出文件,可在 Quartus 中打开工程进行综合、编译和后续仿真配置。

设计思路

系统采用模块化设计思路,将电机测速与调速功能拆分为多个相对独立的硬件逻辑单元。顶层 motor_ctrl_top 负责连接各功能模块,统一管理时钟、复位、PWM 输出、测速输入和显示输出等信号,使工程结构更利于调试和扩展。 时序部分由 tick_div 完成基础分频。FPGA 常用 50MHz 等高速系统时钟,直接用于低速控制和显示刷新并不方便,因此通过参数化分频模块产生固定周期 tick 脉冲。该 tick 信号可作为后续周期计数、速度采样或显示扫描的节拍基础,降低各功能模块对原始高速时钟的直接依赖。 PWM 调速部分通过 pwm_gen 生成周期性 PWM 波形。电机控制中常使用占空比改变平均驱动电压,从而实现速度调节;在 FPGA 中可通过计数器与占空比设定值比较的方式生成 PWM 输出。测速部分则通过 speed_measure 对反馈脉冲进行统计,在固定时间窗口内得到速度相关计数值,再交由显示模块输出。 显示部分采用 seg7_display,将内部速度数据或控制状态转换为七段数码管可识别的段选、位选信号。这样的结构使控制、测量和显示逻辑相互解耦,后续可以根据实验需求调整 PWM 参数、测速窗口、显示位数或数值格式。

模块结构

主要模块结构如下: motor_ctrl_top:顶层模块,完成各子模块例化与系统信号连接。 tick_div:通用分频模块,按参数 DIVISOR 对输入时钟计数,输出单周期 tick 脉冲。 pwm_gen:PWM 生成模块,用于产生电机调速控制信号。 speed_measure:速度测量模块,用于统计电机反馈脉冲并形成速度相关数据。 seg7_display:七段数码管显示模块,用于显示速度或控制相关数值。 tb_motor_ctrl_top:顶层测试平台模块,用于工程仿真参考。

演示视频

提供电机测速/控制演示视频,可用于查看工程运行效果和操作现象。

仿真图/仿真说明/设计文档图片

设计文档包含 EDA/SOPC 实验平台相关说明、Quartus 工程建立、编译、管脚分配、仿真和下载流程等内容,并包含直流电机测速实验、步进电机驱动控制、数控分频器、数码管动态显示等相关实验章节,可作为理解本工程开发环境和实验流程的参考。 文档图片包含 Quartus 新建工程、器件选择、编译、Pin Planner 管脚分配、波形仿真、Programmer 下载等界面示意,以及实验平台连接和资源说明图片。

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image96.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image95.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image88.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image87.jpeg

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image86.jpeg

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image84.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image83.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image82.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image80.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image74.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image70.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image78.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image85.jpeg

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image77.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image76.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image75.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image63.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image73.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image72.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image71.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image50.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image49.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image48.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image47.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image79.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image20.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image5.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image94.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image19.png

直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus 设计文档图片 image93.png

部分代码

以下展示顶层模块 motor_ctrl_top 的部分代码,完整源码请下载压缩包查看。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

-- 通用分频模块:输入50MHz时钟,按参数DIVISOR计数,输出一个1个clk周期宽的tick脉冲
-- 1) DIVISOR是可修改的参数,表示多少个输入时钟周期产生一个tick脉冲
-- 2) 例如50MHz时钟,DIVISOR=50000时,tick频率约为1kHz(50_000_000 / 50_000 = 1000)
entity tick_div is
  generic (
    DIVISOR : integer := 50000  -- 分频系数,默认产生1kHz的tick
  );
  port (
    clk   : in  std_logic;      -- 输入时钟(例如50MHz)
    rst_n : in  std_logic;      -- 低电平复位
    tick  : out std_logic       -- 输出tick脉冲(一个clk周期宽)
  );
end entity;

architecture rtl of tick_div is
  signal cnt  : integer range 0 to DIVISOR-1 := 0;
  signal tick_r : std_logic := '0';
begin
  tick <= tick_r;

  process(clk, rst_n)
  begin
    if rst_n = '0' then
      cnt     <= 0;
      tick_r  <= '0';
    elsif rising_edge(clk) then
      if cnt = DIVISOR-1 then
        cnt    <= 0;
        tick_r <= '1';          -- 计满时产生一个周期的高电平脉冲
      else
        cnt    <= cnt + 1;
        tick_r <= '0';
      end if;
    end if;
  end process;
end architecture;

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员