Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chap. 18 라인 트레이서의 설계 라인 트레이서 바닥에 그려진 선을 따라가는 로봇을 의미 라인 트레이서 구성도

Similar presentations


Presentation on theme: "Chap. 18 라인 트레이서의 설계 라인 트레이서 바닥에 그려진 선을 따라가는 로봇을 의미 라인 트레이서 구성도"— Presentation transcript:

1 Chap. 18 라인 트레이서의 설계 라인 트레이서 바닥에 그려진 선을 따라가는 로봇을 의미 라인 트레이서 구성도
(선을 잘 따라가도록 판단 및 제어) (바퀴를 굴려줌) (선 감지)

2 라인 트레이서의 설계 - 개념도 라인 트레이서 VHDL 코드 작성 개념도

3 라인 트레이서의 설계 - Design 센서 데이터에 따른 좌,우 모터 속도 결정 센서 데이터 (중앙의 5비트)
좌, 우 모터 속도 (11:320Hz, 10:200Hz, 01:100Hz, 00:정지) 비고 11011 11 빠른 직진 10001 01 느린 직진 10011 10 느린 우회전 10111 빠른 우회전 00011 00111 01111 11001 느린 좌회전 11101 빠른 좌회전 11000 11100 11110 그 외 00 정지

4 라인 트레이서의 설계 - Design library IEEE; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity line_tracer is     Port ( RSTB : in std_logic;            CLK_4M : in std_logic;            SENSE : in std_logic_vector(6 downto 0);            LIGHT : out std_logic_vector(6 downto 0);            MTL_A : out std_logic;            MTL_B : out std_logic;            MTL_nA : out std_logic;            MTL_nB : out std_logic;            MTR_A : out std_logic;            MTR_B : out std_logic;            MTR_nA : out std_logic;            MTR_nB : out std_logic); end line_tracer; architecture Behavioral of line_tracer is signal clk_500 : std_logic; signal mtl_speed : std_logic_vector (1 downto 0); signal mtr_speed : std_logic_vector (1 downto 0); signal speed_l : integer range 0 to 25000; signal speed_r : integer range 0 to 25000; signal motor_lcnt : integer range 0 to 25000; signal phase_lclk : std_logic; signal motor_rcnt : integer range 0 to 25000; signal phase_rclk : std_logic; signal phase_lcnt : std_logic_vector (1 downto 0); signal phase_lout : std_logic_vector (3 downto 0); signal phase_rcnt : std_logic_vector (1 downto 0); signal phase_rout : std_logic_vector (3 downto 0); begin =========Clock(500Hz)Generator===================         process(RSTB,CLK_4M)         variable cnt : integer range 0 to 4000;         begin                 if RSTB = '0' then                         cnt := 0;                         clk_500 <= '0';                 elsif rising_edge (CLK_4M) then                         if cnt >= 3999  then       --정상 동작시 --                    if cnt >= 2  then         --시뮬레이션시                                 clk_500 <= not clk_500;                         else                                 cnt := cnt + 1;                         end if;                 end if;         end process; ============================================= 

5 라인 트레이서의 설계 - Design --========== Infrared Light Emission ===========
        LIGHT(0) <= clk_500 ;         LIGHT(1) <= clk_500 ;         LIGHT(2) <= clk_500 ;         LIGHT(3) <= clk_500 ;         LIGHT(4) <= clk_500 ;         LIGHT(5) <= clk_500 ;         LIGHT(6) <= clk_500 ; --========================================= --=== Line Status Sensing & 좌,우 모터 속도값  결정 =====    process(RSTB,CLK_500)    begin        if RSTB = '0' then           mtl_speed <="00";  mtr_speed <="00";   -- 느린 직진        elsif falling_edge (CLK_500) then           case SENSE is           when " " => mtl_speed <="11";                                    mtr_speed <="11"; -- 빠른직진           when " " => mtl_speed <="01";                                  mtr_speed <="01"; -- 느린직진           when " " => mtl_speed <="11";                                mtr_speed <="10"; -- 느린우회전   when " " => mtl_speed <="11";                                  mtr_speed <="01"; -- 빠른우회전           when " " => mtl_speed <="11";                                     mtr_speed <="01"; -- 빠른우회전 when " " => mtl_speed <="11";                                   mtr_speed <="01"; -- 빠른우회전      when " " => mtl_speed <="10";                                   mtr_speed <="11"; -- 느린좌회전      when " " => mtl_speed <="01";                                   mtr_speed <="11"; -- 빠른좌회전      when " " => mtl_speed <="01";      when " " => mtl_speed <="01";      when " " => mtl_speed <="01";      when others => mtl_speed <="00";                               mtr_speed <="00";       -- 정지      end case;  end if; end process;

6 라인 트레이서의 설계 - Design ==== 모터속도값에 따른 좌,우모터 속도결정 ==== process(mtl_speed)
==== 모터속도값에 따른 좌,우모터 속도결정  ====         process(mtl_speed)         variable for_sim : std_logic;         begin                 for_sim := '0';  -- 1: 시뮬레이션시 0:정상동작시                 if for_sim = '0'  then                     case mtl_speed is         when "00" => speed_l <= 0; Hz when "01" => speed_l <= 19999;-- 100Hz           when "10" => speed_l <= 9999; Hz when "11" => speed_l <= 6249; -- 320Hz                     when others => speed_l <= 6249;                     end case;                 else                    when "00" => speed_l <= 0 ; when "01" => speed_l <= 8;                         when "10" => speed_l <= 4; when "11" => speed_l <= 2;                         when others => speed_l <= 2;                      end case;                 end if;         end process;          process(mtr_speed) variable for_sim : std_logic; begin       for_sim := '0';  -- 1: 시뮬레이션시 0:정상동작시       if for_sim = '0'  then            case mtr_speed is             when "00" => speed_r <= 0; -- 0 Hz when "01" => speed_r <= 19999;-- 100Hz                 when "10" => speed_r <= 9999; Hz                 when "11" => speed_r <= 6249; -- 320Hz                 when others => speed_r <= 6249; --320Hz               end case;          else                case mtr_speed is                     when "00" => speed_r <= 0;                        when "01" => speed_r <= 8;                     when "10" => speed_r <= 4;                     when "11" => speed_r <= 2;                          when others => speed_r <= 2;                 end case;           end if; end process;

7 라인 트레이서의 설계 - Design process(RSTB,speed_l, CLK_4M,motor_lcnt) begin
       if RSTB = '0' or speed_l = 0 then            motor_lcnt <= 0;            phase_lclk <= '0';         elsif rising_edge (CLK_4M) then              if (motor_lcnt >= speed_l) then                   motor_lcnt <= 0;                   phase_lclk <= not phase_lclk;               else                   motor_lcnt <= motor_lcnt + 1;               end if;         end if; end process; process(RSTB,speed_r, CLK_4M,motor_rcnt)        if RSTB = '0' or speed_r = 0 then          motor_rcnt <= 0;           phase_rclk <= '0';        elsif rising_edge (CLK_4M) then             if (motor_rcnt >= speed_r) then                  motor_rcnt <= 0;                  phase_rclk <= not phase_rclk;              else                  motor_rcnt <= motor_rcnt + 1;             end if;        end if; --===================================== --===== 왼쪽 모터 phase Output(1상 여자방식) ======  process(RSTB,phase_lclk,phase_lcnt)  begin           if RSTB = '0' then               phase_lcnt <= (others => '0');           elsif rising_edge (phase_lclk) then                   phase_lcnt <= phase_lcnt + 1;            end if; end process; process(RSTB, phase_lcnt) begin        if RSTB = '0' then           phase_lout <= (others => '0');        else             case phase_lcnt is                  when "00" => phase_lout <= "1000";                  when "01" => phase_lout <= "0100";                  when "10" => phase_lout <= "0010";                  when "11" => phase_lout <= "0001";                  when others => phase_lout <= "0000";               end case;         end if;  end process; --===========================

8 --==========================================
라인 트레이서의 설계 - Design --====== 오른쪽 Phase Output(1상 여자방식) ========= process(RSTB,phase_rclk,phase_rcnt) begin       if RSTB = '0' then        phase_rcnt <= (others => '0');      elsif rising_edge (phase_rclk) then             phase_rcnt <= phase_rcnt + 1;      end if; end process; process(RSTB, phase_rcnt) begin         if RSTB = '0' then           phase_rout <= (others => '0');         else             case phase_rcnt is                  when "00" => phase_rout <= "0001";                  when "01" => phase_rout <= "0010";                  when "10" => phase_rout <= "0100";                  when "11" => phase_rout <= "1000";                  when others => phase_rout <= "0000";               end case;           end if; --========================================== MTL_A <= phase_lout(0);         MTL_B <= phase_lout(1);         MTL_nA <= phase_lout(2);         MTL_nB <= phase_lout(3);         MTR_A <= phase_rout(0);         MTR_B <= phase_rout(1);         MTR_nA <= phase_rout(2);         MTR_nB <= phase_rout(3); end Behavioral;

9 라인 트레이서의 설계 - Simulation
라인 트레이서의 시뮬레이션 결과 파형 화면


Download ppt "Chap. 18 라인 트레이서의 설계 라인 트레이서 바닥에 그려진 선을 따라가는 로봇을 의미 라인 트레이서 구성도"

Similar presentations


Ads by Google