USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_Arith.ALL;
USE IEEE.STD_LOGIC_Unsigned.ALL;
ENTITY pwm_logic IS
PORT(
clock_48M: IN STD_LOGIC; --系统输入时钟
duty_cycle: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
pwm_en: IN STD_LOGIC; --PWM使能.
pwm_out: OUT STD_LOGIC --PWM输出
);
END;
ARCHITECTURE one OF pwm_logic IS
SIGNAL pwm_out_io: STD_LOGIC; --PWM输出
SIGNAL count: STD_LOGIC_VECTOR(7 DOWNTO 0);--PWM内部计数器(仿真)
BEGIN
pwm_out<=pwm_out_io;
PROCESS(clock_48M)
BEGIN
IF RISING_EDGE(clock_48M) THEN
IF pwm_en ='1' THEN
count<=count+1;
END IF;
END IF;
END PROCESS;
PROCESS(clock_48M)
BEGIN
IF RISING_EDGE(clock_48M) THEN
IF pwm_en ='1' AND count(7 DOWNTO 4)<=duty_cycle THEN--(仿真)
pwm_out_io<='1';
ELSE
pwm_out_io<='0';
END IF;
END IF;
END PROCESS;
END ;
(3)VHDL程序分析
该程序中有三个输入端,分别是clock_48M、duty_cycle[3..0]、pwm_en,其中clock_48M是接系统时钟端;duty_cycle[3..0]是输入的固定四位二进制数,由电机控制模块产生;pwm_en是该模块的使能控制端,也是由电机控制模块产生。该程序还有一个输出端,即pwm_out,该端口输出PWM控制的输出波形,可以根据不同的输入的四位二进制数duty_cycle[3..0],来产生具有不同占空比的PWM波形。
(4)仿真波形及分析
仿真时选择duty_cycle[3..0]=0110(即十进制的6),由程序中的这段代码:
IF pwm_en =’1’ AND count(7 DOWNTO 4)<=duty_cycle THEN
pwm_out_io<=’1’;
ELSE
pwm_out_io<=’0’;
可以看出,当输入的duty_cycle[3..0]=0110且pwm_en=1时,如果满足count[7..4]<=0110,就把pwm_out_io赋值为高电平,也就是说count正常计数从00000000到01101111都满足这个条件,此时输出pwm_out为高电平,其余时刻(即count从01110000到11111111)都输出低电平。此时的占空比的计算如下:
count总共是8位二进制数,总数为28=256,而高电平占据了从00000000到01101111,共112个数据,占空比为112/256=0.4375
duty_cycle[3..0]=0110且pwm_en=1时的仿真波形如下:
图4.3 脉宽调制仿真波形
Fig.4.3 Pulse width modulation simulation waveform
由仿真波形可以看出,一个PWM波形周期中,周期为2.56ns,其中高电平占据时间为1.12ns,占空比为1.12/2.56=0.4375,跟理论分析值一致。
4.4.2 电机控制模块
(1)生成的功能模块图
图4.4 电机控制功能模块图
Fig.4.4 Motor control function module chart
(2)电机控制的VHDL编程
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; 基于EDA开发平台的红外遥控电机转速电路设计(8):http://www.youerw.com/tongxin/lunwen_9829.html