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

news/2024/5/19 1:01:39 标签: fpga开发, 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就可以进行烧录了。 

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

分享一张壁纸:


http://www.niftyadmin.cn/n/5277845.html

相关文章

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

【腾讯云云上实验室】用向量数据库融合AI技术:构建下一代智能客服平台

文章目录 前言为什么说用好大模型离不开向量数据库呢?AI训练中的向量维度快速检索非结构化数据的利器 --- 向量数据库AI的海马体--腾讯云向量数据库 一、腾讯云向量数据库介绍重磅组合&#xff0c;行业领先智能化能力产品亮点 二、AI技术在智能客服中的作用AI技术在智能客服平…

Python Pandas数据重塑: `stack()`,`unstack()`和`pivot()`操作(第20讲)

Python Pandas数据重塑: stack(),unstack()和pivot()操作(第20讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

如何将图片转为PDF

问题描述&#xff1a;如何将图片转为PDF&#xff0c;有时需要将纸质文档扫描成PDF&#xff0c;然后上传到网上。 解决办法&#xff1a;平时使用的方法是将图片插入到word文件中&#xff0c;然后将图片设置为浮于文字下方&#xff0c;然后调整图片的大小&#xff0c;铺满整个wo…

使用Docker部署Nexus Maven私有仓库并结合Cpolar实现远程访问

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

Databend 开源社区上榜 2023 年度 OSCHINA 优秀开源技术团队

2023 年 12 月 8 日&#xff0c;OSCHINA 对其平台上众多认证的官方技术团队和开源社区进行了全面评估&#xff0c;并颁发了“ 2023 年度优秀开源技术团队”奖项&#xff0c;以表彰各团队在推动中国开源生态系统发展方面所展现的创新能力和显著贡献。 在这一评选中&#xff0c;…

Ansible常用模块的使用

目录 1.前言 2.Shell模块 练习1&#xff1a;在server2上执行hostname命令&#xff0c;命令如下。 3.文件管理的file模块 练习1&#xff1a;在server2上创建一个文件/opt/hosts&#xff0c;并设置所有者为root&#xff0c;所属组为tom&#xff0c;权限为444&#xff0c;命令…

Apache Pulsar 技术系列 - PulsarClient 实现解析

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。同时为了达到高性能&#xff0c;低延时、高可用&#xff0c;Pulsar 在客户端也…