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;
	initial
		begin
			cnt<=0;
			outclk<=0;
		end
	always @(posedge inclk)
		begin
			cnt<=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)         
begin
	if(pwm_en)
		counter <= counter + 1'b1;
end
always @(posedge clk)      
begin
	if (pwm_en & (counter[15:12] <= duty_cycle))
		pwm_out <= 1'b1;
	else
		pwm_out <= 1'b0;
end

Endmodule

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)
begin
	begin
		dout1 <= {k1,k2,k3};
		dout2 <= dout1;
		dout3 <= dout2;
	end	
end  

//按键边沿检测部分 
always @(posedge clk)
begin
	buff <= dout1 | dout2 | dout3;
	key_edge = ~(dout1 | dout2 | dout3) & buff;
	if(key_edge[0])	//按键1;K3,控制占空比
		begin
			duty_cycle <= duty_cycle + 1'b1;
			if(duty_cycle==8)
				duty_cycle<=1;
		end
	if(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就可以进行烧录了。 

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

分享一张壁纸:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL glLineWidth失效问题

文章目录 一、问题描述二、解决方法 一、问题描述 之前在使用OpenGL时&#xff0c;突然发现glLineWidth失效了&#xff0c;也就是怎么设置线宽都没反应&#xff0c;也使用了一些方法检测了自己的电脑是否支持线宽&#xff08;其实大部分电脑都支持&#xff09;&#xff0c;最后…

IgH调试注意事项

1&#xff0c;不要在虚拟机测试&#xff0c;否则IgH无法收发数据包 现象&#xff1a;虚拟机中运行IgH master并绑定网卡后&#xff0c;主站由ORPHANED状态转换成IDLE状态&#xff0c;但无法收发数据报。 这是因为虚拟机用的是虚拟网卡&#xff0c;需通过iptables将数据包到转…

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

WSL移动ubuntu到其他盘的几个问题以及安装,使用过程中遇到bug记录

这里写目录标题 无法正常修改Ubuntu系统的默认用户解决方案1&#xff1a;解决方案2&#xff1a; 出现 id xxx no such userGUI不能正常显示 无法正常修改Ubuntu系统的默认用户 ubuntu移动到其他盘可以参考WSL Ubuntu子系统迁移到非系统盘 下面问题是我安装时遇到的&#xff0c…

蓝桥杯c/c++程序设计——接龙数组

问题描述 对于一个长度为 K的整数数列&#xff1a;A1,A2,...,AK我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1的末位数字 (2≤i≤K)。 例如 12,23,35,56,61,1112,23,35,56,61,11 是接龙数列&#xff1b;12,23,34,5612,23,34,56 不是接龙数列&#xff0c;因为 56 的…

蓝桥杯:日期问题

目录 引言一、日期问题1.题目描述2.代码实现3.测试 二、回文日期1.题目描述2.代码实现3.测试 引言 关于这个蓝桥杯的日期问题&#xff0c;其实有一个明确的思路就感觉很简单&#xff0c;这个思路就是不用依照日期的顺序去把每一天走完&#xff0c;而是根据一个数加一&#xff…

生成模型 | 三维重建(3D reconstruction)调研及总结【20231219更新版】

本文是关于三维重建的论文调研&#xff0c;主要集中于基于图片到3d的模型&#xff0c;其中期刊会议标志如下&#xff1a; [&#x1f916; ICCV 2023 ] 1.3D综述系列 2019_Image-based 3D Object Reconstruction: State-of-the-Art and Trends in the Deep Learning Era 论文地…

树莓派,opencv,Picamera2利用舵机云台追踪人脸(PID控制)

一、需要准备的硬件 Raspiberry 4b两个SG90 180度舵机&#xff08;注意舵机的角度&#xff0c;最好是180度且带限位的&#xff0c;切勿选360度舵机&#xff09;二自由度舵机云台&#xff08;如下图&#xff09;Raspiberry CSI 摄像头 组装后的效果&#xff1a; 二、项目目标…

【K8s】4# 使用kuboard部署开源项目实战

文章目录 1.开源项目2.实战2.1.创建spring-blade命名空间2.2.导入 spring-blade 到 K8S 名称空间2.3.设置存储卷参数2.4.调整节点端口2.5.确认导入2.6.查看集群2.7.导入配置到 nacos2.8.启动微服务工作负载 3.验证部署结果3.1.Nacos3.2. web 4.问题汇总Q1&#xff1a;Nacos启动…

Blender插件-The Grove 10 树木生长动画植物插件

注意&#xff1a;Blender和The Grove的版本匹配。 亲测Blender 2.9与The Grove 10可以配合使用&#xff0c;Blender 3.6会报错&#xff0c;具体看报错记录。 一、下载 CG咖官网地址&#xff1a; Blender插件-树木生长插件植物生成插件 The Grove 10插件资产库 CSDN下载地址…

EasyExcel使用: RGB字体,RGB背景颜色,fillForegroundColor颜色对照表

EasyExcel使用: RGB字体&#xff0c;RGB背景颜色&#xff0c;fillForegroundColor颜色对照表 使用EasyExcel导出表格可能会对字体颜色和单元格背景颜色进行自定义的修改。 可以自定义字体颜色或者每个单元格的颜色 要想自定义颜色&#xff0c;需要重写CellWriteHandler接口&am…

gem5 garnet l1 l2 cache的创建与相连

gem5 garnet l1 l2 cache的创建与相连 主要就是这个图&#xff1a; 细节 我们用的是gem5/configs/deprecated/example/fs.py #fs.py 引入了上两层路径&#xff0c;也就是当前可以看到 gem5/configs/路径。 addToPath("../../")#fs.py引入了gem5/configs/ruby/Ru…

Spring Boot集成RocketMQ之消息对象序列化

以下源码基于rocketmq-spring-boot-start 2.1.1版本&#xff0c;其它版本可能会有差异 一. 前言 当我们在Spring Boot项目中集成RocketMQ后&#xff0c;只需要在配置文件(application.yml)中添加rocketmq的相关配置&#xff0c;即可使用rocketMQTemplate发送对象消息。登录Ro…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

1.使用 Blazor 利用 ASP.NET Core 生成第一个 Web 应用

参考 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/create 1.使用vs2022创建新项目 选择 C# -> Windows -> Blzxor Server 应用模板 2.项目名称BlazorApp下一步 3.选择 .NET6.0 或 .NET7.0 或 .NET8.0 创建 4.运行BlazorApp 5.全部选择是。 信…

【CF闯关练习】—— 800分段

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

基于西门子博途电机运行时间的先起先停控制

这是我同事在2019年做的一个功能&#xff0c;基于这个功能&#xff0c;可以形成类似的其他更多的功能&#xff0c;这些功能在一些项目上的实用性还是比较强&#xff01; 1&#xff0c;控制目标博途工控人平时在哪里技术交流博途工控人社群 根据需要启动电机的数量&#xff0c…

PhysX——源码编译

从git下载源码 git主页 https://github.com/NVIDIA-Omniverse/PhysXclone地址 https://github.com/NVIDIA-Omniverse/PhysX.git源码编译 运行PhysX需要两个编译器的支持&#xff0c;CMake 3.12 或以上版本以及Python 2.7.6 版本 进入工程的 physx 目录&#xff0c;运行generate…

案例109:基于微信小程序的高校寻物平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

KubePi JWT 默认密钥权限绕过漏洞复现(CVE-2023-22463)

0x01 产品简介 KubePi 是一款简单易用的开源 Kubernetes 可视化管理面板。 0x02 漏洞概述 KubePi 存在权限绕过漏洞,攻击者可通过默认 JWT 密钥获取管理员权限控制整个平台,使用管理员权限操作核心的功能。 0x03 影响范围 KubePi <= 1.6.2 0x04 复现环境 FOFA: ti…