该程序中有三个输入端,分别是clock_48M、key[2..0]、pwm_in,其中clock_48M是接系统时钟端;key[2..0]是开关控制输入端,其中开关1控制电机的加速,开关2控制电机的启动或停止,开关3控制电机的正反转;pwm_in是PWM产生的波形在这一模块的输入,接在脉宽调制模块的pwm_out端。该程序还有五个输出端,即pwm_en、duty_cycle[3..0]、motora、motorb、led[4..0],其中pwm_en是输出使能信号,以便控制电机的启动和停止,接在脉宽调制模块的使能端,从而达到控制pwm_out的波形信号,进而控制本模块的motora、motorb输出信号,也就控制了电机的启动和停止;duty_cycle[3..0]是由开关1直接控制的,当开关1打开时,duty_cycle的值依次加1,从而控制脉宽调制模块的输出占空比;motora、motorb是输出信号电平信号加载到直流电机两端的控制端口;led[4..0]是输出显示。
(4)仿真波形及分析
图4.5 电机控制仿真波形
Fig.4.5 Motor control simulation waveform
由仿真波形可以看出,在给定pwm_in固定输入的情况下,当开关3打开、开关1和开关2关闭时,duty_cycle不变,且pwm_en输出为0;当开关1和开关3打开、开关2关闭时,duty_cycle依次增加,pwm_en输出仍为0;当开关1、开关2、开关3同时打开时,此时,duty_cycle依次增加,pwm_en输出为1。因为设计满足了开关1控制电机的加速,开关2控制电机的启动或停止,开关3控制电机的正反转。
4.4.3 消抖模块
(1)生成的功能模块图
图4.6 消抖功能模块图
Fig.4.6 Debounce function module chart
(2)消抖模块的VHDL编程
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY filter_200us IS
PORT(
clk,in_bit: IN STD_LOGIC;
out_bit: OUT STD_LOGIC
);
END;
ARCHITECTURE one OF filter_200us IS
SIGNAL cnt:STD_LOGIC_VECTOR(19 DOWNTO 0);
SIGNAL out_bit_r:STD_LOGIC;
BEGIN
out_bit<=out_bit_r;
PROCESS(clk)
BEGIN
IF RISING_EDGE(clk) THEN
IF in_bit ='1' THEN --一旦出现高电平即复位计数器
cnt <=X"00000"; --清0计数器
out_bit_r <='1'; --输出置1
ELSE
IF cnt>=9600 THEN --clk=48M 约为200us
out_bit_r<='0'; --低电平宽度大于200us时输出低电平.
ELSE --低电平宽度小于200us时输出高电平.
cnt<=cnt+1; --计数器累加
out_bit_r<='1';
END IF;
END IF;
END IF;
END PROCESS;
END;
(3)VHDL程序分析
该程序主要实现消抖功能,原因是红外光电电路测得的转速脉冲信号没经过整形,所以存在很多干扰脉冲,如果直接对其计数,则测得的结果不正确,因此在本设计中加入了消抖模块filter_200us。 基于EDA开发平台的红外遥控电机转速电路设计(10):http://www.youerw.com/tongxin/lunwen_9829.html