📄 pwm.vhd
字号:
---- 本模块的功能是验证实现和PC机进行基本的串口通信的功能。需要在--PC机上安装一个串口调试工具来验证程序的功能。-- 程序实现了一个收发一帧10个bit(即无奇偶校验位)的串口控--制器,10个bit是1位起始位,8个数据位,1个结束--位。串口的波特律由程序中定义的div_par参数决定,更改该参数可以实--现相应的波特率。程序当前设定的div_par 的值是0x104,对应的波特率是--9600。用一个8倍波特率的时钟将接受每一位bit的周期时间--划分为8个时隙以使通信同步.--字符串(串口调试工具设成按ASCII码接受方式);PC可随时向CPLD发送0-F的十六进制--数据,CPLD接受后显示在7段数码管上。library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY PWM IS PORT ( clk : IN std_logic; width_word : IN std_logic_vector(6 DOWNTO 0);--width_word为0的时候方向盘最左,为63(换成十进制候)正中,为127时最右 to_servo : OUT std_logic ); END PWM;ARCHITECTURE arch OF PWM IS --//////////////////inner reg//////////////////// SIGNAL div_reg : std_logic_vector(6 DOWNTO 0);--分频计数器,分频值由脉宽步进决定。分频后得到clk_servo时钟,周期为步进脉宽 SIGNAL clk_servo : std_logic; --步进电机时钟 SIGNAL div_reg_pwm : std_logic_vector(11 DOWNTO 0); --////////////////////////////////////////////// CONSTANT div_par : std_logic_vector(6 DOWNTO 0) := "1111101"; --分频参数,产生脉宽步进时钟,也就是说产生的时钟周期为脉宽步进6.25us BEGIN PROCESS(clk) BEGIN IF(clk'EVENT AND clk='1')THEN IF (div_reg = div_par - "0000001") THEN div_reg <= "0000000"; clk_servo<= NOT clk_servo; --得到6.25us步进时钟 ELSE div_reg <= div_reg + "0000001"; END IF; END IF; END PROCESS; PROCESS(clk_servo) BEGIN IF(clk_servo'EVENT AND clk_servo='1')THEN IF div_reg_pwm = "110001111111" THEN--6.25us步进时钟3200分频得到20ms周期的锯齿波 div_reg_pwm<= "000000000000"; ELSE div_reg_pwm <= div_reg_pwm + "000000000001"; END IF ; END IF; END PROCESS; PROCESS(div_reg_pwm) BEGIN IF div_reg_pwm>="101111001101"-width_word THEN -------width_word 从"0000000"到"1111111"变化----------为"0000000"对应1120us脉宽,为"1111111"对应1920us脉宽-- to_servo<='1'; ELSE to_servo<='0'; END IF; END PROCESS;END arch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -