EDA实验-----直流电机驱动设计(Quartus II )

目录

一、实验目的

二、实验仪器设备

三、实验的重点和难点

四、实验原理

五、实验步骤

六、实验报告

七、实验过程

1.分频器代码

2.方向选择器

3.直流电动机工作原理

4.电路连接图

5.文件烧录


一、实验目的

  1. 了解直流电机控制的工作原理和实现的方法。
  2. 掌握PWM波控制直流电机转速的方法。
  3. 学会用于Verilog语言设计直流电机控制电路。

二、实验仪器设备

  1. PC机一台
  2. FPGA实验开发系统一套。

三、实验的重点和难点

  1. 重点:掌握直流电机调速控制原理。
  2. 难点:应用Verilog语言实现直流电机控制电路设计。

四、实验原理

本次实验使用的电机驱动电路如下图所示:

                                                图1 直流电机H桥驱动电路 

                                                                  图2 锁存器

  1. 调方向

如图1所示,当PWM1为高电平时,PWM2为低电平时,Q2和Q4导通,Q3和Q5不导通。当PWM1为低电平时,PWM2为高电平时,Q2和Q4不导通,Q3和Q5导通。两种情况电机转动的方向不一样。

     2. 调速度

电机的速度是通过PWM调节,所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均电压越小,电机转速就低。

五、实验步骤

  1. 启动 Quartus II 建立一个空白工程,选择的器件为 Altera 公司的 Cyclone 系列的 EP2C8Q240C8 芯片,命名为 moto.qpf;
  2. 新建一个 Schematic File 文件,命名为 moto.bdf;
  3. 分别新建 3 个 Verilog HDL File 文件,分别命名为 divclk.v,pwm_logic.v, moto_test.v。输入程序代码并保存(对应源程序 11),然后进行综合编译。若在编译过程中发现错误,则找出错误并更正错误,直至编译成功为止。从设计文件创建模块(FileàCreat UpdateàCreat Symbol Files for Current File), divclk.v生成名为 divclk.bsf;pwm_logic.v 生成名为 pwm_logic.bsf;moto_test.v 生成 moto_test.bsf;
  4. 在 moto.bdf 文件中,在空白处双击鼠标左键,在 Symbol 对话框左上角的 libraries 中,分别将Project 下的 divclk、moto_test、pwm_logic 模块放在图形文件 moto.bdf 中,加入输入、输出引脚,双击每个引脚,进行引脚命名,并锁定管脚,将未使用的引脚设置为三态输入(一定要设置,否则可能会损坏芯片);

Clk1

209

K1

153

K2

95

K3

154

MOT_CS

171

Gpio[4]

164

Gpio[5]

159

完整的顶层模块原理图如图所示:

其中 K1 控制电机的正转与反转;K2 控制电动机启动、停止;K3 控制占空比;

        5. 将 moto.bdf 设置为顶层实体。对该工程文件进行全程编译处理,若在编译过程中出现错                误,则找出错误并更正,直至编译通过为止;

        6. 将 USB-Blaster 下载电缆的两端分别连接到 PC 机的 USB 接口和EDA 实验箱上的 JTAG                下载口上,打开电源,执行下载命令,把程序下载到 FPGA 器件中,此时,即可在 EDA 实         验箱上控制直流电机。

六、实验报告

  1. 总结Verilog设计直流电机驱动的步骤。
  2. 讨论自己在设计过程中遇到的问题、解决的过程以及收获体会。

七、实验过程

基本流程为创建项目、创建Verilog文件、写代码、进行波形仿真、画出电路图、设置管脚和三态、烧录文件。前面的项目创建等等基本操作我就不去做演示了,下面主要去讲原理和代码。

1.分频器代码

这个模块是对输入信号的频率去进行分频处理,分出的频率是满足电动机所需的频率即可。代码如下,很显然,这个是一个8分频的分频器,这里我们直接拿过来用就行了。

module divclk(inclk,outclk);input inclk;output outclk;reg outclk;reg [2:0] cnt;initialbegincnt<=0;outclk<=0;endalways @(posedge inclk)begincnt<=cnt+1;if (cnt<=0)outclk<=outclk+1;end
endmodule 

2.方向选择器

下面代码是用于设计直流电动机转向选择的代码,供大家参考一下。

module pwm_logic(clk,pwm_en,duty_cycle,pwm_out);
input clk;												
input [3:0] duty_cycle;					
input pwm_en;							
output pwm_out;							
reg pwm_out;							
reg [15:0] counter;						
always @(posedge clk)         
beginif(pwm_en)counter <= counter + 1'b1;
end
always @(posedge clk)      
beginif (pwm_en & (counter[15:12] <= duty_cycle))pwm_out <= 1'b1;elsepwm_out <= 1'b0;
endEndmodule

3.直流电动机工作原理

直流电动机可以通过不同的按键来去设置其转向、转速等等内容,这里我主要去讲如何去控制转速问题。

对于电动机转速的理解,我们可以理解成日常生活当中的骑电动车,我们骑电动车的时候并不是一直在加油的,而是加油一定时间之后就让电动车自己利益惯性滑行,然后慢下来再去加油。同样的,直流电动机也是通过这样的方式去调档,输入高电平表示通电(也就是加油),低电平就不通电(此时惯性滑行),如果在一个周期内,高电平占比为99.9%的话我们就表示为最高档,如果占比66.6%我们就表示第二档,占比33.3%就最低档,那剩下的时间就是惯性转动。

这部分就是核心代码了,其中输入包括分频输出的信号,以及按键的三个输入(包括转向控制,转速设置和启动开关)。

module moto_test(clk, pwm_in, k1, k2, k3, duty_cycle, pwm_en, motoa, motob, speed_led);  
input k1, k2, k3, clk, pwm_in;  
output reg pwm_en, motoa, motob;  
output reg [3:0] duty_cycle;  
reg moto_dir;  
reg [2:0] dout1, dout2, dout3, buff, key_edge;  output reg speed_led; // 新增的输出端口  //新增部分:速度计算和速度LED显示  
reg [15:0] speed_counter; // 用于计算速度的计数器,可以根据需要调整位宽  
reg speed_flag; // 当速度计数器达到设定值时,此标志位置1  initial begin  duty_cycle = 4;  speed_counter = 0;  speed_flag = 0;  
end  // 在每个时钟上升沿,如果电机正在运行(pwm_en为高),则增加速度计数器  
always @(posedge clk) begin  if (pwm_en) begin  if (k1 || k2 || k3) begin // 如果按键被按下,增加计数器的速度  speed_counter <= speed_counter + 1;  end else begin // 否则,计数器的速度降低  speed_counter <= speed_counter - 1;  end  end  
end  // 当速度计数器达到设定值时(例如,对应于每秒的转速),将速度LED设置为高电平,否则为低电平  
always @(posedge clk) begin  if (speed_flag) begin  speed_led <= 2; // 如果速度标志已经设置,那么点亮LED灯  end else if (pwm_en) begin  speed_led <= 1'b0; // 如果速度标志没有设置,且电机正在运行,那么熄灭LED灯  end  
end  // 当速度计数器达到设定值时,设置速度标志,并在下一个时钟周期将其清除  
always @(posedge clk) begin  if (speed_counter == 10000) begin // 例如,这里设定为每10000个时钟周期为1秒(可以根据需要调整)  speed_flag <= 1'b1;   end else begin  speed_flag <= 1'b0;   end  
end  
//按键消抖部分
always @(posedge clk)
beginbegindout1 <= {k1,k2,k3};dout2 <= dout1;dout3 <= dout2;end	
end  //按键边沿检测部分 
always @(posedge clk)
beginbuff <= dout1 | dout2 | dout3;key_edge = ~(dout1 | dout2 | dout3) & buff;if(key_edge[0])	//按键1;K3,控制占空比beginduty_cycle <= duty_cycle + 1'b1;if(duty_cycle==8)duty_cycle<=1;endif(key_edge[1])	//按键2;K2,控制电动机启动、停止pwm_en <= ~pwm_en;if(key_edge[2])	//按键3;K1,控制电机正转与反转moto_dir <= ~moto_dir;motoa = moto_dir ? pwm_in : 1'b0;motob = moto_dir ? 1'b0 : pwm_in;	
end
endmodule

4.电路连接图

写好了Verilog代码,就进行分析错误,分析无误后,我们就对这些代码生成子模块文件。然后就创建block文件开始连接电路图,电路图以及管脚配置如下:

5.文件烧录

弄好了之后就是最后一步操作了,把没用到的管脚设置三态,然后烧录文件。

点击Assignment, Device

然后点击这里,设置管脚状态。  

选择第一个就行了,就是把多余的管脚设置三态。

最后点击此处进行烧录。 

  这里我们会看到,下面有一个芯片,这个也就是我们写好了的sof文件,然后就是通过你的电脑接口去连接到开发板,如果你看到上面有一个No Hardware的时候,你点击旁边的按钮进行接口设置,设置为USB接口即可(USB线连接了你的开发板就会自动显示出来的)。最后点击start就可以进行烧录了。 

以上就是本期的全部内容了,我们下次见!

分享一张壁纸:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter Notebook修改默认工作目录

1、参考修改Jupyter Notebook的默认工作目录_jupyter文件路径-CSDN博客修改配置文件 2.在上述博客内容的基础上&#xff0c;这里不是删除【%USERPROFILE%】而是把这个地方替换为所要设置的工作目录路径&#xff0c; 3.【起始位置】也可以更改为所要设置的工作目录路径&#x…

24V输入 输出12V 5A长时间 峰值6A 7A 40V耐压 8-10A输出 大功率降压

24V输入 输出12V 5A长时间 峰值6 A 7A 40V耐压 8-10A输出 大功率降压

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况&#xff1a; 3.4realloc有malloc的功能 五、常见的动…

rk3568 bootLoader编译

Linux系统uboot、linux kernel、rootfs移植学习笔记&#xff08;一&#xff09;_uboot 删除环境变量-CSDN博客 板信息配置文件&#xff1a;device/rockchip/rk356x/BoardConfig-IAC-RK3568-MB-BETA-V1_00.mk uboot编译入口 Linux系统uboot、linux kernel、rootfs移植学习笔记&…

【jsonview去除排序】如何让jsonview不自动排序(已解决)

✈️涉及知识 如何取消JSON默认数值排序&#xff0c;JSON.parse()函数排序关闭&#xff0c;取消JSON.parse排序&#xff0c;Json格式化校验&#xff0c;jsonview排序问题解决方法。 &#x1f947;专栏&#x1f947;&#xff1a;前端技术&#xff0c;json格式化 &#x1f482;关…

天猫数据分析(天猫查数据工具):2023年天猫平台假发行业市场销售数据分析报告

如今&#xff0c;由于人们工作和生活的压力较大&#xff0c;居民脱发问题严重&#xff0c;且脱发群体倾向于80后和90后&#xff0c;逐渐向低龄化发展。除脱发外&#xff0c;在颜值经济的背景下&#xff0c;人们越来越注重外貌和形象&#xff0c;假发作为一种改善发型的工具&…

uniapp-uni-icons组件@click.stop失败解决~

你们好&#xff0c;我是金金金。 场景 可以看见我右侧有两个icon&#xff0c;点击的时候 会影响到折叠面板的打开&#xff0c;这让我很是苦恼&#xff0c;然后我使用了click.stop修饰符阻止事件冒泡 排查 排查之前我先贴一下代码 报错截图 可以看到找不到属性stopPropagation&…

Elasticsearch 性能调优基础知识

Elastic Stack 已成为监控任何环境或应用程序的实际解决方案。 从日志、指标和正常运行时间到性能监控甚至安全&#xff0c;Elastic Stack 已成为满足几乎所有监控需求的一体化解决方案。 Elasticsearch 通过提供强大的分析引擎来处理任何类型的数据&#xff0c;成为这方面的基…

全新Facebook养号指南,怎么做才能不被封号?

最近听很多跨境电商小伙伴们说 Facebook 又被封号了&#xff0c;可能是你的 Facebook 账号还不够稳定&#xff0c;或者说还没有足够的粉丝和互动。如果你想让自己的 Facebook 账号更加稳定&#xff0c;就需要养号。俗话说&#xff0c;一封回到解放前&#xff0c;为什么你明明有…

操作系统重装

一、老毛桃装机 随着时间的推移&#xff0c;笔记本电脑难免会变得越来越慢&#xff0c;甚至出现系统错误和崩溃等问题。这时候&#xff0c;重装系统可能是最好的解决方案。然而&#xff0c;对于大多数人来说&#xff0c;笔记本电脑重装系统可能会让他们感到无从下手。不要担心&…

软件工程--设计工程--学习笔记(软件设计原则、软件质量属性设计、架构风格......)

软件设计在软件工程中处于技术核心&#xff0c;其目的是把需求分析模型转变为设计模型&#xff0c;以知道软件的实现&#xff0c;本章讲解软件设计的基本原则和基本实践 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 软件设计概述 软件设计分为两个阶段&#xff0…

读取spring boot项目resource目录下的文件

背景 项目开发过程中&#xff0c;有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如&#xff1a; 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下&#xff0c;打包在jar包中&#xff0c;不能直接通过File路径读取。下面介绍两种读…

孩子还是有一颗网安梦——Bandit通关教程:Level 16 → Level 17

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

认识YAML和Propertis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

深度学习 Day21——J1ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

Qt中多线程使用案列

Qt中多线程下载大文件 #pragma once#include <QWidget> #include <QPushButton> #include "ThreadPool.h" #include <QProgressBar> #include <QLabel> #include <QHBoxLayout> #include <QVBoxLayout> class MainWindow : pub…

el-table 实现行拖拽排序

element ui 表格实现拖拽排序的功能&#xff0c;可以借助第三方插件Sortablejs来实现。 引入sortablejs npm install sortablejs --save组件中使用 import Sortable from sortablejs;<el-table ref"el-table":data"listData" row-key"id" …

【C++】new 和 delete

目录 一 引言 二 new 三 delete 四 new和delete操作自定义类型 五 operator new与operator delete函数 六 new和delete的实现原理 1 内置类型 2 自定义类型 1 new的原理 2 delete的原理 3 new T[N]的原理 4 delete[]的原理 七 定位new表达式(placement-new) 八 …

如何使用Docker搭建青龙面板并结合内网穿透工具发布至公网可访问

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 正文…

期货高低板(期货价格飘升,市场掀起高低潮流)

什么是期货高低板&#xff1f; 期货是由交易所统一交易的标准化合约&#xff0c;商品的价格是通过供求关系来决定的。高低板则是期货交易中的常见现象&#xff0c;它表示了在交易过程中&#xff0c;价格波动超过了可设定的最高或最低价&#xff0c;于是交易系统便会出现高板或…