直流电机测速与 PWM 调速 FPGA 设计 VHDL Quartus
2026/6/7 15:02:56 网站建设 项目流程

名称:直流电机测速与 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 下载等界面示意,以及实验平台连接和资源说明图片。

部分代码

以下展示顶层模块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;

代码获取:点击下方公众号卡片

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询