⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.vhd

📁 两路电机CPLD控制,串口通信
💻 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 + -