【连载】 FPGA Verilog HDL 系列实例--------直流电机PWM控制
Verilog HDL 之 直流电机PWM控制
一、实验前知识准备
在上一篇中总结了步进电机的控制,这次我将学习一下直流电机的控制,首先,我们简要了解下步进电机和直流电机的区别。
(1)步进电机是以步阶方式分段移动,直流电机通常采用连续移动的控制方式。
(2)步进电机采用直接控制方式,它的主要命令和控制变量都是步阶位置;直流电机则是以电机电压为控制变量,以位置或速度为命令变量。
(3)直流电机需要反馈控制系统,他会以间接方式控制电机位置。步进电机系统多半以“开环方式”进行操作。
1、什么是直流电机
输出或输入为直流电能的旋转电机,称为直流电机,它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
2、什么是PWM
PWM(脉冲宽度调制)是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
3、开发平台中直流电机驱动的实现
开发板中的直流电机的驱动部分如图1.1所示。利用FPGA设计一个0、1组成的双极性PWM发生器。
图1.1 直流电机的驱动部电路
二、实验平台
Quartus II 7.2 集成开发环境、SOPC-MBoard板、ByteBlaster II 下载电缆
三、实验目标
1、了解直流电机PWM的控制方法。
2、具有调速功能。
四、实验实现
详细实现步骤请参考 【连载】 FPGA Verilog HDL 系列实例--------8-3编码器
1、在设计文件中输入Verilog代码。
1 //--------------------------------------------------------------------------------------------------
2 // Title : pwm
3 // Author : liwei
4 // Generated : Thu Jun 16 22:30:12 2005
5 //-------------------------------------------------------------------------------------------------
6 `timescale 1ns / 1ps
7
8 module pwm ( enable , rst , Dir , clk , spd_sel , MA );
9
10 input rst ;
11 input clk ;
12 input enable ; //控制开关
13 input Dir ; //控制方向
14 input [1:0] spd_sel ; //控制转速
15
16 output [1:0] MA ; //电机控制
17
18 reg [15:0] cntReg;
19 reg [15:0] cnt;
20 reg [15:0] cnt_r;
21 reg pulseout;
22 reg [1:0]MA_r ;
23
24 parameter period = 'd10000;
25 assign MA = MA_r ;
26
27 always @ (posedge clk or negedge rst )
28
29 begin
30 if ( !rst) //复位
31 begin
32 cntReg <=#1 16'b0;
33 cnt <= #1 16'b0;
34 pulseout <= #1 1'b0;
35 end
36 else
37 if (enable == 1'b0) MA_r <= 2'b00;
38 else
39 begin
40 MA_r[0] <= pulseout ;
41 MA_r[1] <= ~pulseout;
42
43 if (Dir == 1'b1) cntReg <= cnt_r ;
44 else if (Dir == 1'b0) cntReg <= period - cnt_r ;
45
46 cnt <= cnt +1 ;
47 if (cnt ==cntReg-1) pulseout <= #1 1'b1; //设定周期时间的一半
48 else if (cnt == period-1) //设定的周期时间
49 begin
50 pulseout <= #1 1'b0;
51 cnt <= #1 'b0;
52 end
53 end
54 end
55
56 always @ ( spd_sel )
57 begin
58 case (spd_sel)
59 2'b00 : cnt_r <= period-'d3500 ;
60 2'b01 : cnt_r <= period-'d2500 ;
61 2'b10 : cnt_r <= period-'d1750 ;
62 2'b11 : cnt_r <= period-'d1000 ;
63 endcase
64 end
65
66 endmodule
2、分析
思考:(1)如何控制顺时针转和逆时针转?(2)速度的大小如何控制的?
第38行~第53行:由2个引脚控制生成双极性PWM发生器。
结论:
(1)以MA_r[0]为准,当状态0的时间大于状态1的时间时,电机逆时针转动;反之,电机顺时针转动。
那且看上面代码中是如何控制状态0的时间和状态1的时间长短的。不难看出,时间长短是由方向变量Dir(第43、44行)和预设值cnt_r(第59行~第62行)决定。可以好好体会一下。
(2)速度的快慢是由占空比决定的,占空比越大,速度越快。当然,这里指的是比值大于1。
占空比是如何确定的呢?这是由第59行~第62行中的数值确定的,这些数值可以自己定义,但必须在0~10000之间,这里所说的占空比是指不小于的值,当数值设置为5000时,就会得到最慢的速度了。
3、由设计文件生成的.bsf文件,其外接接口如图1.2所示。
图1.2 外接接口图
4、引脚分配
enable接按键,控制开关;rst接复位信号;Dir接按键,控制转动方向;clk接系统时钟;spd_sel接2个按键,调节转动速度;MA接直流电机。
5、实验结果
通过拨动开关控制开关、转速、方向。
有兴趣的可以和上一篇进行对比,加深印象。 【连载】 FPGA Verilog HDL 系列实例--------步进电机驱动控制