• 正文
  • 相关推荐
申请入驻 产业图谱

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

06/08 07:45
591
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称:直流电机测速与 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;

代码获取:点击【来源:www.hdlcode.com

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录