赞
踩
目录
本次实验使用的电机驱动电路如下图所示:
图1 直流电机H桥驱动电路
图2 锁存器
如图1所示,当PWM1为高电平时,PWM2为低电平时,Q2和Q4导通,Q3和Q5不导通。当PWM1为低电平时,PWM2为高电平时,Q2和Q4不导通,Q3和Q5导通。两种情况电机转动的方向不一样。
2. 调速度
电机的速度是通过PWM调节,所谓PWM就是脉宽调制器,通过调制器给电机提供一个具有一定频率的脉冲宽度可调的脉冲电。脉冲宽度越大即占空比越大,提供给电机的平均电压越大,电机转速就高。反之脉冲宽度越小,则占空比越越小。提供给电机的平均电压越小,电机转速就低。
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 实 验箱上控制直流电机。
基本流程为创建项目、创建Verilog文件、写代码、进行波形仿真、画出电路图、设置管脚和三态、烧录文件。前面的项目创建等等基本操作我就不去做演示了,下面主要去讲原理和代码。
这个模块是对输入信号的频率去进行分频处理,分出的频率是满足电动机所需的频率即可。代码如下,很显然,这个是一个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
下面代码是用于设计直流电动机转向选择的代码,供大家参考一下。
- 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
直流电动机可以通过不同的按键来去设置其转向、转速等等内容,这里我主要去讲如何去控制转速问题。
对于电动机转速的理解,我们可以理解成日常生活当中的骑电动车,我们骑电动车的时候并不是一直在加油的,而是加油一定时间之后就让电动车自己利益惯性滑行,然后慢下来再去加油。同样的,直流电动机也是通过这样的方式去调档,输入高电平表示通电(也就是加油),低电平就不通电(此时惯性滑行),如果在一个周期内,高电平占比为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
写好了Verilog代码,就进行分析错误,分析无误后,我们就对这些代码生成子模块文件。然后就创建block文件开始连接电路图,电路图以及管脚配置如下:
弄好了之后就是最后一步操作了,把没用到的管脚设置三态,然后烧录文件。
点击Assignment, Device
然后点击这里,设置管脚状态。
选择第一个就行了,就是把多余的管脚设置三态。
最后点击此处进行烧录。
这里我们会看到,下面有一个芯片,这个也就是我们写好了的sof文件,然后就是通过你的电脑接口去连接到开发板,如果你看到上面有一个No Hardware的时候,你点击旁边的按钮进行接口设置,设置为USB接口即可(USB线连接了你的开发板就会自动显示出来的)。最后点击start就可以进行烧录了。
以上就是本期的全部内容了,我们下次见!
分享一张壁纸:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。